
**** WRITER:COCO.LI*************
定时器T0、T1溢出周期为50MS(10MS),T0为秒计数用,T1为调整时闪烁用,
**** P1.0、P1.1、P1.2为调整按钮,P0口为字符输出口,采用共阳显示咐洞禅管。
********** 中断程序入口 ****************
ORG 0000H 程序执行开始地址
LJMPSTART 跳到标号START执行
ORG 0003H 外中断0中断程序入口
RETI外中断0中断返回
ORG 000BH 定时器T0中断程序入口
LJMPINTT0 跳到标号INTT0执行
ORG 0013H 外中断1中断程序入口
RETI外中断1中断颤蠢返回
ORG 001BH 定衡尘时器T1中断程序入口
LJMPINTT1 跳到标号INTT1执行
ORG 0023H 串行口中断程序入口
RETI串行口中断程序返回
主程序
ORG 0030H
START:LCALL ST 上电显示年月日及班级学号
MOV R0,#70H 清70H~7AH共11个内存单元
MOV R7,#0BH
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZR7,CLEARDISP
MOV 20H,#00H清20H , 标志用
MOV 7AH,#0AH放入“熄灭符”数据
MOV TMOD,#11H 设T0、T1为16位定时器
MOV TL0,#0B0H 50MS定时初值,T0计时用
MOV TH0,#3CH50MS定时初值
MOV TL1,#0B0H 50MS定时初值,T1闪烁定时用
MOV TH1,#3CH50MS定时初值
SETBEA 总中断开放
SETBET0 允许T0中断
SETBTR0 开启T0定时器
MOV R4,#14H 1 S定时用初值50MS*20
START1:
LCALL DISPLAY 调用显示子程序
JNB P3.3,SETMM1 P3.3口为0时,转时间调整程序
JNB P3.4,FUNSS 秒表功能,P3.4按键调时时作减1 *** 作
JNB P3.5,FUNPT STOP,PUSE,CLR
SJMPSTART1 P3.3口为1时跳回START1
SETMM1:
LJMPSETMM 转到时间调整程序SETMM
FUNSS:
LCALL DS20MS
JB P3.4,START1
WAIT11:
JNB P3.4,WAIT11
CPL 03H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
AJMPSTART1
FUNPT:
LCALL DS20MS
JB P3.5,START1
WAIT22:
JNB P3.5,WAIT21
CLR ET0
CLR TR0
WAIT33:
JB P3.5,WAIT31
LCALL DS20MS
JB P3.5,WAIT33
WAIT66:
JNBP3.5,WAIT61
MOVR0,#70H 清70H~79H共10个内存单元
MOVR7,#0AH
CLEARP:
MOV@R0,#00H
INCR0
DJNZ R7,CLEARP
WAIT44:
JB P3.5,WAIT41
LCALL DS20MS
JB P3.5,WAIT44
WAIT55:
JNBP3.5,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21:
LCALL DISPLAY
AJMP WAIT22
WAIT31:
LCALL DISPLAY
AJMP WAIT33
WAIT41:
LCALL DISPLAY
AJMP WAIT44
WAIT51:
LCALL DISPLAY
AJMP WAIT55
WAIT61:
LCALL DISPLAY
AJMP WAIT66
1 s计时程式
T0中断服务程序
INTT0:
PUSHACC 累加器入栈保护
PUSHPSW 状态字入栈保护
CLR ET0 关T0中断允许
CLR TR0 关定时器T0
JB 03H,FSS 标志为1转秒表处理程序,,10MS定时
MOV A,#0B7H 中断响应时间同步修正
ADD A,TL0 低8位初值修正
MOV TL0,A 重装初值,,低8位修正值
MOV A,#3CH 高8位初值修正
ADDCA,TH0
MOV TH0,A 重装初值,, 高8位修正值
SETBTR0 开启定时器T0
DJNZR4,OUTT020次中断未到中断退出
ADDSS:
MOV R4,#14H 20次中断到,重赋初值,,1S
MOV R0,#71H 指向秒计时单元..71H~72H
ACALL ADD1调用加1程序,,加1S *** 作.
MOV A,R3秒数据放入A,,R3为2位十进制数组合
CLR C 清进位标志
CJNEA,#60H,ADDMM
ADDMM:
JC OUTT0 短于60S时中断退出
ACALL CLR0长于或者等于60S时对秒计数单元清0
MOV R0,#77H 指向分计时单元,,76H~77H
ACALL ADD1分计时单元加1
MOV A,R3分数据放入A
CLR C 清进位标志
CJNEA,#60H,ADDHH 秒表时最大为99
ADDHH:
JC OUTT0 短于60min时中断退出
ACALL CLR0长于或者等于60min时对分计数单元清0
MOV R0,#79H 指向分计时单元,,78H~79H
ACALL ADD1小时计时单元加1h
MOV A,R3时数据放入A
CLR C 清进位标志
JB 03H,OUTT0 秒表时最大为99
CJNEA,#24H,HOUR
HOUR:
JC OUTT0 短于24h时中断退出
ACALL CLR0长于或者等于24h时对计时单元清0
OUTT0:
MOV 72H,76H 中断退出时将分\时计时单元数据移
MOV 73H,77H 入对应显示单元
MOV 74H,78H
MOV 75H,79H
POP PSW 恢复状态字出栈
POP ACC 恢复累加器
SETBET0 开放T0中断
RETI
秒表计时程序(10min加1),低2位为0.1、0.01秒,中间2位为秒,最高2位为分.
最大计数值为99分59.99秒
FSS:MOV A,#0F7H
ADD A,TL0
MOV TL0,A
MOV A,#0D8H
ADDCA,TH0
MOV TH0,A
SETBTR0
MOV R0,#71H
ACALL ADD1
CLR C
MOV A,R3
JZ FSS1
SETBC
FSS1: AJMPADDMM
闪动调时程式
T1中断服务程序,用作时间调整单元闪烁指示
INTT1: PUSHACC
PUSHPSW
MOV TL1,#0B0H
MOV TH1,#3CH
DJNZR2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:
POP PSW
POP ACC
RETI
FLASH1: JB 01H,FLASH2
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMPINTT1OUT
FLASH2: MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMPINTT1OUT
加1子程序
ADD1: MOV A,@R0 取当前计时单元数据到A
DEC R0 指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
ADD A,#01H A加1 *** 作
DA A 十进制调整
MOV R3,A 移入R3中暂存数据
ANL A,#0FH 高四位变0
MOV @R0,A 数据放入当前地址单元中
MOV A,R3 返回
INC R0
SWAPA
ANL A,#0FH
MOV @R0,A
RET
分减1子程序
SUB1: MOV A,@R0 取当前计时单元数据到A
DEC R0 指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
JZ SUB11
DEC A A减1 *** 作
SUB111: MOV R3,A 移入R3中暂存数据
ANL A,#0FH 高四位变0
CLR C 清进位标志
SUBBA,#0AH
SUB1111:
JC SUB1110
MOV @R0,#09H 大于等于0AH,为9
SUB110:
MOV A,R3 取回R3中暂存数据
INC R0 指向当前地址单元
SWAPA A中数据高四位与低四位交换
ANL A,#0FH 高四位变0
MOV @R0,A 数据放入当前地址单元中
RET返回
SUB11: MOV A,#59H
AJMPSUB111
SUB1110:
MOV A,R3 移入R3寄存器
ANL A,#0FH
MOV @R0,A
AJMPSUB110
时减1子程序
SUBB1: MOV A,@R0 取当前计时单元数据到A
DEC R0指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
JZ SUBB1100减1为23H
DEC A A减1 *** 作
SUBB111:MOV R3,A 移入R3中暂存数据
ANL A,#0FH高四位变0
CLR C 清进位标志
SUBBA,#0AH时个位大于9为9
SUBB1111:
JC SUBB1110
MOV @R0,#09H 大于等于0AH,为9
SUBB110:
MOV A,R3 取回R3中暂存数据
INC R0指向当前地址单元
SWAPA A中数据高四位与低四位交换
ANL A,#0FH高四位变0
MOV @R0,A 数据放入当前地址单元中
RET 返回
SUBB11:
MOV A,#23H
AJMPSUBB111
SUBB1110:
MOV A,R3 时个位小于0A不处理
ANL A,#0FH高四位变0
MOV @R0,A 个位移入
AJMPSUBB110
清0程序
对计时单元复0用
CLR0: CLR A 清累加器
MOV @R0,A 清当前地址单元
DEC R0 指向前一地址
MOV @R0,A 前一地址单元清0
RET子程序返回
时钟调整程序
当调时按键按下时进入此程序
SETMM: CLR ET0关定时器T0中断
CLR TR0关闭定时器T0
LCALL DL1S 调用1S延时程序
JB P3.3,CLOSEDIS 键按下时间短于1S,关闭显示,,省电
MOV R2,#06H进入调时状态,赋闪烁定时初值
SETBET1允许T1中断
SETBTR1开启T1定时器
SET2:
JNB P3.3,SET1 P3.3口为0时,等待,,键未释放
SETB00H键释放,分调整闪烁标志置1
SET4: 等待键按下
JB P3.3,SET3 等待键按下
LCALL DL05S 有键按下,延时0.5S
JNB P3.3,SETHH 按下时间长于0.5S,转调小时状态
MOV R0,#77H按下时间短于0.5S,加1min *** 作
LCALL ADD1 调用加1子程序
MOV A,R3 取调整单元数据
CLR C 消位标志
CJNEA,#60H,HHH 调整单元数据与60比较
HHH:JC SET4 调整单元数据小于60,转SET4循环
LCALL CLR0 调整单元数据大于或等于60时,清0
CLR C 清进位0
AJMPSET4 跳转到SET4循环
CLOSEDIS:
SETBET0省电状态,开T0中断,,LED灯不显示
SETBTR0开启T0中断
CLOSE:
JB P3.3,CLOSE 无键按下,等待
LCALL DISPLAY有键按下,调用显示子程序延时消抖
JB P3.3,CLOSE 是干扰,返回CLOSE等待
WAITH:
JNB P3.3,WAITH 等待键释放
LJMPSTART1 返回主程序,,LED数据显示亮
SETHH: CLR 00H分闪烁标志清除,,进入调小时状态
SETHH1: JNB P3.3,SET5 等待键释放
SETB01H小时调整标志置1
SET6: JB P3.3,SET7 等待键按下
LCALL DL05S 有键按下,延时0.5S
JNB P3.3,SETOUT按下时间长于0.5S,退出时间调整
MOV R0,#79H按下时间短于0.5S,加1h *** 作
LCALL ADD1 调用加1子程序
MOV A,R3
CLR C
CJNEA,#24H,HOUU计时单元数据与24比较
HOUU: JC SET6 小于24,转SET6循环
LCALL CLR0 大于或等于24时,清0 *** 作
AJMPSET6 跳到SET6处循环
SETOUT: JNB P3.3,SETOUT1 调时退出程序.等待键释放
LCALL DISPLAY延时消抖
JNB P3.3,SETOUT是抖动,返回SETOUT再等待
CLR 01H清调小时标志
CLR 00H清调分标志
CLR 02H清闪烁标志
CLR TR1关闭定时器T1
CLR ET1关定时器T1中断
SETBTR0开启定时器T0
SETBET0开启定时器T0中断,,计时开始
LJMPSTART1 跳回主程序
SET1: LCALL DISPLAY键释放等待调时用显示程序
AJMPSET2 防止键按下时无时钟显示
SET3: LCALL DISPLAY等待调分按键时时钟显示用
JNB P3.3,FUNSUB减1分 *** 作
AJMPSET4 调分等待
SET5: LCALL DISPLAY键释放等待调时用显示程序
AJMPSETHH1 防止键按下时无时钟显示
SET7: LCALL DISPLAY等待调小时按键时时钟显示用
JNB P3.3,FUNSUBB 小时减1 *** 作
AJMPSET6 调时等待
SETOUT1:LCALL DISPLAY退出时钟整时键释放等待
AJMPSETOUT 防止键按下时无时钟显示
FUNSUB,分减1程序?
FUNSUB: LCALL DISPLAY延时消抖
JB P3.3,SET41 干扰,返回调分等待
FUNSUB1:JNB P3.3,FUNSUB1 等待键放开
MOV R0,#77H
LCALL SUB1 分减1程序
LJMPSET4 返回调分等待
SET41: LJMPSET4
FUNSUB,时减1程序?
FUNSUBB:LCALL DISPLAY 消抖动
JB P3.4,SET61 干扰,返回调时等待
FUNSUBB1:JNBP3.4,FUNSUBB1
MOV R0,#79H
LCALL SUBB1
LJMPSET6
SET61: LJMPSET6
显示程序
显示数据在70H~75H单元内,用六位LED共阳数码管显示。
扫描控制,每个LED数码管亮1mS时间。
DISPLAY:
MOV R1,#70H 指向显示数据首址
MOV R5,#0DFH 扫描控制字初值
PLAY: MOV A,R5 扫描字放入A
MOV P2,A 从P2口输出
MOV A,@R1 取显示数据到A
MOV DPTR,#TAB 取段码表地址
MOVCA,@A+DPTR 查显示数据对应段码
MOV P0,A 段码放入P0口
MOV A,R5
JB ACC_1,LOOP5 小数点处理
CLR P0.7
LOOP5: JB ACC_3,LOOP6
CLR P0.7
LOOP6: LCALL DL1MS 显示1MS
INC R1指向下一地址
MOV A,R5 扫描控制字放入A
JNB ACC_0,ENDOUT ACC.0=0时,一次显示结束
RR A A中数据循环左移
MOV R5,A 放回R5内
MOV P0,#0FFH
AJMPPLAY 跳回:PLAY循环.
ENDOUT: MOV P2,#0FFH 一次显示结束,P2口复位
MOV P0,#0FFH P0口复位
RET 子程序返回
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
共阳段码表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。
SDISPLAY,上电显示程序
不带小数点,有A、— 显示功能
SDISPLAY:
MOV R5,#0DFH 扫描控制字初值
SPLAY: MOV A,R5 扫描字放入A
MOV P2,A 从P2口输出
MOV A,@R1 取显示数据到A
MOV DPTR,#TABS取段码表地址
MOVCA,@A+DPTR 查显示数据对应段码
MOV P0,A 段码放入P0口
MOV A,R5
LCALL DL1MS 显示1MS
INC R1指向下一地址
MOV A,R5 扫描控制字放入A
JNB ACC_0,ENDOUTS ACC.0=0时,一次显示结束
RR A A中数据循环左移
MOV R5,A 放回R5内
AJMPSPLAY 跳回:PLAY循环.
ENDOUTS:MOV P2,#0FFH 一次显示结束,P2口复位
MOV P0,#0FFH P0口复位
RET 子程序返回
TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
STAB表,启动时显示2003-12-07、A01-2-28
STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH
DB 07H,00H,0CH
DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
注:0A不亮,0B显示“A”,0C显示“-”
ST子程序,上电时显示年月日用,采用移动显示
ST: MOV R0,#40H 将显示内容移入40H~50H单元
MOV R2,#20H
MOV R3,#00H
CLR A
MOV DPTR,#STAB
SLOOP:
MOVCA,@A+DPTR
MOV @R0,A
MOV A,R3
INC A
MOV R3,A
INC R0
DJNZR2,SLOOP 移入完毕
MOV R1,#5AH
MOV R3,#1BH 显示27个单元
SSLOOP:
MOV R2,#32H 控制移动速度
SSLOOP1:
LCALL SDISPLAY
DJNZR2,SSLOOP11
MOV A,R1
SUBBA,#07H 显示首址修正为低1个单元
MOV R1,A
DJNZR3,SSLOOP
RET
SSLOOP11:
MOV A,R1指针修正为原值
SUBB A,#06H
MOV R1,A
AJMP SSLOOP1
延时程序
1ms延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1:MOV R7,#19H
DL2:DJNZ R7,DL2
DJNZ R6,DL1
RET20MS延时程序,采用调用显示子程序,以改善LED的显示闪烁现象
DS20MS: ACALLDISPLAY
ACALLDISPLAY
ACALLDISPLAY
RET延时程序,用作按键时间的长短判断
DL1S:
LCALLDL05S
LCALLDL05S
RET
DL05S:
MOV R3,#20H8ms*32=0.196s
DL05S1:
LCALLDISPLAY
DJNZ R3,DL05S1
RET
END 程序结束
图11程序如下:
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity xuan21 is
Port ( alarm,a,b: in std_logic
y:out std_logic)
end xuan21
architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=aelse y<=b
end if
end process
end one
仿真波形如下图12:
图12
(2)三位二选一:
模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。猜春当alarm按键未曾按下时二选一选洞好择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。
图13
程序如下:
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity x213 is
Port ( alarm : in std_logic
y:out std_logic_vector(3 downto 0)
a,b: in std_logic_vector(3 downto 0))
end x213
architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=aelse y<=b
end if
end process
end one
仿真结果如下图14:
图纳兆铅14
8、整点报时及闹时:
模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。
图15
程序如下:
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0)
in_1000,in_500:in std_logic
q : out std_logic)
end voice
architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q<=in_500
elsif sec1="0101" and sec0="1001" then q<=in_1000
else q<='0'
end if
else q<='0'
end if
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q<=in_1000
end if
end process
end one
仿真波形如下图16
图16
9、顶层原理图:
三、感想
通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示
:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
四、参考资料:
1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)
2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004
3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005
4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004
5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,2004
6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997
7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,2002 就这些
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)