| 超级好的51单片机编程例程!工程师必看! | ||
| 单片机简介与单片机的发展历史 |
I/O
口功能实例 |
|
| 定时器实例
(1秒报警,200hz输出 200-250变化输出) |
||
| 软件滤波十六进制六位数加法(数码显示) |
求六位和中的最大值和最小值(数码显示) |
|
| 求减去最大和最小值后的值(数码显示) |
除4所得软件滤波值(数码显示) |
|
| 软件模拟一个振 |
在显示频率输出的同时显示AD值(数码显示) |
|
| 过程检定(数码显示) |
||
| 按键数显,数码管显示加一 | ||
| PWM码简介及解码原理 |
||
| 智能定时的4位电子钟(带定时控制) |
智能红外工业控制器 |
|
|
51单片机学习网热心版主单片东东,收集整理的单片机教学课程(例子程序, 特别推荐!)转载请保留连接! 12.1
电子钟 程序及操作指南:程序写入上电后,将在四个数码管 程序模拟的就是时钟。用按键数显键可将时间调至正确时 一下,数码管的闪烁位置就向前移一个数码管,按到第 键,数码管将会显示从1至9,显示到所需时间,松开按键 例设置成2334, 数码管分高位显示到3时松开按键一下长按 注意:如果小时设置超过23,数码管将显示ERR(错 程序实例(clock.asm): ORG
0000H AJMP
MAIN ORG
0003H AJMP
INT ;外中断0入口 ORG
000BH AJMP
DIN0 ;定时器0入口 MAIN: 92 DISML
EQU 30H DISMH
EQU 31H DISHL
EQU 32H DISHH
EQU 33H ;显示分,时的个时位 TFLAG
EQU 34H ;时间秒标志,判是否到50 个0.2秒,即50*0.2=1秒 SETFLAG
EQU 35H ;设置标志,依次从个位到 十位到百位到千位 ADDFLAG
EQU 36H MFLAG
EQU 37H ;时间分标志,判是否到60 个一秒,即一分 MOV
DISML,#00H MOV
DISMH,#00H MOV
DISHL,#00H MOV
DISHH,#00H ;显示分,时的个时位初值 MOV
TFLAG,#00H ;时间秒标志初值 MOV
SETFLAG,#00H ;设置标志初值 MOV
ADDFLAG,#00H ;设数加标志 MOV
MFLAG,#00H ;时间分标志 MOV
SCON,#00H ;串行口工作于方式0(同 步移位) MOV
TMOD,#00000001B;定时器0工作于方式1 MOV
TL0,#0EEH MOV
TH0,#31H ;设定时时间为0.05秒,定 时20次则一秒 SETB
EA ;开总中断 SETB
ET0 ;开定时器0中断允许 SETB
EX0 ;开外中断0允许 93 SETB
TR0 ;开定时0运行 SETB
IT0 ;外中断0下降沿触发 DIS: ACALL
DISPLAY ;调用显示时钟程序 AJMP
CRITERION ;调判断程序,按键是否按 了。 ;
ACALL DELAY ;
AJMP DIS DIN0: PUSH
ACC ;设置时是否出错,比如小时设到超过了23////////// MOV
A,DISHH CJNE
A,#02H,INCC MOV
A,DISHL CLR
C SUBB
A,#04H JC
INCC MOV
SETFLAG,#06H AJMP
RE ;///////////////////////////////////////////// ;是否到一秒/////////////////////////////////// INCC:
INC TFLAG MOV
A,TFLAG CJNE
A,#19,RE MOV
TFLAG,#00H ;///////////////////////////////////////////// ;是否到一分/////////////////////////////////// INC
MFLAG 94 MOV
A,MFLAG CJNE
A,#60,RE MOV
MFLAG,#00H ;///////////////////////////////////////////// ;计分///////////////////////////////////////// INC
DISML MOV
A,DISML CJNE
A,#0AH,RE MOV
DISML,#00H INC
DISMH MOV
A,DISMH CJNE
A,#06H,RE MOV
DISMH,#00H ;///////////////////////////////////////////// ;计时///////////////////////////////////////// ;计时分两种情况,分为小时的高位到2和没到2,没到2时时 低位是逢10进位,到2后,时低位到4则全归0 MOV
A,DISHH CJNE
A,#02H,HJ ;///////////////////////////////////////////// ;第一种情况/////////////////////////////////// INC
DISHL MOV
A,DISHL CJNE
A,#04H,RE MOV
DISHL,#00H MOV
DISHH,#00H AJMP
RE ;///////////////////////////////////////////// 95 ;第二种情况/////////////////////////////////// HJ:
INC DISHL MOV
A,DISHL CJNE
A,#0AH,RE MOV
DISHL,#00H INC
DISHH ;///////////////////////////////////////////// RE: MOV
TL0,#0EEH MOV
TH0,#31H ;设定时时间为0.02秒,定 时50次则一秒 POP
ACC RETI
;退出中断 INT: PUSH
ACC JB
P3.2,EXIT MOV
R3,#0FFH DJNZ
R3,$ JB
P3.2,EXIT ;判键抖 MOV
A,SETFLAG CJNE
A,#00H,ADD2 AJMP
SETKEY ADD2:
CJNE A,#06H,B0 ;是错误了吗,是的,去恢 复 MOV
SETFLAG,#00H AJMP
SETKEY B0:
MOV R4,#15H ADD1:
JB P3.2,SETKEY 96 ACALL
DELAY DJNZ
R4,ADD1 MOV
ADDFLAG,#01H AJMP
EXIT ;状态增值///////////////////////////////////// SETKEY:
INC SETFLAG MOV
A,SETFLAG CJNE
A,#05H,EXIT MOV
SETFLAG,#00H ;///////////////////////////////////////////// EXIT: POP
ACC RETI ;显示时钟///////////////////////////////////// DISPLAY: MOV
A,DISML MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A D1:
JNB TI,D1 CLR
TI MOV
A,DISMH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A D2:
JNB TI,D2 CLR
TI MOV
A,DISHL 97 MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A D3:
JNB TI,D3 CLR
TI MOV
A,DISHH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A D4:
JNB TI,D4 CLR
TI RET ;///////////////////////////////////////////// ;判按键标志/////////////////////////////////// CRITERION: MOV
A,SETFLAG CJNE
A,#00H,ERFLAG ;设置标志为0,即没 有按键,继续去显示 AJMP
RET1 ERFLAG:
CJNE A,#06H,SETML1 ;设置标志为6,即错 误了,去显示错误 AJMP
ERR SETML1:
CJNE A,#01H,SETMH1 AJMP
SETML ;设置标志为1,显示 设分低 SETMH1:
CJNE A,#02H,SETHL1 AJMP
SETMH ;设置标志为2,显示 设分高 98 SETHL1:
CJNE A,#03H,SETHH1 AJMP
SETHL ;设置标志为3,显示 设时低 SETHH1:
CJNE A,#04H,RET1 ;设置标志为5,是退 出标志 AJMP
SETHH ;设置标志为4,显示 设时高 RET1:
SETB TR0 ACALL
DELAY AJMP
DIS ;///////////////////////////////////////////// ;设分低(分低位闪烁)///////////////////////// SETML: CLR
TR0 MOV
A,ADDFLAG CJNE
A,#01H,SETML2 ;是否按下了2秒钟, 是就开始闪烁设置 JNB
P3.2,ADD3 MOV
ADDFLAG,#00H ;松开了,清闪标志 AJMP
SETML2 ADD3:
INC DISML MOV
A,DISML CJNE
A,#0AH,SETML2 MOV
DISML,#00H SETML2:
ACALL DELAY2 ACALL
DISPLAY ACALL
DELAY2 MOV
SBUF,#00H 99 E1:
JNB TI,E1 CLR
TI MOV
A,DISMH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A E2:
JNB TI,E2 CLR
TI MOV
A,DISHL MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A E3:
JNB TI,E3 CLR
TI MOV
A,DISHH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A E4:
JNB TI,E4 CLR
TI AJMP
CRITERION ;////////////////////////////////////////////////// ;设分高(分高位闪烁)//////////////////////////////// SETMH: CLR
TR0 MOV
A,ADDFLAG CJNE
A,#01H,SETMH2 ;是否按下了2秒钟, 是就开始闪烁设置 100 JNB
P3.2,ADD4 MOV
ADDFLAG,#00H ;松开了,清闪标志 AJMP
SETMH2 ADD4:
INC DISMH MOV
A,DISMH CJNE
A,#0AH,SETMH2 MOV
DISMH,#00H SETMH2:
ACALL DELAY2 ACALL
DISPLAY ACALL
DELAY2 MOV
A,DISML MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A F1:
JNB TI,F1 CLR
TI MOV
SBUF,#00H F2:
JNB TI,F2 CLR
TI MOV
A,DISHL MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A F3:
JNB TI,F3 CLR
TI MOV
A,DISHH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR 101 MOV
SBUF,A F4:
JNB TI,F4 CLR
TI AJMP
CRITERION ;////////////////////////////////////////////////// ;设时低位(时低位闪烁)//////////////////////////// SETHL: CLR
TR0 MOV
A,ADDFLAG CJNE
A,#01H,SETHL2 ;是否按下了2秒钟, 是就开始闪烁设置 JNB
P3.2,ADD5 MOV
ADDFLAG,#00H ;松开了,清闪标志 AJMP
SETHL2 ADD5:
INC DISHL MOV
A,DISHL CJNE
A,#0AH,SETHL2 MOV
DISHL,#00H SETHL2:
ACALL DELAY2 ACALL
DISPLAY ACALL
DELAY2 MOV
A,DISML MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A G1:
JNB TI,G1 CLR
TI MOV
A,DISMH 102 MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A G2:
JNB TI,G2 CLR
TI MOV
SBUF,#00H G3:
JNB TI,F3 CLR
TI MOV
A,DISHH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A G4:
JNB TI,G4 CLR
TI AJMP
C RITERION ;////////////////////////////////////////////////// ;设时高位(时高位闪烁)//////////////////////////// SETHH: CLR
TR0 MOV
A,ADDFLAG CJNE
A,#01H,SETHH2 ;是否按下了2秒钟, 是就开始闪烁设置 JNB
P3.2,ADD6 MOV
ADDFLAG,#00H ;松开了,清闪标志 AJMP
SETHH2 ADD6:
INC DISHH MOV
A,DISHH CJNE
A,#03H,SETHH2 103 MOV
DISHH,#00H SETHH2:
ACALL DELAY2 ACALL
DISPLAY ACALL
DELAY2 MOV
A,DISML MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A H1:
JNB TI,H1 CLR
TI MOV
A,DISMH MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A H2:
JNB TI,H2 CLR
TI MOV
A,DISHL MOV
DPTR,#SETTAB MOVC
A,@A+DPTR MOV
SBUF,A H3:
JNB TI,H3 CLR
TI MOV
SBUF,#00H H4:
JNB TI,H4 CLR
TI AJMP
CRITERION ;////////////////////////////////////////////////// ;错误显示////////////////////////////////////////// 104 ERR:
CLR TR0 ACALL
DELAY2 MOV
SBUF,#0EAH I1:
JNB TI,I1 CLR
TI MOV
SBUF,#0EAH I2:
JNB TI,I2 CLR
TI MOV
SBUF,#9EH I3:
JNB TI,I3 CLR
TI MOV
SBUF,#00H I4:
JNB TI,I4 CLR
TI AJMP
CRITERION ;延时///////////////////////////////////////// DELAY: MOV
R1,#100 DE:
MOV R2,#100 DJNZ
R2,$ DJNZ
R1,DE RET ;////////////////////////////////////////////////// DELAY1: MOV
R1,#0FFH DE1:
MOV R2,#0FFH DJNZ
R2,$ DJNZ
R1,DE1 105 RET DELAY2:
MOV 38H,#02H DE3:
MOV R2,#0FFH DE2:
MOV R1,#0FFH DJNZ
R1,$ DJNZ
R2,DE2 DJNZ
38H,DE3 RET SETTAB: DB
0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H DB
0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码 END |