《单片机课程设计》报告
学 院: 电子与信息学院 专业班级: 组 员: 申请等级: 良好 提交日期: 2013-06-26
1
目录
1设计思路 ................................................................................................................................ 3
1.1功能要求 .............................................................................................................. 3 1.1.1分离模块要求 ............................................................................................... 3 1.1.2主模块要求 ................................................................................................... 3 1.2 设计思路 ............................................................................................................. 3
2 设计流程 ............................................................................................................................... 4
2.1按键检测 .............................................................................................................. 4 2.2主模块 .................................................................................................................. 4 2.2.1 北京时间的显示 .......................................................................................... 4 2.2.2 时间的调校 .................................................................................................. 5 2.2.3 跳出主模块 .................................................................................................. 6 2.3分离模块 .............................................................................................................. 6 2.3.1 1234的显示 ............................................................................................. 6 2.3.2 IOY的显示 ............................................................................................... 6 2.3.3 进入主模块 .................................................................................................. 6 2.4 串口通信以及键盘、显示功能模式编码 ......................................................... 7 2.4.1 串口通信 ...................................................................................................... 7 2.4.2键盘、显示功能模式编码 ........................................................................... 8 2.5显示模块 ............................................................................................................ 10 2.6 整个程序的简单流程图 ................................................................................... 11
3心得体会 .............................................................................................................................. 12
3.1以及调试过程中遇到的问题: ........................................................................ 12 3.2 心得体会: ....................................................................................................... 12
4代码 ...................................................................................................................................... 13
2
1设计思路
1.1功能要求 1.1.1分离模块要求
1)设计一个可以显示1234的显示电路,并利用单片机实现。 2)利用按键切换,然后显示I0Y
3)按键切换的动作,全部用串口进行通信。
设计一个开关,当进行切换后,程序再进入主要要求。
1.1.2主模块要求
1) 显示准确的北京时间(时、分),可用24小时制式; 2) 随时可以调校时间。
3) 增加公历日期显示功能(月、日); 4) 随时可以调校月、日;
5) 允许通过转换功能键转换显示时间或日期。
6) 所有按键需要通过串口自发自收来调校各种功能。
1.2 设计思路
首先,要求有一个主模块和一个分离模块,可以各自写程序,然后用一个按键来实现它们之间的跳转,那就首先应做按键检测,以判断选择的是什么模块
其次是显示的问题,由于要显示的内容比较多,为了简化代码,拟写一个显示的子程序,只要更改寄存器里的值,显示出来的东西也随之改变
接下来是北京时间的显示以及调校。要先要有一个准确的计时,然后先实现秒,60秒进1实现分,60分进1实现时···以此类推来实现一个准确的北京时间;调校的话就是通过按键实现对时间进行各自的加减
再接下来是串口通信的问题,在本次课程设计,其实就是自发自收。首先是要有数据可以发送,明显就是每按下一个键,就发送一个数据,然后再接收这个数据,其次就是每次进行串口通信都会引发一次中断,所以应该做好数据的入栈保护。
最后,综上分析,应该给每个按键设定一个编码,这个编码也就是串口通信要发送和接收的数据;此外,由于要实现的功能比较多,跳转容易出错,而且为了简化代码,拟把每个功能与按键也用按键编码联系起来。即按键-串口通信-功能一一对应。
3
2 设计流程
2.1按键检测
按键检测的思路是先检测是否有键按下,有键按下再判断是哪个键按下。为了判断准确,第一次判断有按键按下后,要延时去抖,再判断是否仍是有按键按下,有则才是真的有按键按下。延时时间应大于5Ms,本程序采用10Ms。 程序是参照课本第七章160页的例子写出来的。大致流程如下图所示: P2.7~P2.0为0F0H
P2.7~P2.0为0F0H?
10Ms延时去抖
无键按下 P2.7~P2.0为0F0H? 否
有键按下
2.2主模块
2.2.1 北京时间的显示
使用T0定时器进行计时,设定为每20毫秒中断一次。用1区寄存器的R0来对中断次数进行计数,R2-R7依次存放着年、月、日、时、分、秒。
4
关键点——数码管的显示是独立的,是被调用而已。定时器的每次中断都会调用数码管的显示以达到数据刷新的目的。 时间显示的大致框图如下所示:
2.2.2 时间的调校
定时器每20Ms中断一次 中断50次则秒数加1 60秒则分数加1,秒数清零 60分则时数加1,分数清零 24时则天数加1,时数清零 1、3、5、7、8、12月则31天时月数加1,天数清零 4、6、9、11月则30天时月数加1,天数清零 闰年的2月则29天时月数加1,天数清零 平年的2月则28天时月数加1,天数清零 12月则年数加1,月数清零 对于年、月、日、时、分、秒,各自设定两个键来进行加1以及减1。 关键点——每次调校完时间后都要调到时间的显示模块,以更新数据。
5
2.2.3 跳出主模块
设置一个按键用于跳出主模块,之后可以 重新选择分离模块或者主模块
2.3分离模块 2.3.1 1234的显示
作为一个独立的模块,用一个按键进行调用。
为了实现能够达到依次显示1111-2222-3333-4444的效果,用了一个最简单的方法,就是利用主模块里的秒的个位数来实现。秒的个位数为0~9,加个判断,只有在个位数为1~4的时候数码管才会显示,否则不予以显示,则可以达到1111-2222-3333-4444的效果。
2.3.2 IOY的显示
也是作为一个独立的模块,用一个按键进行调用。
直接在寄存器放入要显示的数据104,则数码管会直接显示出来。
2.3.3 进入主模块
设置一个按键用于跳进主模块
6
2.4 串口通信以及键盘、显示功能模式编码 2.4.1 串口通信
部分参数设置如下:
定时器T1选择工作模式2,用于产生波特率。采用8位自动重装模式产生波特率。波特率设为2400bit/s,预置值为0F3H。 设置波特率加倍。串口通信选择方式1,REN=1,允许接收。 允许串行口中断,串行口中断优先级设为高优先级。
参照课本第七章183页的例子写出来的。主要是在查键程序的基础上进行一些修改以及添加。
融入查键的串口通信发送端流程图如下: 初始化 串行发送 按键按下? N 按键释放? Y 延时10ms Y N 按键释放? N TI=1? Y 清标志TI N N 数据显示
Y 延时10ms Y 按键按下? 接收端中断服务流程图如下所示:
7
中断服务 清标志RI 串口取数 数据存RAM
中断返回 2.4.2键盘、显示功能模式编码
单片机按键本身的编码如下:
S1 0E7H S2 0D7H S3 0B7H S5 0EBH S6 0DBH S7 0BBH S9 0EDH S10 0DDH S11 0BDH S13 0EEH S14 0DEH S15 0BEH 模式编码如下:
#01H对应MOD1: 显示分、秒 #02H对应MOD2: 显示日、时 #03H对应MOD3: 显示年、月 #04H对应MOD4: 跳到分离模块 #05H对应MOD5: 年加1 #06H对应MOD6: 年减1 #07H对应MOD7: 月加1
8
S4 77H S8 7BH
S12 7DH S16 7EH
#08H对应MOD8: 月减1 #09H对应MOD9: 日加1 #0AH对应MOD10: 日减1 #0BH对应MOD11: 时加1 #0CH对应MOD12: 时减1 #0DH对应MOD13: 分加1 #0EH对应MOD14: 分减1 #0FH对应MOD15: 秒加1 #010H对应MOD16: 秒减1
#0AAH对应MOD17: 分离模块的显示1~4 #0BBH对应MOD18: 分离模块的显示IOY
对键盘按键进行编码并与显示功能模式进行一一对应如下: S1——MOD1、MOD17 (进入主模块之前为MOD17,进入之后为MOD1)
S2——MOD2、MOD18(进入主模块之前为MOD18,进入之后为MOD2)
S3——MOD1、MOD3(进入主模块之前为MOD1,进入之后为MOD3) S4——MOD4、MOD 18(进入主模块之前为MOD18,进入之后为MOD4)
以下的均为在主模块中才有效的按键: S5——MOD5
S6——MOD6
9
S7——MOD7 S9——MOD9
S8——MOD8
S10——MOD10 S12——MOD12 S14——MOD14 S16——MOD16
S11——MOD11 S13——MOD13 S15——MOD15
2.5显示模块
用0区寄存器存储要显示的数据以及数码管的片选信号: R0—R3用于片选数码管,1则选中,0则不选中 R4用于显示年或者日或者分的十位数 R5用于显示年或者日或者分的个位 R6用于显示月或者时或者秒的十位数 R7用于显示月或者时或者秒的个位数
根据单片机上的595芯片的存储特点,再参考书上关于数码管显示的代码写出显示的子程序,可直接调用。
10
大致流程图如下:
显示 片选数码管 将B寄存器的值一位一位地写进595芯片 将存在0区寄存器R4~R7的数据赋给B寄存器
2.6 整个程序的简单流程图
整个程序的简单流程图如下所示:
检测是否有键按下 否 是 判断哪个键按下 串口通信,发送按下的键对应的模式的编码 实现相应模式的功能 11
3心得体会
3.1以及调试过程中遇到的问题
1)程序比较长,跳转、循环比较多,出现过很多次的逻辑混乱 2)参数设置不当导致效果出不来或者结果出错 3)也遇到过程序进入死循环,死胡同的情况 4)由于程序块位置摆放不对,导致跳转出错
5)对汇编语言、单片机原理以及开发板结构都不是特别了解,所以部分程序(查键、串口通信)是参考课本例子才写得出来 6)对汇编语言的掌握还不够好,部分语句使用失当
7) 对相关芯片功能理解不清晰,导致编程中出现逻辑上的错误而难以察觉 8 )在子程序的调用中,常常会不自觉地改变了相关参数,没有注意好相关数据的保护
9)因为一开始写的延时子程序延时过长,导致查键不灵敏,甚至无法检测出按键
10)程序用到的按键比较多,又是进行串口通信,有时导致设置的时候匹配混乱 11)由于对Keil uVision3软件不是很熟悉,导致在调试程序的时候费了好多时间,调试起来也很有难度
3.2 心得体会
1)单片机课程设计过程中遇到了很多的问题,也在不断的解决问题中提高了自己对单片机程序设计的认识,所有的设计都应该基于良好的合理的分类分工,在各自负责的模块中搞清楚程序设计的原理,逻辑关系,相关芯片的工作过程,相关参数的设定要求是开始编程的前提。在编程过程中,如何应用一些汇编语言中的小技巧,如‘$’的使用等,可以大大地简化程序,如何在遇到问题时按照一定的逻辑顺序进行检验调试也需要我们在不断的编程练习中体会熟悉。
12
2)这次课程设计遇到很多问题,原因大多都是对单片机对汇编理解得不够透彻,经过多次的查阅资料,调试程序,修改程序,感觉自己对单片机、汇编的掌握更进一步,所以这次课程设计真的收获很大。也证明了学编程或者硬件,只学理论是学不好的。必须得实际操作下,才能真正地明白理论,才能真正地掌握一门技术。
3)通过这次单片机课程设计,我加深了对单片机理论的理解,将理论很好地应用到实际当中去。刚开始接触单片机的时候,会发现很多不懂,写程序也会很烦躁。可是单片机真的是一个很有魅力的东西,接触久了也就喜欢上了写代码,调试,下载,测试。经过这次课程设计,除了提高了自己的汇编编程能力外,还很大地提高了自己的逻辑分析能力。
在与组员合作、交流想法的时候,也扩展了自己的思路。而在将各自的代码融合成一个完整的代码时,遇到了许多问题,也是在组员的讨论下解决的。这让我意识到了,团队合作很重要。
4代码
ORG 0000H AJMP FUN1 ORG 000BH AJMP DISPLAY ORG 0023H JMP SERL ORG 0030H
FUN1: NOP MOV SP,#60H MOV TMOD,#21H
;定时器0中断入口地址 ;串行中断入口地址
MOV TH0,#0B1H MOV TL0,#0DFH SETB ET0 MOV TH1,#0F3H MOV TL1,#0F3H
;SP是堆栈指针
;TMOD为100001--T0工作模式1,每20毫秒调 ;用一次,T1工作模式2
;预置值设置,T0定时器每20Ms溢出一次 ;定时器T0中断允许,SEB语句是置1
;8位自动重装模式,用于产生波特率 2400bit/s
13
MOV PCON,#80H MOV SCON,#50H SETB ES SETB EA ;波特率加倍
;设方式1,REN=1,允许接收 ;串行口中断允许 ;允许全局中断 SETB PT0 SETB PS SETB TR0 SETB TR1 SETB EX0 CLR IT0 SETB P3.2 FLAG BIT 0 T01: MOV P2,#0F0H MOV A,#0F0H CJNE A,P2,T02 AJMP T01 T02: CALL DELAY_10MS MOV P2,#0F0H MOV A,#0F0H CJNE A,P2,T03 AJMP T01 T03: MOV P2,#0FEH MOV A,#0FEH ANL A,P2 CJNE A,#0FEH,YES MOV P2,#0FDH MOV A,#0FDH ANL A,P2 CJNE A,#0FDH,YES MOV P2,#0FBH MOV A,#0FBH ANL A,P2 CJNE A,#0FBH,YES MOV P2,#0F7H MOV A,#0F7H ANL A,P2 CJNE A,#0F7H,YES AJMP T01 YES: CALL VALUE T04: MOV A,#0F0H
;T0中断级别最高
;串行口中断优先级设为高优先级 ;开启定时器T0 ;开启定时器T1
;允许外部中断,INT0
;CLR为置0,INT0 为低电平触发 ;P3.2设置为读 ;定义位伪指令 ;查是否有键按下
;有键按下就跳转 ;没有键按下就继续查 ;10ms延时去抖 ;重查有键按下
;确定有键按下则跳转到T03 ;否则调回T01继续查 ;行线1变低
;逻辑与
;查哪个键按下,有键按下则跳转到YES
;行线2变低
;行线3变低
;行线4变低
;执行到这代表都没有键按下,就跳回T01
;查键释放
14
ANL A,P2 CJNE A,#0F0H,T04 ;仍有按键仍有效则跳到T04继续查键释放 CALL DELAY_10MS ;10ms延时去抖 MOV A,#0F0H ANL A,P2 CJNE A,#0F0H,T04 ;重新查键释放 CLR P1.3 ;按键会有声音 CALL DELAY_10MS SETB P1.3 AJMP T01 ;按键已经释放,则跳回T01
VALUE:
;---------------------------------------------------------------------- ;按键对应编码:后面VALUE也适用这个编码
;S1 0E7H S2 0D7H S3 0B7H S4 77H ;S5 0EBH S6 0DBH S7 0BBH S8 7BH ;S9 0EDH S10 0DDH S11 0BDH S12 7DH ;S13 0EEH S14 0DEH S15 0BEH S16 7EH ;----------------------------------------------------------------------
NOP CJNE A,#0E7H,K2 ;按键1按下 MOV A,#0AAH MOV 55H,#01H MOV 56H,#00H MOV SBUF,A JMP S01 K2: CJNE A,#0D7H,K3 ;按键3按下 MOV A,#0BBH MOV SBUF,A JMP S01 K3: CJNE A,#0B7H,K4 ;按键2按下 MOV A,#01 MOV SBUF,A JMP FUN2 K4: CJNE A,#77H,OUT ;按键4按下;K4和K2选择的模式一样,设置K4只
;是为了能正常显示,避免程序走进死胡同
MOV A,#0BBH MOV SBUF,A JMP S01 OUT: RET
FUN2: SETB PSW.3 CLR PSW.4 ;选择工作寄存器1区,1区的R2-R7用于存数,R0
15
;用于计数,R1用于选模式(来自串行数据)
MOV R0,#0
MOV R1,#01
MOV R2,#13 ;代表2013年 MOV R3,#06 ;代表6月 MOV R4,#22 ;代表22日 MOV R5,#14 ;代表14点 MOV R6,#05 ;代表05分 MOV R7,#00 ;代表00秒
TT01: MOV P2,#0F0H MOV A,#0F0H CJNE A,P2,TT02
AJMP TT01
TT02: CALL DELAY_10MS MOV P2,#0F0H MOV A,#0F0H CJNE A,P2,TT03 AJMP TT01 TT03: MOV P2,#0FEH MOV A,#0FEH ANL A,P2
CJNE A,#0FEH,YES1 MOV P2,#0FDH MOV A,#0FDH ANL A,P2
CJNE A,#0FDH,YES1 MOV P2,#0FBH MOV A,#0FBH ANL A,P2
CJNE A,#0FBH,YES1 MOV P2,#0F7H MOV A,#0F7H ANL A,P2
CJNE A,#0F7H,YES1 AJMP TT01 YES1: CALL VALUE1
TT04: MOV A,#0F0H ANL A,P2
CJNE A,#0F0H,TT04 CALL DELAY_10MS MOV A,#0F0H
ANL A,P2
16
CJNE A,#0F0H,TT04 CLR P1.3 CALL DELAY_10MS SETB P1.3 AJMP TT01
;************************************************************************** VALUE1: NOP CJNE A,#0E7H,KK2 MOV A,#01 MOV SBUF,A JMP S01 KK2: CJNE A,#0D7H,KK3 MOV A,#02 MOV SBUF,A JMP S01 KK3: CJNE A,#0B7H,KK4 MOV A,#03 MOV SBUF,A JMP S01 KK4: CJNE A,#77H,KK5 MOV A,#0BBH MOV SBUF,A JMP FUN1 KK5: CJNE A,#0EBH,KK6 MOV A,#05 MOV SBUF,A JMP S01 KK6: CJNE A,#0DBH,KK7 MOV A,#06 MOV SBUF,A JMP S01 KK7: CJNE A,#0BBH,KK8 MOV A,#07 MOV SBUF,A JMP S01 KK8: CJNE A,#7BH,KK9 MOV A,#08 MOV SBUF,A JMP S01 KK9: CJNE A,#0EDH,KK10 MOV A,#09 MOV SBUF,A
;查键值子程序 ;按键1按下 ;SBUF是串行数据缓冲器,这个指令是访问发送数;据寄存器(写方式)。A是要发送的数据。
;S01是判断数据是否发送完毕 ;按键2按下 ;按键3按下 ;按键4按下 ;按下键4则跳转到FUN1(分离模块) ;按键5按下 ;按键6按下 ;按键7按下 ;按键8按下 ;按键9按下 17
KK10: KK11: KK12: KK13: KK14: KK15: KK16:
OUT1: S01:
JMP S01
CJNE A,#0DDH,KK11 MOV A,#10 MOV SBUF,A JMP S01
CJNE A,#0BDH,KK12 MOV A,#11 MOV SBUF,A JMP S01
CJNE A,#7DH,KK13 MOV A,#12 MOV SBUF,A JMP S01
CJNE A,#0EEH,KK14 MOV A,#13 MOV SBUF,A JMP S01
CJNE A,#0DEH,KK15 MOV A,#14 MOV SBUF,A JMP S01
CJNE A,#0BEH,KK16 MOV A,#15 MOV SBUF,A JMP S01
CJNE A,#7EH,OUT1 MOV A,#16 MOV SBUF,A JMP S01 RET
JNB TI,S01
;按键10按下
;按键11按下
;按键12按下
;按键13按下
;按键14按下
;按键15按下
;按键16按下
;结束子程序
;等待发送完标志。如果(TI)=0,转至S01,否则 ;往下执行。若有数据发送,则特殊功能寄存器中 ;的标志TI被硬件置位,向CPU申请中断
;执行到这里证明发送完成,之后得对TI进行软件 ;清零
CLR TI
AJMP OUT
;************************************************************************** ;数码管显示模块0~R3为第1~4个数码管的片选,R4~R7为第1~4个数码管显示的数值 ;对应为TABLE中的值。程序状态字PSW中RS1 = 0,RS0 = 0由T0每20ms调用一次 DISPLAY:PUSH ACC PUSH PSW ;对PSW,ACC进行入栈保护
18
MOV TH0,#0B1H MOV TL0,#0DFH SETB PSW.3 CLR PSW.4
MOD1: CJNE R1,#01H,MOD2 ;显示模式1,显示分,秒 MOV A,R7 ;1区的R7存着初始秒数,把秒数赋给A
CLR PSW.3 CLR PSW.4 MOV B,#10 DIV AB MOV R7,B MOV R6,A SETB PSW.3 MOV A,R6 CLR PSW.3 MOV B,#10 DIV AB MOV R5,B MOV R4,A MOV R3,#01H MOV R2,#01H MOV R1,#01H MOV R0,#01H JMP CALCULATE MOD2: CJNE R1,#02H,MOD3 MOV A,R5 CLR PSW.3 CLR PSW.4 MOV B,#10 DIV AB MOV R7,B MOV R6,A SETB PSW.3 MOV A,R4 CLR PSW.3 MOV B,#10 DIV AB MOV R5,B MOV R4,A MOV R3,#01H MOV R2,#01H
;将初始秒数的十位数存于A,个位数存于B ;B的值赋给0区的R7,R4、5、6、7分别对应着4
;个数码管
;A是值赋给0区的R6 ;1区的R6存着初始分钟数,把分钟数赋给A ;将初始分钟数的个位数存于B ;将初始分钟数的十位数存于A ;选中四个数码管,都用于显示 ;数值存储完毕后,进行计数(多久要加1秒,多
;久要进位)
显示模式1,显示日,时 ;1区的R5存着初始小时数,把小时数赋给A ;1区的R4存着初始日数,把日数赋给A 19
; MOD3: MOV R1,#01H
MOV R0,#01H JMP CALCULATE CJNE R1,#03H,MOD4 MOV A,R3
;显示模式1,显示年,月
;1区的R3存着初始月数,把月数赋给A
CLR PSW.3 CLR PSW.4 MOV B,#10 DIV AB MOV R7,B MOV R6,A SETB PSW.3 MOV A,R2 CLR PSW.3 MOV B,#10 DIV AB MOV R5,B MOV R4,A MOV R3,#01H MOV R2,#01H MOV R1,#01H MOV R0,#01H JMP CALCULATE
MOD4: CJNE R1,#04H,MOD5 JMP FUN1 MOD5: CJNE R1,#05H,MOD6 SETB PSW.3 CLR PSW.4 INC R2 MOV R1,#03H CJNE R2,#100,MOD6 MOV R2,#0 JMP CALCULATE MOD6: CJNE R1,#06H,MOD7 SETB PSW.3 CLR PSW.4 DEC R2 MOV R1,#03H CJNE R2,#0FFH,MOD7 MOV R2,#99
JMP CALCULATE MOD7: CJNE R1,#07H,MOD8
SETB PSW.3
;1区的R2存着初始年数,把年数赋给A
;跳回FUN1(分离模块)
;年数加1
;年数变化之后,选择MOD3将年数存入寄存器并;显示
;年数的显示上限为99 ;100的时候清零
;年数减1 ;0-1=0FFH
20
CLR PSW.4 INC R3 MOV R1,#03H
CJNE R3,#13,MOD8 MOV R3,#1
JMP CALCULATE MOD8: CJNE R1,#08H,MOD9 SETB PSW.3 CLR PSW.4 DEC R3 MOV R1,#03H
CJNE R3,#0FFH,MOD9 MOV R3,#12
JMP CALCULATE MOD9: CJNE R1,#09H,MOD10 SETB PSW.3 CLR PSW.4 INC R4 MOV R1,#02H Q1: CJNE R3,#1,Q2
JMP M3
Q2: CJNE R3,#2,Q3 MOV A,R2 MOV B,#4 DIV AB MOV A,B
CJNE A,#0,M4 JMP M1
Q3: CJNE R3,#3,Q4 JMP M3
Q4: CJNE R3,#4,Q5 JMP M2
Q5: CJNE R3,#5,Q6 JMP M3
Q6: CJNE R3,#6,Q7 JMP M2
Q7: CJNE R3,#7,Q8 JMP M3
Q8: CJNE R3,#8,Q9 JMP M3
Q9: CJNE R3,#9,Q10 JMP M2
Q10:
CJNE R3,#10,Q11
;月数加1
;月数减1
;日数加1
;Q1~Q12是判断当前是哪个月21
JMP M3 Q11: CJNE R3,#11,Q12 JMP M2 Q12: CJNE R3,#12,Q1 JMP M3 M1: CJNE R4,#29,MOD10 MOV R4,#1 M2: CJNE R4,#31,MOD10 MOV R4,#1 M3: CJNE R4,#32,MOD10 MOV R4,#1 M4: CJNE R4,#30,MOD10 MOV R4,#1 JMP CALCULATE
MOD10: CJNE R1,#0AH,MOD11 SETB PSW.3 CLR PSW.4 DEC R4 MOV R1,#02H CJNE R4,#0FFH,MOD11 QQ1: CJNE R3,#1,QQ2 MOV R4,#31 QQ2: CJNE R3,#2,QQ3 MOV A,R2 MOV B,#4 DIV AB MOV A,B CJNE A,#0,QQ29 JMP QQ28 QQ28: MOV R4,#28 JMP CALCULATE QQ29: MOV R4,#29 JMP CALCULATE QQ3: CJNE R3,#3,QQ4 MOV R4,#31 QQ4: CJNE R3,#4,QQ5 MOV R4,#30 QQ5: CJNE R3,#5,QQ6 MOV R4,#31 QQ6: CJNE R3,#6,QQ7 MOV R4,#30 QQ7: CJNE R3,#7,QQ8
;M1~M4是对有不同天数的月份独自操作
;日数减1
;Q1~Q12是判断当前是哪个月
22
MOV R4,#31 QQ8: CJNE R3,#8,QQ9 MOV R4,#31 QQ9: CJNE R3,#9,QQ10 MOV R4,#30
QQ10: CJNE R3,#10,QQ11 MOV R4,#31
QQ11: CJNE R3,#11,QQ12 MOV R4,#30 QQ12: CJNE R3,#12,Q MOV R4,#31 Q: JMP CALCULATE
MOD11: CJNE R1,#0BH,MOD12 SETB PSW.3 CLR PSW.4 INC R5 ;小时数加1 MOV R1,#02H CJNE R5,#24,MOD12 MOV R5,#0 JMP CALCULATE
MOD12: CJNE R1,#0CH,MOD13 SETB PSW.3 CLR PSW.4 DEC R5 ;小时数减1 MOV R1,#02H CJNE R5,#0FFH,MOD13 MOV R5,#24 JMP CALCULATE
MOD13: CJNE R1,#0DH,MOD14 SETB PSW.3 CLR PSW.4 INC R6 ;分数加1 MOV R1,#01H CJNE R6,#60,MOD14 MOV R6,#0 JMP CALCULATE
MOD14: CJNE R1,#0EH,MOD15 SETB PSW.3 CLR PSW.4 DEC R6 ;分数减1 MOV R1,#01H CJNE R6,#0FFH,MOD15 MOV R6,#60
23
JMP CALCULATE
MOD15: CJNE R1,#0FH,MOD16 SETB PSW.3 CLR PSW.4 INC R7 MOV R1,#01H CJNE R7,#60,MOD16 MOV R7,#0 JMP CALCULATE MOD16: CJNE R1,#10H,MOD17 SETB PSW.3 CLR PSW.4 DEC R7 MOV R1,#01H CJNE R7,#0FFH,CALCULATE MOV R7,#60 JMP CALCULATE
MOD17: CJNE R1,#0AAH,MOD18 LOOP1: MOV A,R7 CJNE A,55H,LOOP2 JMP LOOP3 LOOP2: INC 56H MOV 55H,A CLR PSW.3 CLR PSW.4 MOV R7,56H MOV R6,56H MOV R5,56H MOV R4,56H MOV A,56H CJNE A,#04,LOOP3 MOV 56H,#00 LOOP3: CLR PSW.3 CLR PSW.4 MOV R3,#01H MOV R2,#01H MOV R1,#01H MOV R0,#01H JMP CALCULATE
MOD18: CJNE R1,#0BBH,CALCULATE CLR PSW.3 CLR PSW.4 MOV R0,#00
;秒数加1
;秒数减1
;分离模块的显示1~4
;用主模块的秒来控制1~4的循环显示
;只循环显示1、2、3、4
;选中4个数码管
;分离模块的显示IOY
24
MOV R1,#01 MOV R2,#01 MOV R3,#01 MOV R5,#01 MOV R6,#00 MOV R7,#04 JMP CALCULATE
CALCULATE:SETB PSW.3 CLR PSW.4
INC R0 CJNE R0,#50,START MOV R0,#0 INC R7 //SETB P1.3 CJNE R7,#60,START MOV R7,#0 INC R6
//CLR P1.3 CJNE R6,#60,START MOV R6,#0 INC R5 CJNE R5,#24,START MOV R5,#0 INC R4 CJNE R4,#30,START MOV R4,#0 INC R3 CJNE R3,#12,START INC R2
START: CLR PSW.3 CLR PSW.4 CJNE R0,#01H,DT1 MOV B,#00H CALL SHOWDT SETB P0.0 CLR P0.1 CLR P0.2 CLR P0.3 MOV DPTR,#TABLE MOV A,R4 MOVC A,@A+DPTR MOV B,A
;选中后三个数码管
;要显示的数据
;1区的R0用于计数 ;计数器的周期为20ms
;R0不等于50代表秒数不用加1,则跳到START ;50个20ms为1s,之后进行清零,重新计数 ;秒数+1
;R7不等于60代表分数不用加1 ;分数加1
;小时数加1
;日数加1
;月数加1 ;年数加1
;第一个数码管的显示,1代表选中,0代表不选中;将B寄存器置零
;年或者日或者分的十位数
25
CALL SHOWDT
CALL DELAY_600US DT1: CJNE R1,#01H,DT2 MOV B,#00H CALL SHOWDT CLR P0.0 SETB P0.1 CLR P0.2 CLR P0.3
MOV DPTR,#TABLE MOV A,R5 MOVC A,@A+DPTR MOV B,A
CALL SHOWDT
CALL DELAY_600US DT2: CJNE R2,#01H,DT3 MOV B,#00H CALL SHOWDT CLR P0.0 CLR P0.1 SETB P0.2 CLR P0.3
MOV DPTR,#TABLE MOV A,R6 MOVC A,@A+DPTR MOV B,A
CALL SHOWDT
CALL DELAY_600US DT3: CJNE R3,#01H,DT4 MOV B,#00H CALL SHOWDT CLR P0.0 CLR P0.1 CLR P0.2 SETB P0.3
MOV DPTR,#TABLE MOV A,R7 MOVC A,@A+DPTR MOV B,A
CALL SHOWDT
CALL DELAY_600US MOV B,#00H
CALL SHOWDT
;第二个数码管的显示
;年或者日或者分的个位数
;第三个数码管的显示
;月或者时或者秒的十位数
;第四个数码管的显示
;月或者时或者秒的个位数
26
DT4: SETB PSW.3 CLR PSW.4 POP PSW POP ACC ;PSW,ACC出栈 RETI ;定时器T0 返回
;-------------------------------------------------------------------------- SHOWDT: NOP SETB FLAG JB B.0,B1 CLR FLAG B1: CALL IN595 SETB FLAG JB B.1,B2 CLR FLAG B2: CALL IN595 SETB FLAG JB B.2,B3 CLR FLAG B3: CALL IN595 SETB FLAG JB B.3,B4 CLR FLAG B4: CALL IN595 SETB FLAG JB B.4,B5 CLR FLAG B5: CALL IN595 SETB FLAG JB B.5,B6 CLR FLAG B6: CALL IN595 SETB FLAG JB B.6,B7 CLR FLAG B7: CALL IN595 SETB FLAG JB B.7,B8 CLR FLAG B8: CALL IN595 SETB P0.5 CLR P0.5
;显示单个数码管的子程序 ;FLAG记录B寄存器每一位存的数 ;默认FLAG为1,若B.0为1,则直接写进595寄
;存器;若B.0为0,则先将FLAG置0再写进595寄;存器
;IN595是一位寄存器,所以得一位一位地存 27
CLR P0.6 RET ;返回
;-------------------------------------------------------------------------- IN595: NOP ;IN595为595输入1或0 SETB P0.7 ;P0.7对应595的SER脚,是串行数据输入 JB FLAG,HLEVEL CLR P0.7 ;否则为低电平 HLEVEL: ;将数据写入P0.7的方法 SETB P0.4 CLR P0.4 RET ;IN595返回
;************************************************************************** ;-------------------------------串行通信 中断------------------------------ SERL: NOP PUSH ACC PUSH PSW ;ACC,PSW入栈保护 CLR RI ;清接受标志 SETB PSW.3 CLR PSW.4 MOV R1,SBUF ;接收串行数据,R1存入选择的MOD模式 POP PSW POP ACC ;ACC,PSW出栈 RETI ;中断返回
;-------------------------------------------------------------------------------- DELAY_600US: MOV A,#199 ;延时600us子程序 DELETE: DEC A JNZ DELETE RET ;延时1+199*3+2=600us ;-------------------------------------------------------------------------------- DELAY_10MS: ;延时10ms子程序 MOV A,#00H JNOP1: INC A NOP CJNE A,#0FFH,JNOP1 JNOP2: DEC A NOP CJNE A,#00H,JNOP2 JNOP3: INC A NOP CJNE A,#0FFH,JNOP3 JNOP4: DEC A NOP CJNE A,#00H,JNOP4
28
JNOP5: INC A NOP CJNE A,#0FFH,JNOP5 JNOP6: DEC A NOP CJNE A,#00H,JNOP6 JNOP7: INC A NOP CJNE A,#0FFH,JNOP7 JNOP8: DEC A NOP CJNE A,#00H,JNOP8 JNOP9: INC A NOP CJNE A,#0FFH,JNOP9 MOV A,#0FFH DLC: DEC A JNZ DLC RET ;延时1+4*255*9+1+3*255+2=9949us,约等于10ms
;-------------------------------------------------------------------------------- TABLE: DB 0FCH ;0 DB 060H ;1 DB 0DAH ;2 DB 0F2H ;3 DB 66H ;4 DB 0B6H ;5 DB 0BEH ;6 DB 0E0H ;7 DB 0FEH ;8 DB 0F6H ;9 DB 00H ;空白
;-------------------------------------------------------------------------------- END
29
因篇幅问题不能全部显示,请点此查看更多更全内容