返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

<>51单片机学习网热心版主单片东东,收集整理的单片机教程课程(例子程序, 特别推荐!)转载请保留连接!
单片机简介与单片机的发展历史I/O 口功能实例流水灯和方波试验
定时器实例 (1秒报警,200hz输出 200-250变化输出)

数码管0—9999 的循环显示

ADC0809模拟输入电压,在数码管上显示出来

ADC0809输入的两个不同电压数相加显示出来

软件滤波十六进制六位数加法(数码显示)求六位和中的最大值和最小值(数码显示)
求减去最大和最小值后的值(数码显示)除4所得软件滤波值(数码显示)
软件模拟一个振动传感器软件搜频的全过程在显示频率输出的同时显示AD值(数码显示)
过程检定(数码显示)

DA 转换三角波 正旋波 梯形波(dac0832)

串口通信,看到画面——“我爱单片机”。

按键数显,数码管显示加一
PWM码简介及解码原理--红外遥控原理与解码程序
智能定时的4位电子钟(带定时控制)智能红外工业控制器

51单片机学习网热心版主单片东东,收集整理的单片机教程课程(例子程序, 特别推荐!)转载请保留连接!

<>如果您有任何不明白的地方请参加51单片机学习网论坛讨论

12.1 电子钟

程序及操作指南:程序写入上电后,将在四个数码管上显示0000,然后每隔一分钟,数码管将从低位跳变,该

程序模拟的就是时钟。用按键数显键可将时间调至正确时间。按按键数键一下,数码管将在低位闪烁,然后依次按

一下,数码管的闪烁位置就向前移一个数码管,按到第下时,退出。将对应的数码管按闪烁以后,长按按键数显

键,数码管将会显示从1至9,显示到所需时间,松开按键数显键,数码管显示对应所设时间,程序也会记下这个值。

例设置成2334,即晚上11点34分。设置步骤如下:按键一下长按至数码管分低显示到4时松开按键一下长按至

数码管分高位显示到3时松开按键一下长按至数码管时低位显示到3时松开按键一下长按至数码管时高位显示到2时松开。

注意:如果小时设置超过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