|
;--------------------------------------------------------------- led_com bit p3.3 ;数码管公共阴极 speak bit p3.5 ;蜂鸣器控制
s_numb equ 30H ;20ms的次数(25x20=500ms) s_data equ 31h ;LED灯显示的数据 s_set equ 32h ;秒显示的数据 data_t equ 33h
org 0000h ajmp main org 0003h ;ljmp to_int0 ;到中断0 org 000bh ; ljmp to_t0 ;到T0 org 0023h ljmp to_sbuf ;到串口
org 0100h a_delay: ;延时子程序 mov r5,#01h de3: mov r7,#0e0h de2: mov r6,#00h de1: djnz r6,de1 djnz r7,de2 djnz r5,de3 ret a_delay1: mov r7,#09h de21: mov r6,#00h de11: djnz r6,de11 djnz r7,de21 ret l_speak: ;蜂鸣器叫声子程序 clr speak ; setb speak ;发声 lcall a_delay1 ;延时 clr speak ret ;---------------数码管查表代码-------------------- tab: db 3fh ;'0' db 06h ;'1' db 5bh ;'2' db 4fh ;'3' db 66h ;'4' db 6dh ;'5' db 7dh ;'6' db 07h ;'7' db 7fh ;'8' db 6fh ;'9'01101111b
f_tab: mov dptr,#tab ; 查表子程序 movc a,@a+dptr ret
disp_x: lcall f_tab ;A=?(0,1,2,3,4,5,6,7,8,9?) mov p2,a ;送数到P2 setb led_com ;开数码管 lcall a_delay ;延时 ret
;-----------------LED灯的控制-------------------- off_led: mov a,#0ffh mov p0,a ret on_led1: lcall off_led ;开LED1(灯) clr p0.0 ret on_led2: lcall off_led clr p0.1 ;开LED2(灯) ret on_led3: lcall off_led clr p0.2 ;开LED3(灯) ret on_led4: lcall off_led clr p0.3 ;开LED4(灯) ret on_led5: lcall off_led clr p0.4 ;开LED5(灯) ret on_led6: lcall off_led clr p0.5 ret on_led7: lcall off_led clr p0.6 ret on_led8: lcall off_led clr p0.7 ret ;------------------------------------------------------ disp_R_L: lcall on_led2 ;开灯'2'
mov a,#01h ;显示'1' lcall disp_x ;查表显示
lcall on_led4 ;开灯'4' mov a,#02h ;显示'2' lcall disp_x ;查表显示
lcall on_led6 ;开灯'6' mov a,#03h ;显示'3' lcall disp_x ;查表显示
lcall on_led8 ;开灯'8' mov a,#04h ;显示'4' lcall disp_x ;查表显示
lcall on_led7 ;开灯'7' mov a,#05h ;显示'5' lcall disp_x ;查表显示
lcall on_led5 ;开灯'5' mov a,#06h ;显示'6' lcall disp_x ;查表显示
lcall on_led3 ;开灯'3' mov a,#07h ;显示'7' lcall disp_x ;查表显示
lcall on_led1 ;开灯'1' mov a,#08h ;显示'8' lcall disp_x ;查表显示 ret disp_L_R: lcall on_led1 ;开灯'1'
mov a,#01h ;显示'1' lcall disp_x ;查表显示
lcall on_led3 ;开灯'3' mov a,#02h ;显示'2' lcall disp_x ;查表显示
lcall on_led5 ;开灯'5' mov a,#03h ;显示'3' lcall disp_x ;查表显示
lcall on_led7 ;开灯'7' mov a,#04h ;显示'4' lcall disp_x ;查表显示
lcall on_led8 ;开灯'8' mov a,#05h ;显示'5' lcall disp_x ;查表显示
lcall on_led6 ;开灯'6' mov a,#06h ;显示'6' lcall disp_x ;查表显示
lcall on_led4 ;开灯'4' mov a,#07h ;显示'7' lcall disp_x ;查表显示
lcall on_led2 ;开灯'2' mov a,#08h ;显示'8' lcall disp_x ;查表显示 ret
;------------------------定时器0(秒信号)------------------------------- ; ; 机器周器:12/11.0592M=1.085微妙 ; 定时一秒,从p0口输出, (25个20ms) [500ms反转一次] ; N(次数)=20毫秒/1.085微妙=18433D ; 用16位定时,T0初值X=65535-18433=47102D=B7FEH ,即:th0=B7h,tl0=FEh ; 用s_numb记次数(共25次) ;---------------------------------------------------------------------- to_t0: mov th0,#0b7h ;重新装入常数 mov tl0,#0feh setb tr0 dec s_numb ;总次数减一 mov r3,s_numb cjne r3,#00h,no_to1s ;无减完退出!
mov s_numb,#25 ;减完,需重新置次数.
mov a,s_data ;LED灯显示 cpl a mov p0,a mov s_data,a
mov a,#08h ;判断秒显示>9? clr c subb a,s_set jc to_00m
inc s_set mov a,s_set
lcall disp_x ;查表显示秒(1,2...,9) no_to1s: reti to_00m: mov s_set,#00h mov a,s_set
lcall disp_x ;查表显示0秒 reti ; ;----------------串口部分-------------------- ; R_cd: mov a,#0aah mov sbuf,a w_cd_aa: jbc ti,is_cd1 sjmp w_cd_aa is_cd1: mov sbuf,data_t w_cd_cd: jbc ti,is_cd2 sjmp w_cd_cd is_cd2: ret to_sbuf: jbc ri,to_comd1 sjmp to_sbuf to_comd1: mov a,sbuf cjne a,#0aah,no_aah_end w_cd1: jbc ri,to_comd2 sjmp w_cd1 to_comd2: mov a,sbuf cjne a,#01h,no_cd1 mov data_t,a mov s_data,a
mov a,#01h lcall disp_x ;查表显示 lcall R_cd sjmp no_aah_end no_cd1: cjne a,#02h,no_cd2 mov s_data,a mov data_t,a mov a,#02h lcall disp_x ;查表显示 lcall R_cd sjmp no_aah_end no_cd2: cjne a,#03h,no_cd3 mov s_data,a mov data_t,a mov a,#03h lcall disp_x ;查表显示 lcall R_cd sjmp no_aah_end
no_cd3: cjne a,#04h,no_cd4 mov data_t,a lcall disp_L_R lcall disp_R_L mov a,#04h lcall disp_x ;查表显示 lcall R_cd sjmp no_aah_end
no_cd4: cjne a,#05h,no_cd5 mov data_t,a lcall disp_R_L lcall disp_L_R
mov a,#05h lcall disp_x ;查表显示 lcall R_cd sjmp no_aah_end no_cd5: cjne a,#06h,no_cd6 mov s_data,#99h
mov a,#06h lcall disp_x ;查表显示 lcall R_cd lcall l_speak sjmp no_aah_end no_cd6:
no_aah_end: reti
;-------------主程序部分---------------------- main: mov sp,#60h ;设堆栈 mov p0,#55h setb led_com clr speak sjmp main mov ie,#0ffh ;将中断全部关掉? mov tmod,#00100001b ;T1为8位重装(0010b为波特率),T0为本16位定时器(0001b) mov tl1,#0fdh ;波特率:9.6K mov th1,#0fdh mov pcon,#00h ;smod=0 mov scon,#01010000b ;方式1,8bit ; ; 机器周器:12/11.0592M=1.085微妙 ; 定时一秒,从p0口输出, (25个20ms) [500ms反转一次] ; N(次数)=20毫秒/1.085微妙=18433D ; 用16位定时,T0初值X=65535-18433=47102D=B7FEH ,即:th0=B7h,tl0=FEh ; 用s_numb记次数(共25次) ;
mov th0,#0B7h mov tl0,#0FEh
mov s_numb,#25 ; (25x20=500ms) mov s_data,#5ah ;? mov s_set,#00h
clr speak ;speak(p3.5)关蜂鸣器 mov p2,#00h setb led_com
setb ea setb et0 setb tr0
setb es setb tr1 setb ren
loop: lcall disp_R_L ; lcall disp_L_R ; lcall l_speak ;发声 lcall a_delay ; lcall disp_L_R ;
cpl p1.0 ljmp loop ;循环显示 end
END
|