1、I毕业论文(设计)题目PC与单片机通信专业工业电气自动化班级学生姓名指导教师提交日期二年月日II目录1绪论错误未定义书签。11设计任务612设计方案6第二章单片机串口通信的基本原理21单片机组成结构4错误未定义书签。22单片机串行通信的基本方法1323RS232通信协议231单片机MAX23214241串行通信电路错误未定义书签。242单片机外围电路错误未定义书签。244LED数码管显示电路错误未定义书签。第三章器件原理及连接17错误未定义书签。31基本器件简介错误未定义书签。32器件的连接错误未定义书签。321时钟处理模块错误未定义书签。322键盘处理模块错误未定义书签。323显示模块错误未
2、定义书签。第四章软件设计错误未定义书签。4141MSCOMM通信控件错误未定义书签。4242程序设计错误未定义书签。第五章硬件连接结束语20参考文献21致谢22附录23III附录1系统硬件电路图23附录2元件清单错误未定义书签。附录3部分程序源代码24第一章绪论介绍了采取专用电平转换芯片MAX232实现PC机与MCS51单片机之间的串行通信的方法通过对系统的通信方式选择89C51通信波特率的设置、通信的设置,以及对接口电路的软件和硬件的设计分析,展示了该电路的实用IV性VABSTRACTINTHISARTICAL,ANEWMETHODOFSERIALCOMMUNICATIONUSINGSPEC
3、IAL2PURPOSELEVEL2CONVERSIONCHIPMAX232BETWEENPCANDMCS251SINGLE2CHIPMICROCONTROLLERISINTRODUCEDTHESELECTIONOFTHECOMMUNICATIONMODE,SETTINGOFTHEBAUDRATEOFTHE89C51ANDITSSETTINGOFCOMMUNICATIONARESTATEDINDETAILTHROUGHTHEANALYSISOFTHEHARDWAREANDSOFTWAREDESIGNOFTHEINTERFACECIRCUIT,ITSPRACTICABILITYISPRESENTE
4、D存储信息的采集器,对信息量的大小有严格的要求,由于采集器的存储量有限和进一步针对性处理与显示的需要,信息需要传入微机内采集器与微机通过微机的串口实现通信1利用MCS51单片机的串行口与PC机的串行口COM1或COM2进行串行通信,将单片机采集的数据传送到PC机中,由PC机的高级语言或数据库语言对数据进行整理及统计等复杂处理PC机串行口给出的信号是一个RS2232信号它是一个基于37V正电压、37V负电压的脉冲链这一信号必须转化为一个05V的脉冲链,以便处理器读取中间转换电路采用MAX232芯片来实现611系统开发背景和系统设计的意义自单片机出现至今,单片机技术已走过了近20年的发展路程。纵观
5、20年来单片机发展历程可以看出,单片机技术的发展以微处理器MPU技术及超大规模集成电路技术的发展为先导,以广泛的应用领域为拉动,表现出较微处理器更具个性的发展趋势。与此同时在市场上以单片机为核心控制器的产品更是层出不穷,各种家用电器、智能仪器仪表、医疗器械、机电一体化、实时工业控制、交通领域无不用到单片机。从目前单片机的发展趋势来看,单片机控制技术已成为电子设计技术及计算机技术不可缺少的一个重要部分,因此单片机系统在电子世界里有着较好的前景,进行单片机的系统开发设计在当今电子领域有着重大的意义。12设计目标该设计要求实现(3)、设计串行通信接口,实现与PC机的通信;(4)、具有人机对话功能,可
6、通过键盘进行输入;(5)、LED显示器能够根据按键的输入进行相应的显示;(6)、自制5V稳压电源。设计结果要求完成电路的设计,硬件电路应该设计出原理图并画出PCB板图,完成软件程序的编写(包括流程图和部分源代码)。13设计方案的选择根基设计目标的要求,此系统可以采用以下两种设计方案来实现。设计方案一此方案是指PC机与单片机之间通过电缆线传输数据。有线传输的优势是性能比较稳定,调试简单,而不足之处在于它的应用范围不够广、性能不够好,而且传输距离受限,这样就大大影响了系统的应用范围。2设计方案二无线传输7此方案是指PC机与单片机通过无线信道传输数据。无线传输的最大优势是应用范围广,受距离约束较小,
7、在一定范围内可以不用考虑距离问题,还可以应用在一些高温、危险的场合。因此,本文选用无线传输方案通过串口来实现PC机与单片机之间的双工通信。无线传输可以用不同的方式来实现,常用的有红外方式、蓝牙方式,其他的还有射频收发芯片如CC1100,PT22622272芯片等。红外通信是利用950NM近红外波段的红外线作为传递信息的载体,通过红外光在空中的传播来传递信息,由红外发射器和接收器实现。发射端将二进制数字信号调制成某一频率的脉冲序列,经电光转换电路,驱动红外发射管以光脉冲的形式发送到空中。接收端将接收到的光脉冲转换成电信号,再经解调和译码后恢复出原二进制数字信号。其最大优点是不易被人发现和截获,保
8、密性强;几乎不会受到电气、天电、人为干扰,抗干扰性强。此外,红外线通信机体积小、重量轻、结构简单、价格低廉。不足之处在于它必须在视距内通信,且传播受天气的影响。CCLL00是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计。CCLL00构建高性能射频无线数据传输技术方案应用无线通讯模块采用透明模式进行通讯,即所收即所发,具有通讯距离远、低功耗、接口灵活等优点,使用者无需编码和控制。CCLL00通信距离视距大于300M,而且能隔墙遥控,操作方便。综合上述分析,本文介绍的是采用CCLL00收发器通过串口来实现PC机与单片机之间的双工无线通信。21单片机组成结构单片机的内部、外部结构一拿到一
9、块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。822单片机串行通信的基本方法单片机接收数据程序
10、框图PIC16C711单片机的RB0引脚具备外部引脚跳变沿中断功能,向RB0引脚送一个上跳沿或下跳沿信号,则INTCON寄存器的外部引脚跳变沿中断标志位INTF被置1。如果总中断和外部引脚跳变沿中断都使能,并且此时单片机没有执行其他中断服务子程序,程序进入INT中断服务子程序。根据异步串行通信的特点,通信线路空闲时单片机接收的是高电平,起始位到来时单片机接收到低电平,因此空闲位和起始位之间是一个下跳沿。单片机接收到下跳沿即起始位后,马上进入中断服务子程序,准备接收一帧数据。因此在主程序中设置由下跳沿引起外部引脚跳变沿中断。以下内容主要分析接收子程序即中断服务子程序。单9片机接收数据程序框图如图
11、3所示。图3单片机接收数据程序框图进入中断服务子程序后,首先保护中断现场,然后检测起始位是否是“真的”。由于可能存在的各种干扰,单片机有可能接收到的干扰信号正好是一个下跳沿,而实际上此时根本没有数据到来,从而造成误接收数据。因此检测起始位的真实性是有必要的。采取的方法是在52US起始位的中点后,检测一次RB0上的信号。程序框图中是延时47US后检测RB0上的信号,原因是保护中断现场的几条指令要耗费几个US。如果是低电平,则起始位是“真的”,否则为干扰信号,单片机清INTF标志位,然后退出中断服务子程序,回到主程序。若起始位是“真的”,则准备接收数据。本文规定数据位为8位,故首先设置接收计数器R
12、_CNT内容为8。然后将STATUS寄存器中的C位清零,并右移接收数据寄存器RCV_R。C的内容即0移人RCV_R最高位,接下来接收数据位。为尽量保证数据的准确性,应该在每位数据的中点检测该位数据。因此,检测第一位数据的时刻距离检测起始位的时刻应该是一位数据所占的时问即104US,此后的每一位数据检测时刻之间也是如此。此时又要用到延时程序。因为每10两次检测时刻之间除了延时之外,指令C清零、右移等指令还要占用时间,这些指令占用56S,因此,为了尽量保证在每一位的中心位置检测数据,延时时间定为98S。如果检测得到的数据位为1,则置RCV_R最高位为1。如果数据位为0,则不必改变最高位,因为C为0
13、且已经移人RCV_R的最高位。然后,将接收计数器内容减1。8位数据接收完毕后,清INTF标志。最后,退出中断服务子程序。至此,8位数据接收全部存放于RCV_R中。单片机发送数据程序框图用RB5引脚作为发送引脚,单片机发送数据程序框图如图4所示。当有数据要从单片机发往PC机时,单片机调用发送子程序。在发送子程序中,首先设置发送计数器内容为8,然后发送起始位,起始位应持续104US。因此要调用延时子程序,延时子程序执行完后,RB5上的信号并未立刻变成第一位数据的值,这是因为还要执行几条指令,如右移TRS_R、置位等RB5上的信号才会变化。假设延时104US,那么加上几条指令的执行时间,起始位就比1
14、04US宽了。因此,延时子程序少于104US,根据具体的程序定为97US。然后,右移发送数据寄存器TRS_R,将其最低位即要发送的数据位移入C中,再根据C中的内容将RB5清零或置1,然后将发送计数器内容减1,并判断其是否为0。若为1,则说明未发送完毕,继续发送;否则,发送停止位。最后,退出发送子程序。11图4单片机发送数据程序框图5PC机通信程序VB60提供了串行通讯MSCOMM电话盒控件来为应用程序提供串行通信,它将串口设备当作一个目标封装起来,容易操作,编程很方便,其良好的用户界面、简单方便的串行通信和实用性强的优点,无需借用其他语言就可以开发出优秀的通信软件,因而PC机软件采用VB60语
15、言编写。MSCOMM控件的调出及其主要属性如下。1MSCOMM控件的调出VB60的MSCOMM控件并不会主动出现在工具箱中,当需要它时,让它出现在工具箱中的步骤如下1选择菜单上的“工程”;2在“工程”菜单中选择“部件”;3出现对话框后,在可勾选的项目中勾选MICROSOFTCOMMCONTROL60;4按下“确定”按钮,即可在工具箱中见到“电话盒”的图标,就可以将此控件加载进行串行通信。2MSCOMM属性MSCOMM属性很多,其重要的属性说明如下12COMMPORT设定或返同通信端口号。端口号由1开始往上递增,最大值是16。SETTINGS设定通信端口初始化参数。其格式为“BAUD,P,D,S
16、”,其中BAUD为波特率,可设为1200、2400、9600、14400、19200和28800等几种;P为校验位E表示偶校验、O表示奇校验、M表示符号校验即在校验位放置一个1的位、S表示空白校验即在校验位放置一个0的位、N表示无校验位默认值;D为数据位数,可选值为4、5、6、7、8默认值;S表示停止位数,可选值为1、15、2。PORTOPEN设定并返回通信端口的状态。使用串行端口之前必须先打开该端口PORTOPENTRUE,而在使用完毕后必须关闭该端口PORTOPENFALSE。INPUT从输入缓冲区返回并清除字符。这是一种FIFOFIRSTINFIRSTOUT机制。如BUFFERMSCOM
17、M1INPUT,表示将输入缓冲区的字符读入BUFFER字符串变量中。OUTPUT将一个字符或字符串写入传输缓冲区,如MSCOMM1OUTPUT“ABCD“。此即将ABCD4个字符通过串行端口传送出去。INBUFERCOUNT传回在接收缓冲区中的字符数,是指已接收,并在接收缓冲区等待读取的字符数。INPUTMODE设定和返回类型。该属性设为0时,数据通过INPUT属性以文本方式取回,如设为1,则数据通过INPUT属性以二进制方式取回。为保证通信进行,首先做到单片机的串行口与主控机串行口的设置保持一致,即数据格式一致、通信波特率相同。如果是多点通信,每个从机要分配一个地址码。系统中协议有3种帧格式
18、呼叫帧、应答帧和数据帧。呼叫帧由主机发出。应答帧只能由从机发出。当从机收到呼叫帧后,把本机地址和当前状态回发给主机。设置开机自检、自诊断程序,机器不能带病工作;如果需要,还可以设置在工作空闲时或定时自检程序。单片机的串行通行模式2、3含第九位数据RB8/TB8可用于多机通信,然而PC机的帧格式的第九位为校验位,虽然可以通过软件使其置0或置1达到与单片机一样的格式,然而这种方法难以调试,所以本文是采用自行设计的帧格式进行通信。本课题中通信帧的帧结构定义如表1所示。通信帧的内容包括起始字节、地址字节、类型字节、数据长度字节、数据字节、校验和字节和结束字节。表1帧结构起始字节地址字节类型字节数据长度
19、字节数据字节效验和字节结束字节1字节1字节1字节1字节N字节1字节1字节起始字节定义为“”字符,其数值为0X24;结束字符定义为“”字符,其数值为0X2A。地址字节实际上存放的是下位机的设备号,分别为0X01、0X02、0X03注意,各下位机设备应避免重复地址。本课题的帧类型主要有6种,这由类型字决定,它们的值及说明如表2所示。表2帧结构中类型字节的定义指令类型字节说明ACTIVE0X11上位机询问下位机是否在位GETDATA0X22上位机发送采集命令READY0X33下位机应答在位SENDDATA0X44下位机发送采集的数据COMTEST0X55上位机发送数据通信测试RE_COMTEST0X
20、66下位机应答通信测试其中,ACTIVE、GETDATA、READY为单纯的指令帧,即数据字节为0字节,这3种指令帧的长度最短,仅为6字节。其他3种帧为相应的数据帧,数据字节长度N最大13为20,所以通信帧的帧长最大为26字节。采用上述的帧格式传输,既可区分不同的单片机,又可区分不同的帧类型,这样就避免正在通信的某个单片机发送的帧对其他单片机造成干扰。由于使用RS485总线结构,所以该系统工作方式为半双工。PC机串口置波特率为9600BPS,无奇偶校验,8位数据位,1位起始位,1位停止位。单片机串口工作于方式1,通过设置T1的TH1,TL1使波特率也为9600BPS。整个系统的通信还需遵守以下
21、协议PC机主导整个通信过程。由PC选择与其通信的下位机设备号地址。PC机在发送完“ACTIVE”指令后,进入接收状态,同时开启超时控制。如果接收到错误帧则继续等待,如果在规定的时间内未能收到下位机的返回指令“READY”,则认为下位机不在位,并给出告示。PC机收到下位机的返回指令“READY”后,可以发送“GETDATA”或“COMTEST”指令,同样开启超时控制。如收到相应的响应帧,则处理之。如果接收到错误帧则继续等待,如果在规定的时间内未能收到下位机的返回指令,则认为下位机未准备好或不在位,并给PC机告示。下位机复位后,将等待上位机发送指令,并根据具体的指令内容作出应答。如果接收的指令帧或
22、数据帧错误,则会直接丢弃该帧,不做任何处理。21总体框图此双工无线通信系统的总体框图如图1所示。由于此系统可实现双工通信,因此它可分为两个通信过程PC机上位机通过上位机程序界面发送数据给单片机,并送给液晶屏显示相应的数据;键盘输入数据传给单片机,接着发送给PC机,并在PC机上位机程序界面上显示出来。324串行通信模块YN开中断串口是否空闲发送数据14图4系统硬件详细设计图1电平转换电路PC机的串行口采用的是标准的RS232接口,单片机的串行口电平是FTL电平,而TTL电平特性与RS232的电气特性不匹配,因此为了使单片机的串行口能与RS232接口通信,必须将串行口的输入输出电平进行转换。通常用
23、MAX232芯片来完成电平转换。23主要芯片的介绍1S232串行接口标准目前RS232是PC机与通信工业中应用最广泛的一种串行接口。RS232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地。典型的RS232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在515V,负电平在515V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS232电平再返回TTL电平。接收器典型的工作电平在312V与312V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差
24、,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20KBPS。RS232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3K7K。所以RS232适合本地设备之间的通信。231单片机AT89S52AT89S52是低功耗,高性能CMOS8位单片机,可反复擦写1000次的FLASH只读程序存储器,兼容标准MCS51指令系统及80C51引脚结构,其主要特点为(1)、40个引脚DIP40封装,8KBYTESFLASH片内程序存储器;(2)、256BYTES的随机存取数据存储器(RAM);(3)、5个中断优先级2层中断嵌套中断;接收数据关空闲信号返回15(4)、2个16位可编
25、程定时计数器,2个全双工串行通信接口。其引脚封装如图5所示;主要引脚介绍如下图5单片机AT89S52封装图(1)VCC、GND电源、接地引脚;(2)XTAL1、AXTAL2外部振荡器接入的两个引脚;(3)RESET复位信号输入引脚;16(4)RXD、TXDP3口作第二功能引脚用作串行通信接口输入、输出引脚;(5)P01P07数据/地址总线引脚;P10P17一般的I/O口;P20P27一般的I/口。2单片机部分单片机部分包括单片机、复位电路和时钟电路。它将串口送过来的数据传输给CC1100收发器,或者将CCLL00收发器传送过来的数据通过串口给PC机。单片机的复位电路和时钟电路是单片机工作所必需
26、的。3软件设计本系统的软件设计方面包括上位机程序和单片机程序的设计。上位机程序要实现的功能是在电脑上显示一个操作界面,它可代替串口调试工具。1MSCOMMMICROSOFTCOMMUNICATIONCONTROL控件介绍MSCOMM控件是MICROSOFT为简化WINDOWS下串行通信编程而提供的ACTIVEX控件。每个MSCOMM控件对应着一个串行端口,在使用MSCOMM控件时,1个MSCOMM控件只能同时对应一个串口。MSCOMM控件有很多重要的属性,其中常用的是如下几个1COMMPORT设置并返回通信口号,缺省值为OM1,可设置116个。2SETSTRINGS设置并返回波特率、奇偶效验、
27、数据位、停止位的字符串。其中波特率的范为。3PORTOPEN设置并返回通信口的状态,同时来打开和关闭通信口。4INPUTLEN决定每次INPUT读入的字符个数,缺省为0,表示读取接受缓冲区的全部内容。5INPUT读入并清除接收缓冲区的字符。6INBUFFERCOUNT返回接收缓冲区已接收的字符数,通过置0可清除接收缓冲区。7OUTPUT将发送的字符串或数组写到发送缓冲区。8INPUTMODE定义INPUT属性获得数据的方式0为文本;1为二进制。2PC机的软件设计1初始化端口。通信接口部分软件的初始化主要是对串口的初始化,如设置波特率、定义发送缓冲区大小等等。只需在主程序DCDLGCPP的初始化
28、函数中加入如下代码BOOLCPCDLGONINITDIALOG/TODOADDEXTRAINITIALIZATIONHEREM_COMSETCOMMPORT1/选择COML17M_COMSETINBUFFERSIZE512/设置输入缓冲区大小,单位为BYTEM_COMSETOUTBUFFERSIZE512/设置输出缓冲区大小,单位为BYTEM_COMSETPORTOPENTRUE/打开串口M_COMSETSETTINGS“9600,N,8,1“/设置波特率、奇偶效验、数据位和停止位参数M_COMSETINPUTMODE1/设置输入模式。1表示以二进制方式检取数据M_COMSETRTHRESHO
29、LD1/参数1表示接收1个以上字符时,就触发ONCOMM事件M_COMSETINPUTLEN0/设置当前接收区数据长度为0M_COMGETINPUT/先预读缓冲区以清除残留数据2发送数据。流程图中的“发送ACTIVE帧”在其相应得函数中添加代码如下。VOIDCPCDLGONBUTTONCONNECT/TODOADDYOURCONTROLNOTIFICATIONHANDLERCODEHEREINTIDM_CBOXGETCURSEL/获取地址BYTEADDR30X01,0X02,0X03SEND_FRAMEADDRID,ACTIVE,0,M_STRSEND/其中SEND_FRAME为发送一完整帧。
30、3读取串口。对于上位机,软件编程的难点和重点就是读取串口,上面MSCOMM控件添加了函数ONCOMM,在该函数中添加代码,就能实现对串口事件的处理。而函数GETINPUT返回的是VARIANT类型,而编辑框中显示的是CSTRING类型,因此必须进行类型转换。先将其转换为COLESAFEARRAY型,再转为BYTE数组,进而转为CSTRING类型。以下为常见的处理VOIDPCDLGONCOMM/TODOADDYOURCONTROLNOTIFICATIONHANDLERCODEHEREVARIANTM_INPUT1COLESAFEARRAYM_INPUT2LONGLEN,I18BYTEDATA51
31、2CSTRINGSTRIFM_COMMGETCOMMEVENT2/接收事件M_INPUT1M_COMMGETINPUT/读取缓冲区数据M_INPUT2M_INPUT1/VARIANT转COLESAFEARRAYLENM_INPUT2GETONEDIMSIZEFORI0IINCLUDEDEFINENOP_NOP_DEFINEUCHARUNSIGNEDCHARDEFINEUINTUNSIGNEDINTDEFINESCAN_CYCLE500/CONSTANTTABLES/STATICCONSTCHARC_KEYCODE160X01,0X02,0X03,0X0A,/键盘1,2,3,A/0X04,0X0
32、5,0X06,0X0B,/键盘4,5,6,B/0X07,0X08,0X09,0X0C,/键盘7,8,9,C/0X0E,0X00,0X0F,0X0D/键盘,0,D/CONSTANTTABLESOVER/DA转化DAC5618SBITDINP13/定义P13为串行数据口SBITCLKP14/P14为串行时钟端SBITCSP15/P15为片选端/AD转化MAX187SBITSCLKP16/MAX187时钟25SBITCS187P17/MAX187片选SBITSDOUTP30/MAX187数据输出/SYSTEMVARIABLES/、UINTKEYFLAGUCHARHOUR10MIN0SEC0UCHAR
33、DISPLAYARRAY6STATICUCHARLEDFLAG0BITLEDCYCLE100MSFLAG0,LEDCYCLE500USFLAG0,LEDCYCLE10MSFLAG0,LEDAUTOFLAG1,LEDKEYFLAG0STATICUCHARS_MUSICCOUNTER0X00,S_TABLECOUNTERUCHARINT0FLAG,TH0GLOBAL,TL0GLOBALUCHARUARTKEYFLAG0XAA,MODIFYTIMEFLAG0/SYSTEMVARIABLESOVER/SYSTEMFUNCTIONS/VOIDLOGINVOIDVOIDMAINSYSTEMVOID/系统主
34、程序/VOIDSCANKEYSVOID/扫描键盘模块/UCHARKEYJUDGEVOID/按键预处理/VOIDKEYHANDLEUCHARKEYINDEX/按键处理模块/VOIDLEDHANDLEVOID/流水灯方案选择/VOIDAUTOSHOWVOID/开始流水灯自动循环演示/VOIDSTOPAUTOSHOWVOID/停止流水灯自动循环演示/VOIDDROPDOWNVOID/水滴方案/VOIDCIRCLEFLASHVOID/环扫方案/VOIDGRADUALFLASHVOID/渐明渐暗方案/VOIDSLOWFLASHVOID/慢闪方案/VOIDFASTFLASHVOID/快闪方案/VOIDSC
35、RSHIFTUCHARKEYINDEX/六位数码管顺序左移/VOIDCLEARSCRVOID/清屏/VOIDSTATUSSENDVOID/下位机状态反馈(串口)/VOIDDELAYUINTVALUE/10US延时/VOIDMODIFYTIMEVOID/调整时间/VOIDSCANSEG7/数码管扫描显示/SYSTEMFUNCTIONSOVER/VOIDMAINVOID/主程序入口/TMOD0X11/TIMER0工作在案MODE1,16位定时器,TIMER1工作在MODE2,自动重新装载模式/|定时器1|定时器1|/|GATE|C/T|M1|M0|GATE|C/T|M1|M0|/26TH06553
36、6SCAN_CYCLE/256/设定TIMER0每隔SCAN_CYCLEU中断一次/TL065536SCAN_CYCLE256TR01/启动TEMER0/TH16553610000/256/设定TIMER1每10MS中断一次/TL16553610000256T2CON0X38/令定时器2作为串口波特率发生器/|TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|/TL20XD9/设定串口波特率为9600,晶振为12MHZ/TH20XFFRCAP2L0XD9/根据串口波特率9600设定自动重载寄存器/RCAP2H0XFFTR21/启动定时器2/SCON0X50/设定
37、UART工作在MODE3模式,可传送和接收数据,REN1/|SM0|SM1|SM2|REN|TB8|RB8|TI|RI|/IE0X9A/使能总中断、TIMER0,1中断、外部中断1,2/|EA|ET2|ES|ET1|EX1|ET0|EX0|/IP0X12/优先TIMER0中断/|PT2|PS|PT1|PX1|PT0|PX0|/CLEARSCR/预清屏/P3_31/关喇叭/P20X00/点亮8个发光二极管/WHILE1LOGINVOIDLOGINVOID/系统登录模块/STATICUINTS_UARTSENDCOUNTERUCHARKEYPTRTR11/启动系统时基TIMER1,10MS/KEY
38、PTRKEYJUDGE/键盘扫描判断/IFKEYPTR0X55SWITCHC_KEYCODEKEYPTRCASE0X0ACASE0X0BCASE0X0CCASE0X0DCASE0X0ECASE0X0FCLEARSCR/清屏/27LOGINBREAKDEFAULTSCRSHIFTKEYPTR/以上均不是则为数字键,六位数码管顺序左移/BREAKUARTKEYFLAG0XAA/清串口键盘命令标志位/IFS_UARTSENDCOUNTER200/定期上传系统状态/S_UARTSENDCOUNTER0STATUSSENDCLEARSCR/清屏/LEDFLAG0X01MODIFYTIME/初始设定时间/
39、WHILE1MAINSYSTEM/进入系统主程序/VOIDMAINSYSTEMVOID/系统主程序/STATICUINTS_UARTSENDCOUNTERUCHARKEYPTRKEYPTRKEYJUDGE/键盘扫描判断/IFKEYPTR0X55/如果按某键则进行相应处理/KEYHANDLEKEYPTRUARTKEYFLAG0XAA/清串口键盘命令标志位/LEDHANDLE/流水灯处理模块/IFS_UARTSENDCOUNTER200/定期上传系统状态/S_UARTSENDCOUNTER0STATUSSENDIFMODIFYTIMEFLAG1MODIFYTIME/根据新秒值调整时间/MODIFY
40、TIMEFLAG0/28VOIDSCANKEYSVOID/扫描键盘模块/UCHARSCANVALUE0XEF,ISCAN,SCANTEMPUCHARFORISCAN0ISCAN1/如果不止一个键被按则丢弃此状态返回无按码0X55/RETURN0X55ELSE/某键被按,返回此键的标识码/RETURNKEYRETIFUARTKEYFLAG0XAA/如果上位机发键盘指令则返回此键盘值/RETURNUARTKEYFLAGRETURN0X55/VOIDKEYHANDLEUCHARKEYINDEX/按键处理模块/SWITCHC_KEYCODEKEYINDEX/按数字键N循环播放第N首音乐/CASE0X0
41、0BREAKCASE0X01BREAKCASE0X02BREAK30CASE0X03BREAKCASE0X04BREAKCASE0X05BREAKCASE0X06BREAKCASE0X07BREAKCASE0X08BREAKCASE0X09BREAKCASE0X0ASEC/按A键调整时钟秒值/MODIFYTIMEBREAKCASE0X0BMIN/按B键调整时钟分值/MODIFYTIMEBREAKCASE0X0CHOUR/按C键调整时钟时值/MODIFYTIMEBREAKCASE0X0DBREAKCASE0X0EIFLEDKEYFLAG1/按键开始/停止流水灯自动演示/AUTOSHOWLEDKE
42、YFLAGLEDKEYFLAGELSESTOPAUTOSHOWLEDKEYFLAGLEDKEYFLAGBREAKCASE0X0FIFLEDFLAG5/按键流水灯方案循环切换/LEDFLAG1BREAKDEFAULTBREAK/VOIDLEDHANDLEVOID/流水灯方案选择/SWITCHLEDFLAG/判断该演示的流水灯方案/CASE0X01DROPDOWNBREAK/水滴方案/CASE0X02CIRCLEFLASHBREAK/环扫方案/CASE0X03GRADUALFLASHBREAK/渐明渐暗方案/31CASE0X04SLOWFLASHBREAK/慢闪方案/CASE0X05FASTFLA
43、SHBREAK/快闪方案/VOIDAUTOSHOWVOID/开始流水灯自动循环演示/LEDFLAG1LEDAUTOFLAG1/VOIDSTOPAUTOSHOWVOID/停止流水灯自动循环演示/LEDAUTOFLAG0/VOIDDROPDOWNVOID/水滴方案/STATICUCHARS_DROPDOWNCOUNTER0,S_DROPDOWN_I7,S_DROPDOWN_OVERCOUNTERUCHARRESTIFLEDCYCLE100MSFLAG1/判断100MS是否到/LEDCYCLE100MSFLAG0RESTS_DROPDOWNCOUNTER8P20X017S_DROPDOWN_I/使水
44、滴流到某个灯并且让流到底的灯常亮/IFS_DROPDOWNCOUNTER8S_DROPDOWN_I7/判断一个水滴流程是否完成/S_DROPDOWNCOUNTER8S_DROPDOWN_I/每流完一个流程下一个水滴的流程就要相应减少一个灯/S_DROPDOWN_IIFS_DROPDOWN_I0/整个水滴流程完了吗/S_DROPDOWN_I7S_DROPDOWNCOUNTER0IFS_DROPDOWN_OVERCOUNTER1/一个完整水滴流程完了之后如果自动演示功能打开则跳到下一方案/S_DROPDOWN_OVERCOUNTER0IFLEDAUTOFLAG1LEDFLAG32ELSES_DRO
45、PDOWNCOUNTER/VOIDGRADUALFLASHVOID/渐明渐暗方案/STATICUCHARS_GRADUALFLASH_I10,S_FLASHCOUNTER,S_GRADUALFLASH_OVERCOUNTERSTATICBITS_GRADUALFLASH_I_FLAG0IFLEDCYCLE500USFLAG1/判断500US是否到/LEDCYCLE500USFLAG0IFS_FLASHCOUNTER100/PWM周期为10500US5MS,判断PWM周期到否/IFS_FLASHCOUNTER1010/改变PWM占空比前先判断延时105MS50MS到否/没到在此周期内占空比保持不
46、变/S_FLASHCOUNTER0IFS_GRADUALFLASH_I_FLAG0/需要渐明则调高占空比/S_GRADUALFLASH_IELSE/需要渐暗则调低占空比/S_GRADUALFLASH_IIFS_GRADUALFLASH_I0|S_GRADUALFLASH_I10/如果渐明或渐暗完毕则交换/33S_GRADUALFLASH_I_FLAGS_GRADUALFLASH_I_FLAGIFS_GRADUALFLASH_OVERCOUNTER6/渐明渐暗6/23个周期后如果自动演示功能打开则跳到下一方案/S_GRADUALFLASH_OVERCOUNTER0IFLEDAUTOFLAG1LE
47、DFLAG/VOIDCIRCLEFLASHVOID/环扫方案/STATICUCHARS_CIRCLEFLASHCOUNTER,S_CIRCLE_OVERCOUNTERIFLEDCYCLE100MSFLAG1/判断100MS是否到/LEDCYCLE100MSFLAG0P20X018/8个灯都亮过以后再重新开始/S_CIRCLEFLASHCOUNTER0IFS_CIRCLE_OVERCOUNTER5/循环5遍后如果自动演示功能打开则跳到下一方案/S_CIRCLE_OVERCOUNTER0IFLEDAUTOFLAG1LEDFLAG/VOIDSLOWFLASHVOID/慢闪方案/STATICUCHAR
48、S_SLOWFLASHCOUNTERIFLEDCYCLE100MSFLAG1/判断100MS是否到/34LEDCYCLE100MSFLAG0IFS_SLOWFLASHCOUNTER50/判断5100MS500MS是否到/P2P2/每500MS灯亮灭改变一次/IFS_SLOWFLASHCOUNTER/56/慢闪6/23个周期以后如果自动演示功能打开则跳到下一方案/S_SLOWFLASHCOUNTER0IFLEDAUTOFLAG1LEDFLAG/VOIDFASTFLASHVOID/快闪方案/STATICUCHARS_FASHFLASHCOUNTERIFLEDCYCLE100MSFLAG1/判断10
49、0MS是否到/LEDCYCLE100MSFLAG0P2P2/每100MS灯亮灭改变一次/IFS_FASHFLASHCOUNTER30/快闪30/215个周期以后如果自动演示功能打开则跳到下一方案/S_FASHFLASHCOUNTER0IFLEDAUTOFLAG1LEDFLAG1/VOIDSCRSHIFTUCHARKEYINDEX/六位数码管顺序左移/UCHARIFORI5I0IDISPLAYARRAYIDISPLAYARRAYI135DISPLAYARRAY0C_KEYCODEKEYINDEX/VOIDCLEARSCRVOID/清屏/UCHARIFORI0I0ISBUFDISPLAYARRAYI1WHILETI1TI0SBUFS_MUSICCOUNTERWHILETI1TI0SBUFLEDFLAGWHILETI1TI0IE|0X10/VOIDDELAYUNSIG