1、 唐 山 学 院 单片机原理 课 程 设 计 题 目 简易数字温度计 系 (部) 智能和信息工程学院 班 级 姓 名 学 号 指导老师 年 1 月 2 日至 1 月 6 日 共 1 周1月4日单片机原理课程设计任务书一、设计题目、内容及要求设计题目:简易数字温度计设计内容:所设计数字温度计应含有以下功效:1.能够测量-50到110摄氏度内温度。2.在液晶上显示目前温度,分别为百位、十位、个位和小数点后一位。3.测量精度误差在正负0.5摄氏度以内。设计要求:1.依据题目要求进行系统总体设计。 2.完成系统硬件电路设计。3.系统程序设计。 (1)程序步骤图;(2)完整源程序;(3)正确仿真运行。4
2、.撰写设计说明书(符合格式要求)。二、设计原始资料PROTEUS软件,WAVE/KEIL软件,试验箱三、要求设计结果(课程设计说明书、设计实物、图纸等)设计结果能正确仿真演示课程设计说明书一份(要求有硬件设计原理图,仿真结果图,源程序代码)四、进程安排1.2日-1.3日早晨 查阅资料,设计电路原理图、编写程序1.4日下午-1.5日 中心机房调试程序1.6日 课程设计答辩五、关键参考资料1肖看.李群芳.单片机原理、接口及应用,清华大学出版社.92楼然苗.单片机课程设计指导.北京:北京航空航天大学出版社.3孙育才主编,MCS-51系列单片微型计算机及其应用.东南大学出版社指导老师(署名):教研室主
3、任(署名):课程设计成绩评定表出勤情况出勤天数 缺勤天数成绩评定出勤情况及设计过程表现(20分)课设答辩(20分)设计结果(60分)总成绩(100分)提问(答辩)问题情况综合评定 指导老师署名: 年 月 日目 录1.方案论证12.硬件设计22.1系统组成 2 2.2器件选择 22.2.1 AT89C51概述22.2.2 AT89C51引脚功效32.2.3 复位电路设计42.3数字温度传感器52.3.1 DS1621技术指标52.3.2 DS1621工作原理62.4 单片机和DS1621接口电路62.5 七段LED数码显示电路73.系统软件设计93.1 编程语言选择93.2 主程序设计93.3
4、温度采集模块设计103.4 温度计算模块设计103.5 串行总线编程114.软硬件调试结果分析125.设计总结136.参考文件14附录A 多点温度采集系统电路原理图151.方案论证 该系统能够使用方案一:热敏电阻;方案二:数字温度芯片DS1621实现。采取数字温度芯片DS1621 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统测温方法很多外围电路。且该芯片物理化学性很稳定,它能用做工业测温元件,此元件线形很好。在0100摄氏度时,最大线形偏差小于1摄氏度。DS1621 最大特点之一采取了单总线数据传输,由数字温度计DS1621和微控制器AT89C51组成温度测量装置,它直接输出温度
5、数字信号,可直接和计算机连接。这么,测温系统结构就比较简单,体积也不大。采取51 单片机控制,软件编程自由度大,可经过编程实现多种多样算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。控制工作,还能够和PC 机通信上传数据,另外AT89S51 在工业控制上也有着广泛应用,编程技术及外围功效电路配合使用全部很成熟。该系统利用AT89C51芯片控制温度传感器DS1621进行实时温度检测并显示,能够实现快速测量环境温度,并能够依据需要设定上下限报警温度。该系统扩展性很强,它能够在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并能够利用AT24C16芯片作为存放器件,以此
6、来对一些时间点温度数据进行存放,利用键盘来进行调时和温度查询,取得数据能够经过MAX232芯片和计算机RS232接口进行串口通信,方便采集和整理时间温度数据。故采取了方案二。测温电路总体设计方框图图1-1所表示,控制器采取单片机AT89C51,温度传感器采取DS1621,用5位LED数码管以串口传送数据实现温度显示。图1-1 测温电路总体设计方框图2.硬件设计2.1系统组成本温度数据采集系统关键功效是测量温度,并显示温度测量结果,并附带了单片机和PC机之间通讯接口。系统结构包含单片机部分、温度传感器、显示电路、通讯接口电路等多个部分。图2-1为系统总体结构框图。图2-1 测温系统总体结构框图系
7、统工作原理是:电路在上电后,最先单片机利用模拟总线I2C对DS1621进行寻址,单片机在接收到DS1621应答后,单片机将设置/状态寄存器值经过I2C总线写入该寄存器,以后DS1621在单片机控制下进行温度测量,然后DS1621把所采集温度(50摄氏度100摄氏度,精度为0.5摄氏度)传输给单片机,最终单片机把温度数据送到LED上显示。系统中附带串行接口以供备用。2.2器件选择2.2.1 AT89C51概述对于单片机选择,能够考虑使用8031和8051系列,因为8031没有内部RAM,系统又需要大量内存存放数据,所以不适用。所以,我们选择51系列单片机AT89C51。AT89C51是美国ATM
8、EL企业生产低功耗,高性能CMOS8位单片机,片内含4KB可编程Flash只读程序存放器,兼容标准8051指令系统及引脚,并集成了 Flash 程序存放器,既可在线编程(ISP),也可用传统方法进行编程,所以,低价位AT89C51单片机可应用于很多高性价比场所,可灵活应用于多种控制领域,对于简单测温系统已经足够。单片机AT89C51含有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统设计需要,很适合便携手持式产品设计使用系统可用二节电池供电。AT89C51关键特征以下:和MCS-51 兼容; 4K字节可编程闪烁存放器;三级程序存放器锁定;1288位内部RAM; 32根可编程I/O
9、线;两个16位定时器/计数器; 5个中止源;可编程串行通道; 片内振荡器和时钟电路。2.2.2 AT89C51引脚功效单片机芯片AT89C51为40引脚双列直插式封装。其各个引脚功效介绍以下,芯片AT89C51引脚排列和逻辑符号图2-2所表示。各引脚分别为: VCC:供电电压 图2-2 AT89C51引脚GND:接地P0口图4-2 AT89C51引脚排列图P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口管脚写1时,被定义为高阻输入。P0能够用于外部程序数据存放器,它能够被定义为数据/地址第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输
10、出原码,此时P0外部电位必需被拉高。P1口P1口是一个内部提供上拉电阻8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入”1”后,电位被内部上拉为高可用作输入,P1口被外部下拉为低电平时,将输出电流,这是因为内部上拉缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口P2口为一个内部上拉电阻8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流 当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时P2口管脚电位被外部拉低,将输出电流,这是因为内部上拉缘故。P2口当用于外部程序存放器或16位地址外部数据存放器进行存取时,P2口输出地址高八位
11、。在给出地址”1”时,它利用内部上拉优势,当对外部八位地址数据存放器进行读写时,P2口输出其特殊功效寄存器内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口P3口管脚是8个带内部上拉电阻双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入时,因为外部下拉为低电平,P3口将输出电流(ILL),也是因为上拉缘故。P3口也可作为AT89C51部分特殊功效口,同时P3口同时为闪烁编程和编程校验接收部分控制信号。RST:复位输入端。当振荡器复位时,要保持RST两个机器周期高电平时间。PSEN外部程序存放器选通信号。在由外部程序
12、存放器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存放器时,这两次有效PSEN信号将不出现。EA/VPP当EA保持低电平时,访问外部ROM;注意加密方法1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。2.2.3 复位电路设计单片机复位电路图2-2所表示。该复位电路采取手动复位和上电复位相结合方法。当按下按键S1时,VCC经过R2电阻给复位输入端口一个高电平,实现复位功效,即手动复位。上电复位就是VCC经过电阻R2和电容C组成回路,该回路是一个对电容C1充电和放电电路,所以复位端口得到一个周期性改
13、变电压值,而且有一定时间电压值高于CPU复位电压,实现上电复位功效。图2-3 单片机复位电路2.3数字温度传感器2.3.1 DS1621技术指标DS1621是美国DALLAS企业生产一个功效较强数字式温度传感器和恒温控制器。数字接口电路简单,和I2C总线兼容,且能够使用一片控制器控制多达8片DS1621。其数字温度输出达9位,精度为0.5摄氏度。DS1621可工作在最低2.7V电压下,适适用于低功耗应用系统。 DS1621引脚排列图图2-4所表示,引脚功效描述如表2-1所表示。图2-4 DS1621引脚排列图表2-1 DS1621引脚功效表引脚符号功效描述1SDA2线I2C 串行数据输入/输出
14、2SCL2线I2C 串行时钟端3TOUT温度上下限超出输出4GND地5A2A0片选地址输入A2A06VDD电源端(+2.75.5V)2.3.2 DS1621工作原理图2-5 DS1621组成原理框图斜坡累加电路重预置比较器计数温度低敏感振荡器重预置电路温度寄存器温度低敏感振荡器计数器=0DS1621组成原理框图图2-5所表示,在测量温度时使用了独有在线温度测量技术。它经过在一个由对温度高度敏感振荡器决定计数周期内对温度低敏感振荡器时钟脉冲计数值计算来测量温度。DS1621在计数器中预置了一个初值,它相当于50摄氏度。假如计数周期结束之前计数器达成0,已预置了此初值温度寄存器中数字就会增加,从而
15、表明温度高于55摄氏度。和此同时,计数器斜坡累加电路被重新预置一个值,然后计数器重新对时钟计数,直到计数值为0。经过改变增加每1 内计数器计数,斜坡累加电路能够赔偿振荡器非线性误差,以提升精度,任意温度下计数器值和每一斜坡累加电路值对应计数次数须为已知。 DS1621经过计算能够得到0. 5摄氏度精度,温度输出为9位,在发出读温度值请求后还会输出两位赔偿值。表2给出了所测温度和输出数据关系。这些数据可经过2线制串行口连续输出,MSB在前,LSB在后。 2.4 单片机和DS1621接口电路前面已经介绍了DS1621温度传感器以8位数字输出,数据输出和I2C总线兼容,能够方便地经过SDA,SCL以
16、串行方法和单片机相连。而AT89C51面向主/从功效字节I2C总线串行I/O口,所以多路温度数字量能够经过I2C总线直接送GAS97C2051单片机。I2C总线(Inter IC BUS)是Philips企业推出双向两线串行通信标准。因为它含有接口少、通信效率高等优点,现已得到广泛应用I2C总线是一个串行数据总线,挂在总线上各集成电路模块(单片机和含有多种功效电路芯片)经过一条串行数据线 (SDA)和一条串行时钟线(SCL),按一定通信协议进行寻址和信息传输。每个电路模块全部有唯一地址,在信息传输过程中,I2C总线上电路模块有是主控器,有是被控器,主控器和被控器全部能够是发送器或接收器,这完全
17、取决于它所要完成功效。采取I2C总线可最大程度地简化电路结构,实现电路模块化、标准化设计。I2C总线在进行数据传输时,由作为主控器AT89C51来初始化一次数据传输,并在I2C总线上提供时钟进行传送。信息传送对象、方向和传送开始、终止也由主控器(AT89C51)来决定。此时,在I2C总线上被主控器所寻址集成电路模块称为被控器(DS162)。在I2C总线上,数据由发送器传出,并被接收器接收,接收器在每次正确接收到一个数据字节后,全部要在数据总线(SDA)上给发送器一个应答信号。因单片机AT89C51本身 没有I2C硬件资源,所以必需用软件来模拟I2C总线,本系统利用单片机AT89C51P3.0和
18、P3.1引脚分别作I2C总线数据线和时钟线(见附录A)。AT89C51模拟I2C总线关键由软件设置来实现其功效。2.5七段LED数码显示电路采取七段LED数码显示,LED显示器内部由7段发光二极管组成,所以亦称之为七段LED显示器,因为关键用于显示多种数字符号,故又称之为LED数码管。每个显示器还有一个圆点型发光二极管,用于显示小数点。在单片机AT89C51接收到DS1621所采集温度数据后,单片机把所读到数据送给数码管显示。系统具体显示电路图2-6所表示。图2-6 七段LED数码管显示电路显示电路中单片机AT89C51P0口直接驱动8段数码管(其中需要给P0外接上拉电阻)完成字形码输出(字形
19、选择)。而P2.1-P2.5控制6位LED进行分时选通,这么在任一时刻,只有一位LED是点亮,但只要扫描频率足够高(通常大于25Hz),因为人眼视觉暂留特征,直观上感觉却是连续点亮,这就是我们常说动态扫描电路。3.软件设计和调试3.1 编程语言选择51编程语言常见有两种,一个是汇编语言,一个是C语言。汇编语言机器代码生成效率很高但可读性却并不强,复杂一点程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,C 语言很好结构性和模块化更轻易阅读和维护,用C 编写程序比汇编更符合大家思索习惯,开发者能够更用心考虑算法而不是考虑部分细节问题这么就降低了开发和调试时间,而且C语言还
20、能够嵌入汇编来处理高时效性代码编写问题。3.2 主程序设计初始化N读温度数据并存放生成地址字节1001000,循环次数3延时1S以上等候结果开启转换向设置/状态寄存器设置为连续工作方法生成地址字节1001000,循环次数3次地址字节加02H 循环次数减1为0?读温度数据并存放及显示地址字节加02H 循环次数减1为0?图3-1 主程序步骤图NN主程序关键功效是负责多点温度数据实时采集、传输,处理和显示。其程序步骤图3-1所表示。3.3 温度采集模块设计为本温度采集系统开发软件程序,能够对DS1621内部寄存器编程控制DS1621工作方法,和从这些数据寄存器读取温度值,最终把经过单片机数据处理后温
21、度送到LED上显示。AT89C51饰演着上传下达角色,单片机端程序采取了C语言。DS1621一侧通信程序将利用并行端口P3.0和P3.1来模拟I2C 总线协议,总线上通信经过程序来实现。整个软件采取了模块化程序设计方法。为了实现AT89C51和DS1621之间I2C 协议之下串行通信,编写了部分专用子程序。这些子程序段包含:符号定义、AT89C51端口初始化、开启信号时序产生、停止信号时序产生、发送字节、读取字节、读取温度、显示。系统电路在上电后开始工作,最先程序单片机进行初始化设置,然后单片机利用模拟I2C总线对DS1621进行寻址。单片机在接收到DS1621应答后,紧接着单片机利用命令(A
22、Ah、ACh、EEh、22h)将设置/状态寄存器值经过I2C总线写入DS1621状态寄存器,该系统中把DS1621设置为连续温度转换工作方法,以后DS1261在单片控制下进行温度测量,然后DS1261把所采集温度传输给单片机,最终单片机把温度数据送到LED上显示。3.4 温度计算模块设计计算温度子程序将从DS1621中读取温度值进行BCD码转换运算,并进行温度值正负判定,其程序步骤图图3-2所表示。 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY图3-2 温度计算步骤图3.5 串行总线编程在本系统中,单片机AT89C51 作为主控器件,
23、3个DS1621作为被控器,所以我们只要考虑主方法下状态处理模块,即考虑AT89C51主发送和主接收方法下状态处理模块。该电路中为了简化电路设计在I2C总线时钟和数据上各加了一个上拉电阻,以获取一定上拉电流使信号采集可靠。本系统中挂在I2C总线上各电路模块全部有其节点地址。AT89C51作为主控器其节点地址无意义,作为被控器3个DS1621全部有其节点地址,其地址为1001A2A1A0 ,其中,1001是器件编号,已由芯片生产厂家要求,A2A1A0为DS16213个引脚,在电路中分别接高低电平决定2个DS1621不一样地址。2个DS1621地址分别为10010001001010。本系统中I2C
24、总线寻址方法为广播寻址,即AT89C51对挂在I2C总线上全部DS1621广播呼叫寻址。AT89C51发出开始信号S后第一个字节确定由AT89C51所选择一个DS1621地址,然后在第一个字节以后开始数据传送。具体实现寻址方法是:由AT89C51发出开启位S后紧跟着发送从器件DS16217位地址码,即S+SLA,在节点地址寻址中SLA为被寻址从节点地址,主控设备在发送数据前,在时钟为高时,在数据线上发送一个由高到低信号来表示开始传送数据,DS1621 接收到开始信号时,移入后续8 位(高7 位地址线和一个R/W 位)来确定进行怎样操作,R/W 位为0 表示写,为1 表示读。读写操作完成后,在时
25、钟为高时,在数据线上发送一个由低到高信号表示传送结束。具体数据格式图3-3所表示,时序图3-4所表示。图3-3 串行通信数据格式图3-4 串行通信时序图 4.软硬件调试结果分析本设计应用Proteus及Keil软件,首先依据自己设计电路图用Proteus软件画出电路模型,相关这个软件使用经过查部分资料和自己探索学习;然后用Keil软件对所编写程序进行编译、链接,假如没有错误和警告便可生成程序hex文件,调试好程序后将目标文件导入ProteusAT89C51芯片中进行软件调试。最终进行三路温度对比测试。数字温度计仿真电路图图4-1所表示。图4-1 仿真图 仿真结果分析:不停调整三路DS1621温
26、度值,发觉LED显示器上数值和DS1621屏幕上标准值相差无几,在误差许可范围之内。当某一路温度不在50-80范围时,两个LED同时发光,表示告警信息。经调试,证实开发者最终设计出结构合理、美观,关键电气指标良好,性能稳定可靠电路。5.设计总结不知不觉中,一周课程设计实习已经靠近尾声了。可能是假期快到缘故,总感觉这次实习尤其短暂。此刻,真是感慨万千啊!现在我能够自豪说,这次实习我达成了预期目标。因为在实习期间,我天天全部在接触新东西,天天全部会有新问题等候我去探讨去处理,天天全部有新收获。回想课设第一天,我们做点电脑前,不知道自己能干点什么,对于指导老师讲解也是云里雾里。因为头一回接触Prot
27、eus和Keil这两个软件。不过我相信,只要自己用心了,没有办不成事。于是,我静下心来,仔细研究老师下发教程。我珍爱每一次上机机会,勤加练习,课下主动研究手册和相关书籍。两天过后,才算有点眉目了。到这时心里才算稍微安稳了部分,再加上以前学过名为Protel电路设计软件,所以我自信心加强了。在这次设计过程中,表现出自己单独设计电路能力和综合利用知识能力,体会了学以致用、突出自己劳动结果喜悦心情,从中发觉自己平时学习不足和微弱步骤,从而加以填补。在此感谢我们田红霞、张国旭老师,老师严谨细致、一丝不苟作风一直是我工作、学习中楷模;老师循循善诱教导和不拘一格思绪给我无尽启迪;这次简易数字温度计设计每个
28、试验细节和每个数据,全部离不开老师您细心指导。而您开朗个性和宽容态度,帮助我能够很顺利完成了这次课程设计。同时感谢对我帮助过同学们,谢谢你们对我帮助和支持,让我感受到同学友谊。6.参考文件1肖看.李群芳.单片机原理、接口及应用,清华大学出版社.92楼然苗.单片机课程设计指导.北京:北京航空航天大学出版社. 3孙育才主编,MCS-51系列单片微型计算机及其应用.东南大学出版社附录A 多点温度采集系统电路原理图附录B C语言源代码#include reg51.h#include intrins.h#define uchar unsigned char#define uint unsigned in
29、t#define DiSdata P0 /七段码数据输出口#define discan P2 /扫描数据输出口sbit DIN=P07; /小数点控制sbit Scl=P30; /串行时钟sbit Sda=P31; /串行数据sbit alarm=P17;sbit alarm2=P16;uint i;uint h; uint temp;uchar dath2; /温度输入口uchar ff2,ff1=0,t3=0;uchar code dis_712=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/共阴LED段码表 0
30、1 2 3 4 5 6 7 8 9 灭 - uchar code scan_con5=0xfd,0xfb,0xf7,0xef,0xdf; /LED显示控制,对应0LED有效uchar data display5=0x00,0x00,0x00,0x00,0x002; /显示单元数据,共6个数据和一个运算暂用uchar data display15=0x01,0x02,0x03,0x04,0x052;uchar data DD4=0x90,0x92,0x94; /void delay_us(uint t) /延时函数 for (;t0;t-); /scan() /LED扫描函数 uchar k;
31、for(k=0;k5;k+) discan=scan_conk; /控制位送P2口 DiSdata=dis_7displayk; /数据位送P0口 if (k=3)DIN=1; else DIN=0; /小数点显示 delay_us(150); /void delay(void) /延时函数 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /void i_start(void) /开始 Sda=1; Scl=1; delay(); Sda=0; delay(); Scl=0; / void i_stop(void) /终止 Sda=0
32、; Scl=1; delay(); Sda=1; delay(); Scl=0; Sda=0; /bit i_clock(void) /应答信号 bit sample; Scl=1; delay(); sample=Sda; _nop_(); _nop_(); Scl=0; delay(); return(sample); / void i_ack(void) Sda=0; i_clock(); Sda=1; / bit i_send(uchar i_data) /发送 uchar i; for(i=0;i8;i+) Sda=(bit)(i_data & 0x80); i_data=i_dat
33、a1; i_clock(); Sda=1; return(i_clock(); / uchar i_receive(void) /I2C接收 uchar i_data=0; uchar i; for(i=0;i8;i+) i_data=1; Scl=0;delay(); Scl=1;delay() ; i_data|=Sda; Scl=0; delay(); return(i_data); / bit start_temperature_T(unsigned char d) /开始转换命令 uchar t1; t1=DDd; i_start(); if(i_send(t1) if(i_send
34、(0xee) i_stop(); delay(); return(1); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); / bit read_temperature_T(unsigned char *p,unsigned char d) unsigned char t1,t2; t1=DDd; t2=DDd+0x01; i_start(); if(i_send(t1) if(i_send(0xaa) i_start(); if(i_send(t2) *(p+1)=i_receive(); i_ack(
35、); *p=i_receive(); i_stop(); delay(); i_send(t1); i_send(0x22); delay(); return(1); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); bit ds1621(unsigned char d) unsigned char t1; t1=DDd; i_start(); if(i_send(t1) if(i_send(0xac) i_start(); if(i_
36、send(0x0a) i_stop(); delay(); return(1); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); /void chuli_temp(unsigned char d) unsigned char datah,f=1,datal,t; while(f) t=start_temperature_T(d); if(t) read_temperature_T(dath,d);f=0; delay_us(20);
37、datah=dath1;datal=dath0; if(datal80) alarm2=1; else alarm2=0; display0=d; f=0; if(datah&0x80)!=0) f=1; display1=10; datah=datah+1; datah=datah; datah=datah+1; display2=(datah/10)%10); display3=datah%10; if(datal&0x80)=0x80) display4=5; else display4=0; else display1=datah/100; display2=(datah/10)%10
38、); display3=datah%10; if(datal&0x80)=0x80) display4=5; else display4=0; if(!display1) /符号位显示判定 display1=0x0a; /最高位为0时不显示 if(!display2) display2=0x0a; if(f) display2=0x0b;f=2; /次高位为0时不显示 if(f=1)display1=0x0b; /负温度时最高位显示- void ex_int0() interrupt 0 ff2=1; ff1=0; /void ex_int1() interrupt 2 EA=0; ff1=1; ff2=0; EA=1; /main() /主函数 uchar d=0,t4=1; DiSdata=0xff; /初始化端口 discan=0xff; alarm=0; EA=1; EX0