单片机原理及系统课程设计专业:电气工程及其自动化班级:电气091姓名:学号:指导教师:2012 年 7月1日1 引言基于单片机课程的学习,在本次课程设计中利用单片机实现时钟的显示,利用键盘和门电路控制时间的调整,在设计上采用硬件计数与软件计数相结合的方式,并且定时器T0采用了中断方式。
2 系统方案及原理本次课程设计是用80C51单片机CPU及接口电路设计一个数字时钟,其核心部件是80C51,时钟的显示采用6个共阴极LED显示灯,四个开关方便的对秒、分、时分别调整,保证功能完善,工作可靠。
硬件方面:独立式键盘可以消除时间误差的和方便时间的调整;显示电路采用LED动态显示方式,共阴极端由P2口线控制,分为段选线和位选线,利用人的视觉停留达到显示的效果,段选线控制字符选择,位选线控制显示位的亮或暗,从而简化串行口线的连接。
软件方面:四个键盘输入与门74LS21,其输出用作中断信号,当四个键盘有一个键按下后就会向CPU申请中断,这样就可以提高CPU 工作效率,达到调整时间的快速性与准确性;定时采用片内定时器定时,提高了电子时钟的准确度。
显示电路可以采用点阵液晶显示模块(LED)。
一上电,数码管显示的起始时间为0时0分0秒,也就是数码管显示000000,然后每过一秒,秒位加一,到9后10秒位加一,秒位回0.10秒位显示5,秒位显示9后一秒,分钟加一,秒位回0。
以此类推,时钟显示的最大值位23小时59分钟59秒。
3 硬件设计3.1 硬件原理图根据要求,设计一个时钟。
能够显示时间格式为时.分.秒,并且设置键盘,根据按键任意调整时间。
利用8051内部定时器0与软件结合来实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
显示部分用共阴极的LED显示等显示。
硬件原理图如图一所示。
四个开关方便的对秒、分、时分别调整,保证功能完善,工作可靠,定时采用片内定时器定时,提高了电子时钟的准确度。
根据题目要求设计的总体框图,如图1所示。
图1 硬件原理图3.2Proteus仿真图根据硬件原理电路,用在Keil生成hex的可执行文件,仿真结果如图2所示。
图2 Proteus仿真结果4 软件设计4.1序包括以下几个部分:(1)主程序:主程序主要完成系统的初始化,以及对数码显示管和键盘子程序的调用。
主程序流程图如图3所示。
图3 主程序流程图(2)键盘扫描子程序:返回键值键盘扫描子程序流程图如图4所示。
图4 键盘扫描子程序流程图(3)处理子程序:确定按键的位置,并进行处理。
(4)显示子程序:将显示缓冲区的数据送到LED显示器显示。
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
显示子程序流程图如图5所示。
图5 显示子程序流程图5 总结历时一周的单片机课程设计结束了,此次课程设计中,我所做的是要用8051单片机及其他部件完成一个电子时钟。
可以实现电子钟的走时和校对;电子钟上电时开始走,通过6个LED显示时、分、秒;通过按键可以进行时间的调整。
在完成设计的过程中,我遇到了一些问题,在用Keil uVision3调试程序时,软件提示说“代码”超过2k。
这个问题困扰了我半天的时间。
后来我直接编译、编译连接、全部重建、停止编译和对工程进行设置,生成了名为cs.hex文件。
之后在Proteus中画图仿真。
通过这次单片机课程设计,我不仅将上学期所学的单片机知识应用到设计中,同时更进一步学习了80C51。
了解了74HC373驱动芯片、4LS21等芯片。
更加熟悉了Keil和Proteus的使用。
至于用Visio画流程图,这很简单,以前的课程设计过程中一直是不可缺少的,所以比较熟悉。
每次课程设计都会遇到一些问题,随着问题的解决自己又学到了更多的知识。
6 参考文献[1] 李华.单片机原理及应用[M].北京:兰州大学出版,2001.[2] 于殿泓,单片机原理实验教程[M].西安:西安电子科技大学出版社,2007.[3]蔡明文,冯先成.单片机课程设计[M].武汉:华中科技大学出版社,2007.附录源程序代码:ORG 0000HAJMP STARTORG 0003HLJMP ST1ORG 000BHAJMP TT0ORG 0030HSTART: MOV 30H,#00H ;秒显示个位内存单元MOV 31H,#00H ;秒显示十位内存单元MOV 32H,#00H ;分显示个位内存单元MOV 33H,#00H ;分显示十位内存单元MOV 34H,#00H ;时显示个位内存单元MOV 35H,#00H ;时显示十位内存单元MOV TMOD,#01H ;定时器T0,工作方式1,MOV TH0,#3CH ;定时50MSMOV TL0,#0B0HMOV R0,#30H ;指针指向显示单元MOV R5,#0FEH ;选中秒个位MOV R1,#20MOV 36H,#00H ;时位键盘判断时用MOV R3,#6 ;秒十位判断时用MOV R2, #6 ;分十位判断时用MOV R4,#10MOV 40H,#10MOV IE, #81HSETB EA ;开中断SETB ET0 ;开T0中断SETB TR0 ;记时开始MAIN: LCALL DISLJMP MAIN; 显示子程序DIS: MOV A,R5 ;先位码MOV DPTR,#7FFFH ;位码选择p2.7MOVX @DPTR,AMOV A,@R0 ;再段码MOV DPTR,#TAB ;表地址MOVC A,@A+DPTR ;查表MOV DPTR,#0BFFFH ;段码选择p2.6; 显示小数点CJNE R0,#32H,GO111 ;小数点选择(R0)=/=32H转移ORL A,#80HGO111: CJNE R0,#34H,MINORL A,#80HMIN: MOVX @DPTR,A ;送出去显示LCALL DELAY ;1MS延时LCALL DELAYLCALL DELAYINC R0 ;修改指针指向下一显示单元MOV A,R5 ;也可写为XCH A,R5JNB ACC.5,LH ;判断显示完否?RL A ;也可写为XCH R5,AMOV R5,AAJMP ENR ;返回循环显示LH: MOV R0,#30H ;重心定义显示指针MOV R5,#0FEH ;重设位码,形成循环ACC.0-ACC.3 ENR: RET; 定时中断TT0:MOV TH0,#3CHMOV TL0,#0B0HDJNZ R1,FANHUI ;判断1秒到否?未到跳转MOV R1,#20INC 30H ;秒个位加一DJNZ R4,FANHUI ;判断10秒到否?未到跳转MOV R4,#10MOV 30H,#00HINC 31HDJNZ R3,FANHUIMOV R3,#6MOV 31H,#00HINC 32HDJNZ 40H,FANHUIMOV 40H,#10MOV 32H,#00HINC 33HDJNZ R2,FANHUIMOV R2,#6MOV 33H,#00HINC 36H ;时位判断时用MOV A,36HCJNE A,#24,JUMPMOV 36H,#00HJUMP: MOV A,36HMOV B,#10DIV ABMOV 34H,BMOV 35H,AFANHUI: RETI; 键盘处理程序ST1: CLR EX0 ;键盘1判断时用PUSH BPUSH ACCJB P1.0,ST2LCALL DELAY111JNB P1.0,$LCALL DELAY111DJNZ R3,GOMOV R3,#6GO: INC 31HMOV A,31HCJNE A,#6,$+3JNB P1.0,$JC ST2MOV 31H,#00HMOV A,31HST2: JB P1.1,ST3 ;键盘2判断时用LCALL DELAY111JNB P1.1,$LCALL DELAY111DJNZ 40H,GO1MOV 40H,#10GO1: INC 32HMOV A,32HCJNE A,#10,$+3JNB P1.1,$JC ST3MOV 32H,#00HMOV A,32HST3: JB P1.2,ST4 ;键盘3判断时用LCALL DELAY111JNB P1.2,$LCALL DELAY111DJNZ R2,GO2MOV R2,#6GO2: INC 33HMOV A,33HCJNE A,#6,$+3JNB P1.2,$JC ST4MOV 33H,#00HMOV A,33HST4: JB P1.3,ST6 ;键盘4判断时用LCALL DELAY111JNB P1.3,$LCALL DELAY111INC 36HMOV A,36HCJNE A,#24,JUMP1MOV 36H,#00HJUMP1: MOV A,36HMOV B,#10DIV ABMOV 34H,BMOV 35H,AST6: POP ACC ;键盘中断返回POP BSETB EX0RETI; 延时1MS子程序DELAY: MOV R7,#02HDE1: MOV R6,#0FEHDE2: DJNZ R6,DE2DJNZ R7,DE1RET; 键盘延时消抖程序DELAY111:MOV 50H,#2 ;键盘消抖程序DE1111: MOV 51H,#255DJNZ 51H,$DJNZ 50H,DE1111RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H END。