96单片机 天津大学 第五章 开发系统及实验
天津市教委关于公布合泰杯第九届天津市大学生单片机应用设计竞赛结果的通知
天津市教委关于公布"合泰杯"第九届天津市大学生单片机应用设计竞赛结果的通知文章属性•【制定机关】天津市教育委员会•【公布日期】2014.05.27•【字号】津教委办[2014]49号•【施行日期】2014.05.27•【效力等级】地方规范性文件•【时效性】现行有效•【主题分类】教育综合规定正文天津市教委关于公布"合泰杯"第九届天津市大学生单片机应用设计竞赛结果的通知(津教委办〔2014〕49号)各普通高等学校:为进一步推动高校教学改革的深入发展,创立高校与行业企业联合培养人才的新机制,推动基于项目实践的研究性学习,加强学生创新思维和动手能力训练,我委于2013年11月18日至2014年5月10日举办了"合泰杯"第九届天津市大学生单片机应用设计竞赛,全市共有24所高校的550个代表队报名,2000余名学生参加了竞赛。
经过初赛和决赛两个阶段共评出参赛获奖项目128个,其中一等奖6个、二等奖12个、三等奖110个,另外还有6个高校获得竞赛优秀组织奖,现将获得奖励的学校和代表队名单予以公布(见附件)。
各校要继续积极鼓励教师指导大学生学科竞赛活动,提高参赛水平,通过竞赛带动高校人才培养模式的改革和创新,提高学生的创新意识和能力,保证人才培养质量。
附件:1."合泰杯"第九届天津市大学生单片机应用设计竞赛获奖名单2."合泰杯"第九届天津市大学生单片机应用设计竞赛优秀组织奖名单2014年5月27日附件1附件2“合泰杯”第九届天津市大学生单片机应用设计竞赛优秀组织奖名单河北工业大学天津工业大学天津城建大学天津职业技术师范大学中国民航大学天津理工大学。
单片机技能与实训[宋国富][电子教案]第5-7章
项目5 –项目7
• (3)TF0:定时器T0溢出中断请求。当定时器0产生溢出时,定时 器0中断请求标志位(TCON.5)置位(由硬件自动执行),请求 中断处理。 • (4)TF1:定时器1溢出中断请求。当定时器1产生溢出时,定时 器1中断请求标志位(TCON.7)置位(由硬件自动执行),请求 中断处理。 • (5)RI或TI:串行中断请求。当接收或发送完一串行帧时,内部 串行口中断请求标志位RI(SCON.0)或TI(SCON.1)置位(由 硬件自动执行),请求中断。
图6.2 MCS-51中断系统内部结构示意图
项目5 –项目7
• 在图6.2中,与中断有关的寄存器有4个,分别为定时控制寄存器 TCON、串行控制寄存器SCON、中断允许控制寄存器IE和中断优 先级控制寄存器IP;中断源有5个,分别为外部中断请求INT0、外 部中断请求INT1、定时器0溢出中断请求T0、定时器1溢出中断请 求T1和串行中断请求RI或TI。5个中断源的排列顺序由中断优先级 控制寄存器IP和顺序查询逻辑电路共同决定。 6.2.2 中断源和中断控制 1、MCS-51中断源的功能 MCS-51的5个中断源,其具体功能分别如下: (1)INT 0 :外部中断0请求,由P3.2脚输入。通过IT0脚(TCON.0) 来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向 CPU申请中断,并建立IE0标志。 (2)INT 1 :外部中断1请求,由P3.3脚输入。通过IT1脚TCON.2) 来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向 CPU申请中断,并建立IE1标志。
项目5 –项目7
• 3、译码法 • 所谓译码法就是使用译码器的输出作为存储器芯片的片选信号。常 用的译码器有74LS138、74LS139、74LS154等。 • 译码法将系统低位地址总线直接连至各芯片的地址线,将系统高位 地址总线经地址译码器译码后作为各芯片的片选信号。一般使用 2/4译码器、3/8译码器。
天津大学本科教学进程安排(自动化学院-自动化专业)
时
学 学 学 学 1 2短 1 2短 1 2短 1 2
课程设计
11 440 4 412 24
必 电子课程设计
2030137
2 80
56 24
2
必 电工电子综合课程设计 2030396
2 80 4 76
2
集
必 选 选
微运机动原 控理制课系程统设专计业综合 实过验程控制系统综合实验
2030358 2030452 2030453
1 16 16
1
必 择业指导
5100060
1 24 8
16
1
选 法律、经管、社会
2 32 32
选 环境、心理、健康
2 32 32
选 文学、历史、哲学
2 32 32
选 艺术 小计
2 32 32 40.5 752 695
256
97
7. 5
8
76
24
11
外语课程12学分(必修:英语读写译+英语口语+英语听力,选修:翻译、商务英语、英美文化、影视欣赏四选
化学
2100060 2100063 2100067
2100095 2100096 2100346 2100347
1 16 16
2 32 32
2 32 32
10 182 131 51
4 64 64
4 64 64
1 27 3 24
1 27
27
1 2 2
4 4 2 2
选 大学化学1
21003522 3Biblioteka 32自动化专业教学进程安排
一、人文与社会科学类
课课 别 程质 程
类性
课程名称
课程编号
学 分
天津大学计控理论与应用实验指导书DOC
第一章计算机控制实验系统构成及说明第一节计算机控制实验系统的构成ACCC-III实验装置图1-1计算机控制实验系统结构图图1-2计算机控制系统一般结构计算机控制实验系统由控制计算机(PC), PCI-1711数据采集卡,ACCC-III实验装置,连接电缆等组成。
其中,PCI-1711数据采集卡插在PC机主板的PCI插槽上。
ACCC-III实验装置包含了功率放大器、被动对象、传感器、输入输出接口,实验过程中所有的连线操作都在ACCC-III实验装置上完成。
第二节主要组成部分的介绍1. ACCC-III实验装置简介图1-3:计算机控制实验装置数为4>(z) = z-1,采用阻尼因子法对有限拍系统进行改进,有:令8 = /弓,得到最小拍控制器为:(U(z)_ 14>*(z)—一 E(z) 一 G(z)l — 6(z) 一 K(1 一 B)(l-zT)对式(2-3)进行Z 反变换,得到最小拍控制算法:2在控制程序中编写控制算法本实验的控制程序采用NI 公司的LabVIEW 平台开发,控制程序的大部分(包 括输入输出操作、数据流逻辑控制等)已经编好,空出了控制算法部分需要同学 们自行填写。
空出的部分位于程序框图中的Mathscript 节点,Mathscript 节点的语法与MATLAB 相似。
请同学们根据Mathscript 节点上己经定义好的输入输出变量,结合公式(2-4),填写代码。
图 2-4 Mathscript 节点Mathscript 节点的左边框上为输入变量,右边框上为输出变量。
在控制程序中,Mathscript 节点位于一个while 循环内。
每经过一个采样周期,while 循环执 行一次,Mathscript 节点便会计算一次。
While 循环执行了一次,便是系统经过 了一拍。
Mathscript 节点的计算过程为:1 - 4>*(z)1 — 4>(z) 1 — az -1,心)=孚与 (2-2)(2-3)U(k) =(l-a)[E (k)-/?E (k-l)]K(1 一幻(2-4)1, 将左侧的输入变量读进来; 2, 运行Mathscript 节点内的代码; 3, 将计算结果写入右侧的输出变量。
天津大学嵌入式系统——Blinky实验
Blinky实验一、建立Keil工程1.选择Project→New uVision Project命令,弹出Create New Project 对话框,指定工程路径并在文件名文本框中输入Blinky,如图1所示。
图12.单击“保存”按钮,弹出Select Device for Target 窗口,在左侧的列表框中选择CPU的类型(Philips的LPC2138芯片),右边对应出现该芯片的资源描述,如图2所示。
图23.单击OK按钮,出现如图3所示提示信息(是否复制启动代码到工程文件夹并添加文件到工程中)。
这里的启动代码是依据设置的编译器而生成的。
图34.单击是按钮添加启动代码,此时启动代码已经添加到工程中,左侧的Project Workspace 中显示添加的启动代码文件,双击Startup.s可查看代码,如图4所示。
图45.在工作空间中选中Target 1,单击右键从弹出菜单选择Add Group,分别添加System Calls 和 Source Code两个文件夹,然后右键从弹出菜单选择Add Files to Group“System Calls/Source Code”命令分别为其添加retarget.c和blinky.c文件,如图5所示。
图5二、进行工程配置1.在工作空间选择Target1 右键选择Options for Target‘Target1’命令,弹出对话框如图6所示,设置Xtal为8MHz。
图62.单击Output标签,再单击Create Hex File前面的单选按钮,如图7所示。
可生成hex格式可执行文件,再单击Select Folder for Objects按钮,指定输出文件路径。
图73.单击Listing标签,再单击Select Folder for Listings按钮,指定生成的list文件的输出路径,然后单击Assembler Listing和Linker Listing前面的单选按钮,如图8所示。
天津大学精密仪器与光电子工程学院
天津大学精密仪器与光电子工程学院实验教学中心单片机与嵌入式系统实验室天津大学前身为北洋大学,始建于1895年10月2日,是中国近代教育史上的第一所大学。
天津大学是以工为主,理工结合,经济、管理、人文、教育、法律、艺术等协调发展的综合性大学,素以“实事求是”校训和“严谨治学,严格教学要求”的校风享誉海内外,是国务院首批确定的全国16所重点大学之一,也是我国“211工程”及“教育振兴行动计划”重点建设的高等学校。
党和国家领导人毛泽东、周恩来、邓小平、江泽民等曾前后到我校视察工作,为天津大学的发展给予了热情关怀和大力支持。
天津大学占地面积137公顷,建筑面积100万平方米;校园绿树成荫,四大湖泊掩映其间,环境优雅;校园书馆藏书近200万册,可在线联接世界各大检索机构。
大学生活动中心造型别致、设备先进,运动场馆功能齐全,学生课余生活丰富多彩。
在人才培养过程中,学校形成了完整的学士-硕士-博士人才培养体系和普通教育与成人教育、职业技术教育相结合的教育休系,是教育部确定的国家级大学生文化素质教育基地和全国职教师资培训基地。
天津大学现有教职工4600人,教师1529人,其中教授419人,副教授662人,具有博尝学位的教师547人,两院院士9人,“长江学者奖励计划”特聘教授14人。
现有16个学院中,精密仪器与光电子工程学院的各项工作名列前茅。
天津大学精密仪器与光电子工程学院(简称精仪学院)下设精密仪器工程系、光电子信息工程系、生物医学工程与科学仪器系。
精仪学院学科建设一流,学术地位高:学院现有测试计量技术及仪器、光学工程、物理电子、精密仪器及机械、生物医学工程等5个博士点和5个硕士点,测试计量技术及仪器、光学工程2个国家级重点学科,生物医学工程市级重点学科,仪器科学与技术、光学工程、生物医学工程3个博士后流动站,5个“长江学者奖励计划”特聘教授设岗学科,精密测试技术及仪器国家重点实验室,光电信息技术科学教育部重点实验室以及现代光学研究所、光电子联合科学研究中心、传感工程研究所、照明技术研究所、光电测控技术研究所、激光与光电子技术研究所、生物光学研究所等研究开发机构。
天津大学本科教材书目
计算机软件:微型计算机技术基础冯博琴高教版IBM_PC微机原理及接口技术西交大版计算机硬件技术基础/朱卫东/高教数字逻辑电路刘常澍国防数字系统逻辑设计技术刘锡海天大计算机组织与结构-性能设计(5)电子工业计算机图形学(3)清华大学出版社,数据库系统概念(4)高等教育出版社软件工程(英文8版)机械工业出版社计算机网络高等教育出版社,C++程序设计(2)高教,软件需求管理用例方法(英文2版机械工业版实时系统高教,SQLSERVER2000与编程清华版IT项目管理机械,数据库算法与应用(C++语言描述)机械,现代操作系统(英文2版)机械,人工智能机械,信息技术与应用导论(7高教,系统分析与设计方法(5)高教,结构化计算机组成(英文4版)机械,IBM-PC汇编语言程序设计(5)清华,微型计算机原理(2)电子工业出版社,微型计算机技术与应用(3)清华,信息论与编码基础机械,计算机硬件技术基础高教,VB6.X程序设计铁道,IBMPC微机原理及接口技术西交大,面向对象与传统软件工程(5)机械,计算机软件测试(2)机械,计算机组成原理天大,编译原理吕映芝清华,微型计算机接口技术及应用华中科技大学计算机导论袁方清华,VB程序设计教程周霭如清华,微型计算机接口技术张弥左机械,LINUx操作系统,计算机组成结构化方法(英文5版)机械,微型计算机嵌入式系统设计西安电子科大数字图像处理(2)电子工业,编译技术(2)东南大学,软件人员沟通(上中下),统计自然语言处理基础机械:精密机械设计庞振基机械,机械设计基础(多学时),燃气轮机与涡轮增压内燃及原理与应用,工厂动力机械热能与动力机械测试技术热能与动力机械制造工艺学热能与动力机械基础液压传动与控制机械基础机械工程测试技术基础计算机辅助设计与制造机械制造装备及其设计现代设计方法机械设计基础(少学时)控制工程基础工程材料及成型技术基础动力控制工程供热工程热力发电厂电站锅炉原理力学:材料力学天大赵志岗,土力学原理天大王成华,结构力学高教李家宝,水力学中国建筑出版社高学平,理论力学(中、多学时)机械贾启芬,液体力学(2)高教张也影,工程流体力学高教陈卓如,水力学同济大学出版社柯葵,弹性力学(3)徐芝纶高教,结构力学(下)天大刘昭培,材料力学天大苏翼林材料:无机材料性能清华关振铎材料物理性能天大郑义,材料科学基础天大靳正国,材料分析方法天大杜希文,金属工艺学(上、下)高教邓文英,计算机在材料科学中的应用机械许欣华,材料科学基础上海交大胡赓祥,无机非金属材料专业实验天大曲远方,实用分析化学天大肖新亮,无机化学与化学分析天大颜秀如现代工程材料成型与机械制造基础高教工程材料学天大耿香月理学:工科数学分析基础(上、下)马知恩高教,大学物理通用教程(光学、力学、电磁学、热学)钟熙华北大,物理化学(2)肖衍繁天大,物理化学(4,上下)王正烈高教,工程热力学(3)曾丹苓高教,传热学赵镇南高教,有机化学(4)高鸿宾高教,有机化学简明教程高鸿宾高教,生物化学张晓渊化学工业出版社,无机化学(上、下)宋天后高教,近代物理化学(3上)朱志涌科学技术版高分子物理(修订版)何曼君复旦,化学信息学陈明旦化学工业出版社,固体物理学方俊鑫上海科学技术出版社。
简易单片机教学模块的开发
简易单片机教学模块的开发摘要:单片机技术是当前社会较为流行和热门的技术之一,社会对硬件设计工程师的需求增长相当迅速,对于高职院校该课程的重要性也越来越明显。
但是传统的教学模式使学生对单片机的学习一直局限于抽象的理论学习中,理解起来困难,学生学习兴趣不浓厚。
因此,我们设计开发了一个简易单片机教学模块,该模块将单片机课程内容以项目化的形式集成在一个模块上,有助于提高学生的学习兴趣、学习效果。
关键词:单片机教学改革教学模块高职院校单片机在当今社会的应用越来越广泛,《单片机原理与应用》课程也成为了高职院校应用电子类专业最重要的核心课程之一,是否掌握单片机系统的开发、应用,对于应用电子类专业学生的能力培养,就业有着很大的影响。
然而几十年不变的传统单片机教学模式显然已经不能适应新形势下职业教育的培养目标,在这样的形势下,我院进行了单片机课程的教学改革,在单片机课程中引入了项目化的教学模式。
然而,项目化的教学模式需要与课程内容相匹配的项目化教材、教学项目作为支撑。
本文主要介绍将单片机课程的项目内容优化集成在一个模块上的简易单片机教学模块的设计开发。
1 单片机教学模块概述我院在单片机课程中引入了项目化的教学模式,就是将教学内容划分为了几个教学项目,每个项目都体现了单片机课程学习的不同阶段,并且每个项目都有基于工作过程的课题制作,如:艺术彩灯、数字钟、温度计等。
从入门到实践到应用的教学过程能够更好的体现出单片机课程的特色,教学模式的改变使学生学习单片机课程的兴趣大大提高。
但是在教学过程中单片机课程的项目化也存在着以下问题:首先:由于项目较多,那么硬件制作上就占用了较多课时,不利于课程的整体安排。
其次:由于项目较多,完全按照项目化教学模式进行教学,很多课题会用到相同的材料。
如万用板、电源、显示部分等,这就造成了项目整体成本较高,重复的内容制作也会影响学生的学习热情和学习的主动性、积极性。
因此,围绕单片机教学改革我们设计开发了一个简易单片机教学模块,该模块具有以下特点:(1)该模块的教学项目包含了单片机的软硬件知识、接口、驱动电路的综合应用,有助于提高学生单片机设计与开发的综合能力;(2)将单片机课程的项目优化集成在一个模块上,使学生通过该模块的逐步学习、制作,就能够掌握大量的单片机知识;(3)将单片机课程的项目优化组合在一个模块上,使教学成本大大降低;(4)该模块应用到单片机教学过程中,能提高学生应用单片机制作小产品的兴趣,增强动手能力,也能灵活地掌握单片机的知识,有利发挥学生学习的积极性和主动性。
天津理工大学单片机
SPCE061A性能
16位’nSP™微处理器; 工作电压:VDD为2.6-3.6V(cpu), VDDH为VDD5.5V(I/O) CPU时钟:0.32MHz-49.152MHz ; 内置2K字SRAM; 内置32K字FLASH; 可编程音频处理; 晶体振荡器; 系统处于备用状态下(时钟处于停止状态),耗电小 于2A/3.6V;
十进制展开成幂级数形式: 123 = 1x10 2 +2x101 +3x10 0
123
9
单片机及嵌入式系统应用
二进制(Binary)
计算机内部一般都是由晶体管集成的, 二进制数特点: 而二进制数只有 0 和 1 两个数码,采用 共有0和1两个数码; 晶体管的导通和截止、脉冲电平的高 逢2进1的进位计数原则; 和低电平等都很容易表示它。 此外,二进制数的运算简单,便于用 电子线路实现。 二进制数展开成幂级数: 4 3 2 1 0
4
单片机及嵌入式系统应用
第一章 单片机及嵌入式系统概述
单片机基础
5
单片机及嵌入式系统应用
单片机是什么?
本学时就单片机的基础知识进行介绍。 从数制的介绍到单片机原理、基本概 念,告诉初学者什么是单片机。 本学时还将简单介绍凌阳科技的十六 位单片机内核µ ’nSP。
6
单片机及嵌入式系统应用
计算机的数据表示
16
单片机及嵌入式系统应用
单片机的内部结构
1、中央处理器(CPU) 2、系统时钟(SystemClock) 3、存储器 4、输入输出口(I/O)
系统时钟
5、功能模块 6、内部总线
复位 中断 电源
内 部 总 线
定时器/计数器
T
TXD RXD
96单片机 天津大学 第一章 单片机基础知识
三、单片机的结构特点 片内的RAM采用寄存器结构形式,以便于提高 采用寄存器结构形式, 片内的 采用寄存器结构形式 数据的存取速度。 数据的存取速度。 通常将程序存储器ROM和数据存储器 和数据存储器RAM的 通常将程序存储器 和数据存储器 的 存储空间分开。 存储空间分开。 引脚通常是多功能的。 引脚通常是多功能的。 通常配有全双工串行接口, 通常配有全双工串行接口,以扩展单片机与外 备的通信方式。 备的通信方式。 具有丰富的指令系统, 具有丰富的指令系统,内部通常设置可以位寻 器空间。 址的存储 器空间。 具有许多特殊功能寄存器。 具有许多特殊功能寄存器。
单片机多媒体 CAI课件 CAI课件
天津大学电气自动化学院 电工电子技术中心
课程要求
本课程对于基础知识 实践环节都具有较高要求。 基础知识和 本课程对于基础知识和实践环节都具有较高要求。 都具有较高要求 学生通过本课程的学习,应达到以下要求: 学生通过本课程的学习,应达到以下要求: 了解有关单片机系统的基础知识。 了解有关单片机系统的基础知识。 掌握MCS-96系列单片机的软件编程技术 系列单片机的软件编程技术。 掌握MCS-96系列单片机的软件编程技术。 具备一定的硬件设计能力, 具备一定的硬件设计能力,能够设计简单的单 片机应用系统。 片机应用系统。
开始
二、单片机的发展趋势
1. 改进制造工艺,提高芯片性能(提高速度、降低功耗) 改进制造工艺,提高芯片性能(提高速度、降低功耗) 系列单片机为例, 以Intel系列单片机为例,早期的 系列单片机为例 早期的8051芯片的最高振荡频率 芯片的最高振荡频率 为12MHz,机器周期 µs,工作电压 ;而新型的 ,机器周期1 ,工作电压5V;而新型的80C51 芯片的机器周期仅为1/6µs,工作电压仅 芯片的机器周期仅为 ,工作电压仅1.8V。 。 2. 在保留原有CPU体系结构的基础上,根据应用范围将各 在保留原有CPU体系结构的基础上, 体系结构的基础上 种外设集成在芯片中。 种外设集成在芯片中。 早期的单片机包括时钟发生器、定时器 计数器 计数器、 早期的单片机包括时钟发生器、定时器/计数器、并行输入 /输出端口、串行输入输出端口、中断管理器等外设装置。 输出端口、 输出端口 串行输入输出端口、中断管理器等外设装置。 近年来推出的单片机在此基础上增加了监视定时器 )、A/D转换器、PWM输出、波形发生器、 转换器、 输出、 (Watchdog)、 )、 转换器 输出 波形发生器、 外部事件处理器、现场总线接口等装置。 外部事件处理器、现场总线接口等装置。
天津大学计算机科学与技术-操作系统原理实验2
操作系统实验2 (一)实验目的完成一个监视指定的若干目录变动情况的(服务)程序。
(二)实验内容利用inotify机制进行文件或文件夹的监控。
(三)实验结果fileMonitor为程序名称,源码如下:#include <sys/inotify.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#include <syslog.h>#include <fcntl.h>#include <sys/resource.h>#include <errno.h>//#define _DEBUG#define _DAEMON#define EVENT_NUM 16#define BUF_SIZE 10240#ifdef _DAEMONchar * fileConf = "/etc/fileMonitor.conf";char * fileScan = "/etc/fileMonitor.scan";char * fileLog = "/etc/fileMonitor.log";#elsechar * fileConf = "fileMonitor.conf";char * fileScan = "fileMonitor.scan";char * fileLog = "fileMonitor.log";struct wd_name{int wd;char * name;};int wd_NUM = 0;struct wd_name * wd_array;//struct stat buf; // for detimine the type of file.const int filenameLen = 500;const int filelistLen = 10000;char files[10000][500];char buffer[BUF_SIZE];char logmsg[500];FILE * fplog;int fd, wd;char *offset = NULL;struct inotify_event *event;int len, tmp_len;char strbuf[16];int i = 0;int m_argc;char **m_argv;int sleeptime=1;char * event_array[]={"File was accessed","File was modified","File attributes were changed","writtable file closed","Unwrittable file closed","File was opened","File was moved from X","File was moved to Y","Subfile was created","Subfile was deleted","Self was deleted","Self was moved","Backing fs was unmounted","Event queued overflowed","File was ignored"};int init(int argc, char **argv);int readConfig(char * filename);int resetConfig(char * filename);int readScan(char * filename, int cur);int parseCmd(char * filename,int argc, char **argv);int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag);// no recursivelyint execCmdN(char** dirs,int dsize, char * filename,int cur);// recursivelyint execCmdR(char** dirs, int dsize, char * filename,int cur);// with file typeint execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur);// only filesint execCmdF(char** f_files,int fsize,int cur);char * getTime(){time_t now;struct tm *timenow;char strtemp[500];time(&now);timenow = (struct tm *)localtime(&now);return (char*)asctime(timenow);//printf("recent time is : %s \n", asctime(timenow));}//for selectint isready(int fd){int rc;fd_set fds;struct timeval tv;FD_ZERO(&fds);FD_SET(fd, &fds);_sec = _usec = 0;rc = select(fd+1, &fds, NULL, NULL, &tv);if( rc<0 ) //errorexit(-1);return FD_ISSET(fd, &fds) ? 1: 0;}//for daemon#define LOCKFILE "/var/run/fileMonitor.pid"#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)int daemonize(const char *cmd){int i,fd0,fd1,fd2;pid_t pid;struct rlimit r1;struct sigaction sa;umask(0); //Clear file creation maskif(getrlimit(RLIMIT_NOFILE,&r1) < 0){printf("getrlimit error.\n");exit(1);}if((pid = fork()) < 0 ){printf("fork1 error.\n");exit(2);}else if(pid > 0)//Parent{exit(0);}setsid();sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL)<0){printf("sigaction error.\n");exit(3);}if((pid=fork()) < 0){printf("fork2 error.\n");exit(2);}else if(pid > 0){exit(0);}if(chdir("/") < 0){printf("chdir error.\n");exit(4);}//close(0); /* close stdin */ // for file.scan and file.conf //close(1); /* close stdout */ // for file.scan and file.conf //close(2); /* close stderr */openlog(cmd,LOG_PID, LOG_USER);syslog(LOG_INFO,"fileMonitor Start\n");}int lockfile(int fd){struct flock f1;f1.l_type = F_WRLCK;f1.l_start = 0;f1.l_whence = SEEK_SET;f1.l_len = 0;return(fcntl(fd,F_SETLK,&f1));}int already_running(void){int fd;char buf[16];fd = open(LOCKFILE,O_RDWR|O_CREAT,LOCKMODE);if(fd < 0){printf("Can't Open %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't Open %s:%s",LOCKFILE,strerror(errno));exit(1);}if(lockfile(fd) < 0){if(errno == EACCES || errno == EAGAIN){close(fd);return 1;}printf("Can't lock %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't lock %s:%s",LOCKFILE,strerror(errno));exit(1);}ftruncate(fd,0);sprintf(buf,"%ld",(long)getpid());write(fd,buf,strlen(buf));return 0;}void sigterm(int signo){syslog(LOG_INFO,"got SIGTERM,EXIT");fclose(fplog);closelog();exit(0);}void reread(void){syslog(LOG_INFO,"Re-read configuration file ok");init(m_argc, m_argv);}void sighup(int signo){syslog(LOG_INFO,"Re-Reading configuration file");reread();}int main(int argc, char **argv){#ifdef _DAEMONstruct sigaction sa;daemonize(argv[0]);if(already_running()){printf("fileMonitor already running\n");syslog(LOG_INFO,"fileMonitor already running\n");exit(2);}sa.sa_handler = sigterm;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGTERM);sa.sa_flags = 0;if(sigaction(SIGTERM,&sa,NULL) < 0){syslog(LOG_INFO,"Can't Catch SIGTERM:%s",strerror(errno));exit(1);}sa.sa_handler = sighup;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGHUP);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL) < 0){syslog(LOG_INFO,"Can't catch SIGHUP:%s",strerror(errno));exit(1);}#endifm_argc = argc;m_argv = argv;fd = inotify_init();if (fd < 0) {#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to initialize inotify.\n");syslog(LOG_INFO,logmsg);#elseprintf("Fail to initialize inotify.\n");#endifexit(-1);}fplog = fopen(fileLog,"wb");init(m_argc, m_argv);memset(logmsg,0,500);while(1){if (isready(fd)){if(len = read(fd, buffer, BUF_SIZE)) {offset = buffer;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#endif#ifdef _DEBUGprintf("%s\tSome event happens, len = %d.\n",getTime(), len);#endifevent = (struct inotify_event *)buffer;while (((char *)event - buffer) < len){if (event->mask & IN_ISDIR){strcpy(strbuf, "Direcotory");}else{strcpy(strbuf, "File");}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tObject type: %s\n", strbuf);#endif#endiffor (i=0; i<wd_NUM; i++){if (event->wd != wd_array[i].wd) continue;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tObject name: %s\n", wd_array[i].name);#endif#endifbreak;}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tEvent mask: %08X\n", event->mask);#endif#endiffor (i=0; i<EVENT_NUM; i++){if (event_array[i][0] == '\0') continue;if (event->mask & (1<<i)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tEvent: %s\n", event_array[i]);#endif#endif}}tmp_len = sizeof(struct inotify_event) + event->len;event = (struct inotify_event *)(offset + tmp_len);offset += tmp_len;}fflush(fplog);}}#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEsleep time %d\r",sleeptime);syslog(LOG_INFO,logmsg);#elseprintf("sleep time %d\r", sleeptime);fflush(stdout);#endiffflush(stdout);init(m_argc, m_argv);read(fd, buffer, BUF_SIZE);sleep(sleeptime);}return 0;}// read the configure from file.confint readConfig(char * filename){FILE * fp;fp = fopen(filename,"r");if(fp == NULL){memset(logmsg,0,500);sprintf(logmsg,"%s created.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("No %s exists.\n", filename);printf("%s created.\n", filename);#endifresetConfig(filename);fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s can not read.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s can not read.\n", filename);#endifexit(-1);}}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;int rflag = 0;int type = 0;int ret = 0;while(!feof(fp) && type < 4){fgets(buffer,filenameLen, fp);if(buffer[0] == '#'){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifcontinue;}if(0 == strcmp(buffer, "[DIRECTORY]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_dirs[cur_dir] = (char *) malloc(sizeof(char)*500);strcpy(f_dirs[cur_dir], buffer); // save typecur_dir++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE_TYPE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_files[cur_file] = (char *) malloc(sizeof(char)*500);strcpy(f_files[cur_file], buffer); // save typecur_file++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE_TYPE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[Time]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';fileTypes[cur_type] = (char*)malloc(sizeof(char) * 500);strcpy(fileTypes[cur_type],buffer); // save itcur_type++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[Time]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#'){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);//buffer[len-1]='\0';sleeptime = atoi(buffer);}fgets(buffer,filenameLen, fp);}}}if(type != 4){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is broken. Reset the configure....\n", filename);syslog(LOG_INFO,logmsg);resetConfig(filename);memset(logmsg,0,500);sprintf(logmsg,"%s is read again....\n", filename);syslog(LOG_INFO,logmsg);return readConfig(filename);#elseprintf("%s is broken. Reset the configure....\n", filename);resetConfig(filename);printf("%s is read again....\n", filename);return readConfig(filename);#endif}if(cur_dir + cur_file == 0 || (cur_dir ==0 && cur_type != 0)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is not configured correctly. Set the configure please.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s is not configured correctly. Set the configure please.\n", filename);#endif//resetConfig(filename);exit(-1);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);syslog(LOG_INFO,logmsg);#elseprintf("%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);#endif#endiffclose(fp);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. \n");fflush(stdout);#endif#endif// default is with recursivelyret = execCmd(f_dirs, f_files, fileTypes, cur_dir, cur_file, cur_type, fileScan, 1);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. ret %d\n",ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. ret %d\n",ret);fflush(stdout);#endif#endiffor(i = 0; i < cur_dir; i++){free(f_dirs[i]);}for(i = 0; i < cur_type; i++){free(fileTypes[i]);}return ret;}// reset the file.conf if errorint resetConfig(char * filename){FILE * fp;fp = fopen(filename,"w");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Can not open %s\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("Can not open %s\n", filename);#endifexit(-1);}fputs("#This is the configure file for fileMonitor.\n", fp);fputs("#DO NOT CHANGE the structure of this file.\n", fp);fputs("#In this place you can add the directories to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/dir\n", fp);fputs("[DIRECTORY]\n", fp);fputs("/home\n\n", fp);fputs("#In this place you can add the files to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/file\n", fp);fputs("[FILE]\n\n", fp);fputs("#In this place you can add file types to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|*.txt\n", fp);fputs("[FILE_TYPE]\n", fp);fputs("*.txt\n\n", fp);fputs("#In this place you can add time option.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|2\n", fp);fputs("[Time]\n", fp);fputs("1\n\n", fp);fclose(fp);}// parse the cmd and set files// return the wd_NUM;int parseCmd(char * filename, int argc, char **argv){int cmd_num = argc - 1;int offset = 1;// this test is no necessary.if(cmd_num <= 0){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Unknown error.\n");syslog(LOG_INFO,logmsg);#elseprintf("Unknown error.\n");#endifexit(-1);}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;char type = 'a';int rflag = 0;for(i = 0; i < cmd_num; i++){p = argv[i + offset];if(0 == strcmp(p, "--help")){printf("Usage:fileMonitor -d dirs -f files [-t fileTypes]\n\--help show help information\n\-f this is to set some files\n example -f /home/file1 /home/n.c\n\-d this is to set some directories\n example -d /home /tmp\n\-t this is optional to set some file_types\n example -t *.txt *.png\n\ -n set the time to monitor the directories\n example -n 2\n\-r to monitor with recursively\n\This program is used for monitor some files coded by Ren Gaojun, China.\n");fflush(stdout);exit(0);}if(0 == strcmp(p, "-f")){type = 'f';continue;}else if(0 == strcmp(p, "-d")){type = 'd';continue;}else if(0 == strcmp(p, "-t")){type = 't';continue;}else if(0 == strcmp(p,"-r")){type = 'a';rflag = 1;continue;}else if(0 == strcmp(p,"-n")){type = 'n';continue;}if( type == 'f'){f_files[cur_file++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type f %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type f %s \n",p);#endif#endif}else if( type == 'd'){f_dirs[cur_dir++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type d %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type d %s \n",p);#endif#endif}else if( type == 't'){fileTypes[cur_type++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type t %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type t %s \n",p);#endif#endif}else if( type == 'n'){sleeptime = atoi(p);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type n %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type n %s \n",p);#endif#endif}}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file, cur_type, rflag);syslog(LOG_INFO,logmsg);#elseprintf("%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file,cur_type, rflag);#endif#endifreturn execCmd(f_dirs,f_files, fileTypes, cur_dir,cur_file, cur_type, filename, rflag);}// execute the command to get the file list with recursively.int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag){int i = 0;int ret = 0;memset(buffer,0,BUF_SIZE);//sprintf(buffer,"find %s -name '%s' > file.scan",argv[1] , argv[2]);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function.\n");fflush(stdout);#endif#endifif(tsize > 0) // with filetype{ret = execCmdT(dirs,filetypes,dsize, tsize, filename,0);}if(fsize > 0)ret = execCmdF(f_files,fsize, ret);if(dsize > 0){if(!flag) // not set the recursively flagret = execCmdN(dirs,dsize, filename,ret);elseret = execCmdR(dirs,dsize, filename,ret);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// with file type.int execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur){int i =0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}strcat(buffer,"-name '");char tmp[BUF_SIZE];strcpy(tmp,buffer); // save the buffer.for(i = 0; i < tsize; i++) // each time search one type of file{strcat(buffer,filetypes[i]);strcat(buffer,"' > ");strcat(buffer,filename);system(buffer);#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"ret %d %s\n",ret, filename);syslog(LOG_INFO,logmsg);#elseprintf("ret %d %s\n",ret, filename);fflush(stdout);#endif#endifstrcpy(buffer,tmp);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with recursively.int execCmdR(char** dirs, int dsize, char * filename,int cur){int i = 0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUGmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. \n");fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}// strcat(buffer,"-type d > ");strcat(buffer," > ");strcat(buffer,filename);system(buffer);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the filesint execCmdF(char** f_files,int fsize,int cur){int i = 0;int ret = 0;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function.\n");fflush(stdout);#endif#endiffor(i = 0; i < fsize; i++){strcpy(files[cur + i], f_files[i]);}ret = fsize + cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with no recursively.// just monitor the directory no filetypeint execCmdN(char** dirs,int dsize, char * filename,int cur){int i = 0;int ret = cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function.\n");fflush(stdout);#endif#endiffor(i = cur; i < dsize + cur; i++){strcpy(files[i], dirs[i-cur]);}ret = i;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}int readScan(char * filename, int cur){int num = cur;FILE * fp;fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to open %s.\n", filename);syslog(LOG_INFO,logmsg);#endifprintf("Fail to open %s.\n", filename);exit(-1);}while(num < filelistLen && !feof(fp)) // read files and save them.{int L;fgets(files[num],filenameLen,fp);。
单片机课题设计
单片机课程设计项目小组:第八项目小组组长:田升15成员:支东平54陈威01伍思春04王力08成员分工情况:田升:和陈威一起负责此次设计中的软件设计方面,画程序流程图,并以此为编程完成后调试程序。
整体调度指挥本组中的其他成员有组织有次序的完成设计的其他内容。
支东平:这次课程设计的硬件设计由其完成,根据小组第一天的规划,以及我们所需要的功能要求(如有四个按键)使用DXP软件将硬件电路中的原理图和PCB板画出。
陈威:协助田升软件设计方面,并对程序中的各个模块进行说明和注释。
以便于读者了解和理解各个程序的作用。
王力:全权负责本次课程设计所用资料的整理,并编排Word文档,打印成章。
伍思春:设计所需要的课外资料都由他到图书馆或者上网查找,并将其中要用的一些程序模块罗列出来,而且根据本次设计所有人的想法汇集编写成设计体会。
设计的目的及任务1.设计目的:(1)初步认识51系列单片机的一些基本功能(2)熟悉如何用汇编语言进行编程,了解一些基本的指令格式,并能够灵活运用(3)掌握单片机系统应用的设计过程及实现过程2.任务描述:键控彩灯系统(1)使用一个按键控制其灯的运行及灯的流水作业和流动方向(如从左往右流动)(2)第二键控制系统的停止,当按下此键后所有灯停止运行(3)控制灯的交叉点亮闪烁动作(4)一个按键控制流水灯全亮全灭动作目录(一)硬件电路设计 (5)1:总体框图 (5)2:原理图 (6)3:PCB板图 (7)(二)软件设计 (9)1:功能模块图 (9)2:程序流程图 (11)(三)仿真调试 (22)(四)设计体会 (24)(五)参考文献 (26)系统设计(一)硬件电路设计总体框图功能描述:1.键盘控制:通过键盘来对“89C51”控制,将数据输入仪器和对系统运行进行控制等。
2.复位电路:使单片机的程序计数器清零。
3.晶振电路:为单片机提供时序信号。
4.流水灯显示:通过流水灯的显示来观察运行的程序是否正常。
电路原理图及PBC板图在文件夹内。
96单片机 天津大学 第二章 MCS96系列单片机基本结构
开始
2.1 MCS-96单片机体系结构
一、8096单片机结构
VREF AGND
A/D 转换器 掉电 基准频率 时钟 发生器 8位 定时 监视器 寄存器 阵列 CPU 16位 脉宽 调制器 串行口 波特率 发生器 256字节 XRAM 定时器1 定时器2 16KB片内 ROM/EPROM 存储器控制器 队列 RALU 16位 控制 信号
开始
WR/WRL(40):写外部存储器(WR)或写外部存储器低 字节(WRL)的输出信号,由CCR确定。 选WR功能时,每次写外部存储器时, 该引脚都输出低电 平;选WRL时,仅当写外部存储器低字节时,才输出低 电平。 BHE/WRH(41):总线高字节允许(BHE)或写外部存储 器高字节(WRH)。 当访问16位存储器时,如果(A0=0^BHE=1),则访问的 是低字节;若(A0=1^BHE=0),则访问的是高字节;若 (A0=1^BHE=1),则高低字节都访问。 若选择WRH功能,当写外部存储器高字节时,该引脚输出 低电平。 HSI:高速输入单元的输入,共4个引脚(HSI.0~HSI.3)。 其中HSI.2、HSI.3与HSO.4、HSO.5共用。 HSO:高速输出单元的输出,6个引脚(HSO.0~HSO.5)。 其中HSO.4、HSO.5与HSI.2、HSI.3共用。
XRAM
S/H
MUX
P3
地址/数据 总线
P4
高速 I/O
P2 MUX
P0 P1
P2
HSI HSO
开始
1. 16位CPU CPU内部采用寄存器文件结构。CPU可以通过特殊功能寄 存器(SFR),也可通过存储器控制器与外部进行数据交 换。CPU未采用其他芯片的累加器结构。可以在寄存器文 件的256个字节寄存器空间内进行操作。 2. 10位A/D转换器 MCS-96 内 部 有 八 个 通 道 带 采 样 保 持 的 10 位 A/D , 在 12MHz晶振时,完成一次A/D转换所需时间只要22s 。 3. 脉宽调制输出 MCS-96单片机可以直接提供一路调制信号,可用于驱动 电路。PWM输出信号经过积分就可获得直流输出,可以 用作D/A转换器或波形发生器。D/A转换器的分辨率为8位, 脉冲周期为64s(12MHz时)。 4. 自带波特率发生器的全双工串行口 MCS-96 串行口与 MCS-51 系列单片机兼容,且自带波特 率发生器,有4种工作模式,能方便进行多机通讯、I/O扩 展等。
96系列单片机原理及应用修订版课程设计
MCS51/96系列单片机原理及应用修订版课程设计1. 前言MCS51/96系列单片机是一种广泛应用于嵌入式系统的低功耗型单片机芯片。
有着高性价比、易于学习及应用等特点,广泛应用于通信、计算机、电子仪器、自动化控制、家电等各个领域。
本课程设计主要介绍MCS51/96系列单片机的原理和应用,帮助学生系统地理解单片机软硬件体系结构和编程方法,掌握单片机技术在嵌入式系统中的应用。
2. 课程设计目标•了解MCS51/96系列单片机体系结构和硬件特性,掌握单片机编程方法;•熟悉单片机的基本操作、数据传输方式、存储器结构以及中断和计时器等重要功能;•能够设计和实现基于MCS51/96系列单片机的控制系统、数据采集系统和嵌入式系统;•增强实际操作能力,练习软硬件设计与调试技能,为以后的工作打好基础。
3. 课程大纲本课程设计包括以下主要内容:3.1 单片机体系结构与编程方法•单片机的概念和特点•MCS51/96系列单片机的体系结构•编程语言和开发环境•仿真和调试工具3.2 单片机的基本操作•输入/输出端口的配置和应用•数据传输方式•存储器的体系结构和应用•异常和中断处理3.3 单片机的计时器和中断功能•定时器的种类和应用•特殊功能寄存器和中断向量表•外围设备的中断处理3.4 基于MCS51/96系列单片机的系统设计•控制系统的设计和实现•数据采集系统的设计和实现•嵌入式系统的设计和实现4. 课程设计实验本课程设计包括以下实验:4.1 实验1:MCS51/96系列单片机的基本应用实验•学习MCS51/96系列单片机的体系结构和硬件特性;•学习单片机的基本操作和编程方法;•实现简单的LED灯闪烁和数字显示程序。
4.2 实验2:MCS51/96系列单片机的计时器和中断实验•学习MCS51/96系列单片机的计时器和中断功能;•熟悉中断处理过程和实现方法;•实现可控制的LED灯闪烁和定时器控制的数字显示程序。
4.3 实验3:MCS51/96系列单片机的应用实验•学习如何设计和实现基于MCS51/96系列单片机的控制系统、数据采集系统和嵌入式系统;•实现基于MCS51/96系列单片机的小型控制系统或数据采集系统。
天津大学 单片机实验
同组实验者计算机编号
课程名称单片机应用实验日期2013年4月9日成绩
同组实验者计算机编号
三、实验步骤
1.在待命状态0,输入2000
2.按TV/ME键,进入存储器读写状态,显示
第六位数字闪动,输入5,则
3.按NX键,读出下一个单元
课程名称单片机应用实验日期2013年4月24日成绩
同组实验者计算机编号
三、实验步骤
1.在待命状态0,输入2000,进入待命状态
2.按TV/ME键,进入存储器读写状态,显示
第六位数字闪动,输入6,则56H存入
3.按NX键,读出下一个单元2001H,
下一个单元2002H,按照上述方式将
课程名称单片机应用实验日期2013年4月24日成绩
同组实验者计算机编号
课程名称单片机应用实验日期2013年4月24日成绩
同组实验者计算机编号。
天津大学微机原理实验报告
SPI 系统连接图
学院:精仪学院 专业:测控技术与仪器 年级:
成绩:
四、 实验内容 用杜邦线将单片机开发板和数码管显示模块连接,利用 TPM 计时器定
时进入中断以实现计时功能,及记录的时间显示到数码管上。 五、 流程图
主函数
TPM 中断子程序
开始
开始
初始化 等待
将秒数转化为分 钟和秒数并输出
返回主程序
void init_SPI(void);
//初始化 SPI 模块
void init_7219(void);
//初始化 MAX7219
void init_TPM(void);
//初始化 TPM 模块
void main(void) {
EnableInterrupts; /* enable interrupts */
/* include your code here */
init_SPI();
//初始化
init_7219();
init_TPM();
transfer(1,0); //初始化时刻数码管显示"00-00-00",sec transfer(2,0); transfer(3,10); transfer(4,0); //min transfer(5,0); transfer(6,10); transfer(7,0); //hour transfer(8,0);
{
transfer(DECODE_MODE,0xff); //设置 MAX7219 为全编译
transfer(INTENSITY,0xff); //设置 MAX7219 为亮度
transfer(SCAN_LIMIT,0x07); //设置 MAX7219 为扫描范围为全 8 位
MCS-51单片机原理及应用课后习题答案_天津大学出版社
4-13试编程实现将20H单元的两位BCD数相乘,结果以BCD码的形式存于21H单元当中。
ORG 0000HMOV 20H,#56HMOV A,20HANL A,#0FHMOV B,AMOV A,20HANL A,#0F0HSWAP AMOV R2,ADEC BLOOP: ADD A,R2DA ADJNZ B,LOOPMOV 21H,ASJMP $END4-13-2ORG 0000HMOV 20H,#56HMOV A,20HMOV R0,#21HMOV 21H,#0XCHD A,@R0MOV B,@R0SWAP AMOV R2,ADEC BLOOP: ADD A,R2DA ADJNZ B,LOOPMOV 21H,ASJMP $END4-7设一个加数在50H~52H单元中,另一个加数在53H~55H中,进位存放在位地址00中,试编程实现两数求和。
ORG 000HONE DATA 50HWEI BIT 00HMOV R0,#ONEMOV R1,#TWO ; MOV C,WEICLR CMOV R2,#3 LOOP: MOV A,@R0 ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R2,LOOPMOV WEI,CSJMP $END4-7-2ORG 0000HONE DATA 50HWEI BIT 00HMOV R0,#ONEMOV R1,#TWO CLR CMOV R2,#3SETB RS0MOV R0,#58HCLR RS0 LOOP: MOV A,@R0 ADDC A,@R1INC R0INC R1SETB RS0MOV @R0,AINC R0CLR RS0DJNZ R2,LOOPMOV WEI,CSJMP $END4-11试用除法指令将20H单元的两位BCD码变成ASCII码后存入21H和22H单元。
ORG 0000HMOV 20H,#67HMOV A,20HMOV B,#10HDIV ABADD A,#30HMOV 21H,AORL B,#30HMOV 22H,BSJMP $END4-1从20H单元开始存放一组带符号数,其数目已存在1FH单元。
天津大学《电子系统设计》实验报告部分
天津⼤学《电⼦系统设计》实验报告部分⼀、|⼆、实验要求(⼀)利⽤IDE软件设计输出⼀个伪正弦阶梯波,要求如下:1、输出⼀个频率处于100HZ~1000HZ之间的由明显阶梯的伪正弦波2、利⽤开发板控制伪正弦波频率步进步退功能,间隔分别为±100HZ,3、利⽤开发板控制伪正弦波的频率,从开发板键盘输⼊任意三位数,按“键⼊”之后输出该频率的正弦波,误差不超过±5%4、开发板的数字显⽰屏能过显⽰当前频率,误差不超过±5%(⼆)利⽤TINA和FilterPro Desktop设计滤波器和放⼤器1、根据题⽬要求,利⽤FilterPro Desktop软件设计出⼆阶巴特沃斯滤波电路⼤致的电路模型2、。
3、利⽤TINA对初步电路进⾏修改完善,并进⾏模拟仿真4、利⽤TINA设计放⼤电路将输出波形放⼤(三)焊接电路1、根据仿真结果组装电路图,并对组装结果进⾏调试修改2、强修改结果进⾏排布并焊接在电路板三、实验⽬的1、了解SDCC和IDE的安装过程2、熟悉万⽤表、⽰波器、实验电源等的使⽤3、【4、学会利⽤IDE建⽴⼯程、编程、连接开发板和拷贝⼯程到开发板上5、熟悉开发板,了解不同排针的功能,熟悉开发板的⼯作原理和构造6、学习将FilterPro Desktop和TINA结合使⽤并进⾏电路设计仿真7、学会独⽴设计滤波器和放⼤器,以及解决实验中遇到的各种问题8、巩固焊接电路的⼿法,学习如何焊接出更加美观的电路四、实验器件1、实验器材:⽰波器、实验电源、MUC(C8051F020)、数字信号发⽣器、电脑、电烙铁、剪线钳、吸锡器2、实验元件:LM358,MAX7400,电阻:10KΩ*3、20kΩ*2,瓷⽚电容:10nF*3、100nF*2,电解电容:1000µF*1、220µF*1,电路板⼀个、排针⼀组、电线若⼲、焊锡若⼲五、]六、实验过程1、实验分⼯:(1)软件部分:刘晓寰(2):硬件加报告:徐婧⽂、吴美润2、安装SDCC和IDE软件3、学习如何使⽤IDE建⽴⼯程,编辑程序,连接开发板,并将⼯程拷贝到开发板上4、学习实例程序,了解IDE程序语⾔以及编程要求5、在⽰例程序的基础上对程序进⾏修改,使经过开发板上的输出波形满⾜实验要求,并且能在开发板上实现步进,步退以及任意频率输出的实验要求6、熟悉FilterPro Desktop和TINA模拟仿真软件的使⽤,学会⽤FilterProDesktop设计基础滤波电路并⽤TINA进⾏仿真完善,⽤TINA设计放⼤电路并将滤波电路输出作为放⼤电路的输⼊进⾏仿真7、利⽤⾯包板测试仿真结果电路并对其进⾏参数上的修改(注:测试前检查电路连接是否出错,测试时⼩⼼芯⽚爆炸)8、)9、将利⽤IDE编写好的程序通过开发板数出并作为⾯包板的输⼊,再次测试电路是否可⽤,如果不⾏继续对参数进⾏修改10、设计电源电路要求能输⼊+5V电压,11、对电源电路进⾏测试,测试⽆误后进⾏焊接(注:测试电路时远离电路板,⼩⼼电源电路爆炸)12、对修改后的实验电路进⾏排版焊接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3 MCS-96单片机实验 MCS-96单片机实验
一、定时器实验
实验要求 74LS273的输出端接8 只发光二极管 , 以定时器1作为中断 只发光二极管, 每隔一秒点亮一只二极管,并反复循环。 源,每隔一秒点亮一只二极管,并反复循环。 实验目的 1) 掌握定时器1的工作原理 2) 掌握定时器1的使用及中断程序的设计方法 实验说明 1) 定时器1作为MCS-96单片机的实时时钟与其他事件同 步。 2) 两个定时器中断分别由IOC1.2和IOC1.3控制,溢出标 控制, 志分别是IOS1.5和IOS1.4。 3) 晶振频率为11.0592MHz,因此T1溢出的周期为: 溢出的周期为: 3×8×65536÷11059200=142.2ms
开始
延时5秒后转状态4(东西绿灯闪3次后转亮黄灯,延时 次后转亮黄灯, 3秒,南北仍是红灯);最后循环至状态1。急救车到 南北仍是红灯); );最后循环至状态 达时,两向为全红,以便让急救车通过。 达时,两向为全红,以便让急救车通过。急救车通过 交通灯恢复中断前状态。单脉冲用来申请中断, 后,交通灯恢复中断前状态。单脉冲用来申请中断, 表示有急救车通过。 表示有急救车通过。 练习子程序调用, 个状态编为子程序, 练习子程序调用,将4个状态编为子程序,在主程序中 个状态编为子程序 调用 2) 双色LED由一个红色LED管芯和一个绿色LED管芯封 装在一起,负端公用。当红色正端加高电平, 装在一起,负端公用。当红色正端加高电平,绿色正 端加低电平时,红灯亮;红色正端加低电平, 端加低电平时,红灯亮;红色正端加低电平,绿色正 端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。 端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。 实验说明 1) 通过设置IOC1.1,选择P2.2(EXTINT)或P0.7 作为外部中断源。 (ACH0.7)作为外部中断源。 2) 本实验中,使用EXTINT作为外部中断源,通过触发 本实验中, 作为外部中断源, 器提出中断申请。 器提出中断申请。
开始
实验电路图
HSI.0分别接Q13~Q16,将得到不同的周期和脉冲宽度。 将得到不同的周期和脉冲宽度。
开始
二、8XC196XX系列CHMOS芯片简介 8XC196XX系列 系列CHMOS芯片简介
1. 8XC194和8XC198 8XC194和8XC198是简化型的CHMOS准16位单片机,类 位单片机, 芯片, 似于8X9X系列中的8X98芯片,其外部总线为8位,内部结 相同。 构与8XC196KB相同。 2. 8XC196KB CHMOS系列芯片的第一代产品,基本功能与8X96BH大致 系列芯片的第一代产品, 相同。 相同。 3. 8XC196KC/KD CHMOS 系列的第二代产品 , 主要的特点是增加了 PTS , 系列的第二代产品, 大大提高了响应外设中断的速度, 大大提高了响应外设中断的速度,减少了CPU在处理外设 事务上的开销。 此外, 转换器的性能, 事务上的开销 。 此外 , 还提高了 A/D 转换器的性能 , 增加 的通道数。 了PWM的通道数。
开始
实验电路图
PO0~PO7接DL1~DL8,74LS273的CS接8000H。
开始
二、外部中断实验(急救车与交通灯)* 外部中断实验(急救车与交通灯)
实验要求 作为输出口, 个双色灯的亮灭, 以74LS273作为输出口,控制4个双色灯的亮灭,来模拟交 通灯。 通灯。 实验目的 1) 学习在单片机系统中扩展简单I/O接口的方法。 接口的方法。 2) 学习数据输出程序的设计方法。 学习数据输出程序的设计方法。 3) 学习模拟交通灯控制的方法。 学习模拟交通灯控制的方法。 4) 学习双色灯的使用。 学习双色灯的使用。 5) 学习外部中断技术的使用方法和中断程序的设计方法 。 学习外部中断技术的使用方法和中断程序的设计方法。 实验说明 1) 设十字路口为东西南北走向。最初,东西南北均为红 设十字路口为东西南北走向。最初, 南北绿灯,东西红灯); );延时 灯。然后转状态1(南北绿灯,东西红灯);延时5秒 次后转亮黄灯, 后转状态2(南北绿灯闪3次后转亮黄灯,延时3秒,东 西仍是红灯); );再转状态 东西绿灯,南北红灯); 西仍是红灯);再转状态3(东西绿灯,南北红灯);
开始
4. 8XC196KR/KQ/KT/JR/JQ CHMOS系列的第三代产品,其共同特点是: 系列的第三代产品,其共同特点是: 以事件处理器阵列EPA代替了HSIO; 增加了同步串行口SSIO; 增加了从口功能。 增加了从口功能。 5. 8XC196MC/MD 片内带有波形发生器,特别适用于电机控制, 片内带有波形发生器,特别适用于电机控制, 也称电机控 属于专用芯片, 制器 (Motor controller),属于专用芯片 , 但仍具有第三代 16位CHMOS单片机的大部分功能。 单片机的大部分功能。 6. 8XC196NT/NQ 相似。 此类芯片的寻址范围达到1MB,其主要结构与KR相似。
第五章 开发系统及实验 开发系统及实验
开始
5.1 高性能16位单片机80C196 高性能16位单片机 位单片机80C196
一、8XC196XX系列芯片新增外设 8XC196XX系列芯片新增外设
8XC196XX 是 Intel 公司推出的新一代高性能 16 位 CHMOS 单片机, 芯片耗电少,除正常工作外, 单片机 , 芯片耗电少 , 除正常工作外 , 还可工作于 2 种节 电方式:待机方式和掉电方式。 电方式:待机方式和掉电方式。 CHMOS单片机中,除了96系列芯片已包含的外设(I/O口, 单片机中, 系列芯片已包含的外设( A/D 转换器 , PWM , 串行口 , 定时器 / 计数器 , 监视定时 转换器, 串行口, 计数器, 又增加了以下外设: 器,HSI/HSO等)外,又增加了以下外设: 1. 外设事务服务器PTS PTS是一种微代码硬件中断处理器,可大大减少CPU响应 是一种微代码硬件中断处理器, 中断的开销。 中断的开销。 PTS通过若干组固定的微代码 , 可对下列固定操作实现高 通过若干组固定的微代码, 速中断服务: 单字传送,块传送, 速中断服务:单字节/单字传送,块传送,启动A/D转换并 读取转换结果, 读取转换结果,读取HSI FIFO,装载HSO,异步串行发送 和接收,同步串行发送和接收等。 和接收,同步串行发送和接收等。
实验电路图
PO0~PO3接DG1~DG4,PO4~PO7接DR1~DR4。 74LS273的CS接8300H,脉冲接EXTINT。
开始
;延时子程序入口: BL=1延时100mS秒 DELAY: ;延时子程序 PUSH CX D1: LD CX,#7800H D2: DEC CX JNE D2 DJNZ BL,D1 ;延时约100mS POP CX RET ; 调用实例 LDB BL LCALL DELAY
开始
7. 同步串行口 除了异步串行口以外, 除了异步串行口以外,某些型号的8XC196芯片还增加了同 步串行口,以支持标准同步串行传输协议。 步串行口,以支持标准同步串行传输协议。 8. 片选单元 8XC196NP芯片中包括一个片选单元,可提供6个片选信号, 芯片中包括一个片选单元, 个片选信号, 其地址可有用户编程,不需要外加译码电路。 其地址可有用户编程,不需要外加译码电路。
#10
;延时1S
PO
EQU
8300H
;并口输出口地址
STATUS1: LDB AL,#96H STB AL,PO
;南北绿灯,东西红灯
三、用HSI测量脉冲周期和宽度 HSI测量脉冲周期和宽度
实验要求 为输入, 用来测量脉冲的上升沿和下降沿, 以 HSI.0 为输入 , 用来测量脉冲的上升沿和下降沿 , 并计 算脉冲宽度和周期。 算脉冲宽度和周期。 实验目的 掌握高速输入部件原理及使用方法。 掌握高速输入部件原理及使用方法。 实验说明 1) 用HSI测量脉冲时,下降沿时间减去上一个上升沿时 测量脉冲时, 间得到高电平时间, 间得到高电平时间,上升沿时间减去上一个下降沿为 低电平时间, 低电平时间相加得到脉冲周期。 低电平时间,高、低电平时间相加得到脉冲周期。 2) 本实验中,单片机晶振周期11.0592MHz。 本实验中,
开始
7. 8XC196NP MCS-96 家族中的最新成员 , 其寻址范围可达 1MB , 该芯 家族中的最新成员, 片具有以下特点: 片具有以下特点: 是第一款低工作电压( 芯片,适用于便携式的、 是第一款低工作电压(3V)芯片,适用于便携式的、电 池供电的嵌入式系统。 池供电的嵌入式系统。 具有动态可切换的双方式系统总线, 具有动态可切换的双方式系统总线,可工作于分时复用 方式,也可以工作于分离方式。 方式,也可以工作于分离方式。 有一个片选单元, 个独立的片选信号。 有一个片选单元 , 可提供 6 个独立的片选信号 。 每个片 选控制寄存器可以配置该片选信号的地址范围( 选控制寄存器可以配置该片选信号的地址范围(最少为 256 字节 ) , 可选择数据总线宽度和总线等待周期 , 还 字节) 可选择数据总线宽度和总线等待周期, 可选择总线工作方式( 分离) 可选择总线工作方式(分时复用/分离)。
开始
Байду номын сангаас始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
开始
寄存器名称 R0 ADCOM ADL ADH HSIMOD HSITIM HSOTIM HSISTA HSOCOM SBUF INTMAS INTPEN TIMER1 WATCHD
地址 00H 02H 02H 03H 03H 04H 04H 06H 06H 07H 08H 09H 0AH 0AH