⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51单片机实用程序库.txt

📁 c51程序集锦,源程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
4.1 流水灯
程序介绍:利用P1 口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮的效果。实际应用中例如:
广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
9
MOV A,#00H
MOV P1,A ;灭所有的灯
MOV A,#11111110B
MAIN1:
MOV P1,A ;开最左边的灯
ACALL DELAY ;延时
RL A ;将开的灯向右边移
AJMP MAIN ;循环
DELAY:
MOV 30H,#0FFH
D1: MOV 31H,#0FFH
D2: DJNZ 31H,D2
DJNZ 30H,D1
RET
END


4.2 方波输出
程序介绍:P1.0 口输出高电平,延时后再输出低电
平,循环输出产生方波。实际应用中例如:波形发生器。
程序实例(FAN.ASM):
ORG 0000H
MAIN:
;直接利用P1.0口产生高低电平地形成方波//////////////
ACALL DELAY
SETB P1.0
ACALL DELAY
10
CLR P1.0
AJMP MAIN
;//////////////////////////////////////////////////
DELAY:
MOV R1,#0FFH
DJNZ R1,$
RET
END




五、定时器功能实例
5.1 定时1秒报警
程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1
次,以达到定时报警的目的。实际应用例如:定时报警器。
程序实例(DIN1.ASM):
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP DIN0 ;定时器0入口
MAIN:
TFLA G EQU 34H ;时间秒标志,判是否到50个
0.2秒,即50*0.2=1秒
MOV TMOD,#00000001B;定时器0工作于方式
1
MOV TL0,#0AFH
MOV TH0,#3CH ;设定时时间为0.05秒,定时
20次则一秒
11
SETB EA ;开总中断
SETB ET0 ;开定时器0中断允许
SETB TR0 ;开定时0运行
SETB P1.0
LOOP: AJMP LOOP
DIN0:
;是否到一秒////////////////////////////////////////
INCC: INC TFLAG
MOV A,TFLAG
CJNE A,#20,RE
MOV TFLAG,#00H
CPL P1.0
;//////////////////////////////////////////////////
RE:
MOV TL0,#0AFH
MOV TH0,#3CH ;设定时时间为0.05秒,定时
20次则一秒
RETI
END




5.2 频率输出公式
介绍:f=1/t
s51 使用12M晶振,一个周期是1微秒使用定时器1
工作于方式0,最大值为65535,以产生200HZ的频率为
例:
200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电
12
平或低电平的时间为2500 微秒。这样,定时值应设为
65535-2500=63035,将它转换为十六进制则为:F63B。
具体程序请看f200.asm
频率递增:
200HZ:63035:F63B
250HZ:63535:F82F
300HZ:63868:F97C
5.3 200HZ频率输出
程序介绍:利用定时器定时,在P1.0 口产生200HZ
的频率输出。实际应用例如:传感器前级推动。
程序实例(F200.ASM):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN0
MAIN:
CLR P1.0 ;产生一个低电平,实际上
是从p1.0口产生频率
MOV TMOD,#00010000B ;定时器1工作于方式0
MOV TH1,#0F6H
MOV TL1,#3BH ;频率产生的时间,详细请
见频率公式
SETB EA ;开总中断
13
SETB TR1 ;开定时器1运行
SETB ET1 ;开定时器1允许
LOOP: AJMP LOOP ;无限循环
DIN0: CPL P1.0 ;产生一个高电平,
下次来就是低电平(因为取反),一个高电平和一个低电平
形成一个周期
MOV TH1,#0F6H
MOV TL1,#3BH ;重置频率产生时间
RETI ;返回
END





5.4 200——250HZ变化频率输出
程序介绍:利用定时器定时时间的变化,由P1.0 口
产生200——250HZ变化的频率。实际应用例如:传感器
前级推动、频率发生器。
程序实例(F250.ASM):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1
MAIN:
;定义频率200和300//////////////////////////////////
F2H EQU 30H
F2L EQU 31H
F3H EQU 32H
F3L EQU 33H
14
;//////////////////////////////////////////////////
;定义频率保持初值//////////////////////////////////
MOV R1,#50
MOV R2,#02H
;//////////////////////////////////////////////////
;频率赋初值////////////////////////////////////////
MOV F2H,#0F6H
MOV F2L,#3BH
MOV F3H,#0F8H
MOV F3L,#2FH
;//////////////////////////////////////////////////
CLR P1.0 ;在P1.0口产生一个低
电平,一个脉冲是由一个高电平和一个低电平组成的
MOV TMOD,#00010000B ;定时器工作于方式1
MOV TH1,F2H
MOV TL1,F2L ;200HZ输出
SETB EA ;开总中断
SETB TR1 ;开定时器1运行
SETB ET1 ;开定时器1允许
LOOP: AJMP LOOP
DIN1:
CPL P1.0 ;取反P1.0口,实际
是为了不断的将p1.0的电平关系转换,即产生了频率
;频率保持时间//////////////////////////////////////
DJNZ R1,RE
MOV R1,#50
DJNZ R2,RE
MOV R2,#02H
15
;//////////////////////////////////////////////////
MOV A,F2H
CJNE A,F3H,XIA ;频率高位到300HZ
的高位了吗?
AJMP JIA ;频率高位没到
300HZ的高位值,直接将低位值加1
XIA: INC F2L
MOV A,F2L
CJNE A,#00H,RE
INC F2H
MOV A,F2H
CJNE A,F3H,RE
;/////////////////////////////////////////////
;频率高位加到300HZ的高位值了,低位加一,到300HZ的低
位值了吗,没到出去,到了关定时器
JIA:
INC F2L ;到了将200HZ频率的低位加1
MOV A,F2L
CJNE A,#F3L,RE
CLR TR1
;/////////////////////////////////////////////
RE:
MOV TH1,F2H
MOV TL1,F2L
RETI
END
16





六、数显
0——9999显示
程序介绍:利用S51的串行口功能,实现数码管0—
—9999 的循环显示。实际应用例如:电子计分牌。
程序实例(9999.ASM):
ORG 0000H
MAIN:
GEE EQU 30H
SHI EQU 31H
BEI EQU 32H
QIAN EQU 33H ;定义个十百千
MOV GEE,#00H
MOV SHI,#00H
MOV BEI,#00H
MOV QIAN,#00H ;赋初值
MOV SCON,#00H ;串行口工作于方式
0.同步移位
;显示个,十,百,千//////////////////////////////////
DISPLAY:
ACALL DELAY ;延时
MOV DPTR,#SETTAB
MOV A,GEE
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
17
CLR TI
MOV DPTR,#SETTAB
MOV A,SHI
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV DPTR,#SETTAB
MOV A,BEI
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV DPTR,#SETTAB
MOV A,QIAN
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
;/////////////////////////////////////////////
;个,十,百,千的依次加一/////////////////////
INC GEE
MOV A,GEE
CJNE A,#0AH,DISPLAY
MOV GEE,#00H
INC SHI
MOV A,SHI
CJNE A,#0AH,DISPLAY
18
MOV SHI,#00H
INC BEI
MOV A,BEI
CJNE A,#0AH,DISPLAY
MOV BEI,#00H
INC QIAN
MOV A,QIAN
CJNE A,#0AH,DISPLAY
MOV QIAN,#00H
AJMP DISPLAY
;//////////////////////////////////////////////////
;延时//////////////////////////////////////////////
DELAY: MOV R1,#0FFH
E1: MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,E1
RET
;/////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,
F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END




七、AD 转换
7.1 AD转换(数码显示)
程序介绍:利用ADC0809模拟通道3输入电压,经单片机
19
处理后在数码管上用相对应的16进制数显示出来,0—5V对
应为0--0FFH,实际应用例如:数据采集。
程序操作:程序写完上电运行后,用本机配带的专用起微调
图15所示电位器,会在数码管上看到随不同电压而变化的对
应16进制值。也可以用
万用表实ADC0809IN3脚
电压,来检验所对应显
示的16进制数。
图15
程序实例(ad.asm):
ORG 0000H
MAIN1:
ACALL DELAY ;延时
ACALL AD ;呼叫AD子程序
;将转换的数字量屏蔽高位低位送显////////////////////
MOV 31H,30H
MOV A,30H
ANL A,#0FH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
;//////////////////////////////////////////////////
;将转换的数字量屏蔽低位高位送显////////////////////
MOV A,30H
20
ANL A,#0F0H
SWAP A
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
;//////////////////////////////////////////////////
AJMP MAIN1 ;返回主程序
AD: MOV DPTR,#7F00H ;指向转换地址
MOV A,#03H ;指向转换口
MOVX @DPTR,A ;转换
MOV R1,#64H
D3: DJNZ R1,D3 ;等100微秒转换完
MOVX A,@DPTR ;转换后的值给A
MOV 30H,A ;转换的值给30H
RET
DELAY: ;延时
MOV R2,#0FFH
D14: MOV R3,#0FFH
D12: DJNZ R3,D12
DJNZ R2,D14
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
21




7.2 十六进制两位数加法器(数码显示)
程序介绍:将ADC0809输入的两个不同电压(相同电
压也可相加,只是为举例说明,所以取不同电压)所对应
的16进制数相加显示出来。实际应用例如:取代加法运放
电路。
程序操作:程序写完上电运行后,用本机配带的钟表
起微调图16所示电位器,输入两个不同电压,数码管会显
示两个不同的对应16进制数,随后数码管会显示两个16
进制数相加的值。
程序实例(add2.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD转换值
ADDNUMBER EQU 31H ;加数值1
ADL EQU 32H ;//
ADH EQU 33H ;ADL转换高低位值
DISL EQU 34H ;//
DISH EQU 35H ;显示高低位值
ADDTOTAL EQU 36H ;第一次AD转换值
ADDJW EQU 37H ;加法进位数
ADDHOLD EQU 38H
;赋初值////////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADDNUMBER,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
22
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDTOTAL,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL AD ;呼叫AD子程序
ACALL DELAY ;延时
ACALL CAIFEN ;呼叫AD值拆分为高
低的程序
ACALL DISPLAY ;呼叫显示子程序
MOV A,ADNUMBER ;取AD值
CJNE A,ADDHOLD,ADD3 ;与上次AD值比
较,不相等,即输入了新的AD值,去AD3执行
AJMP MAIN1 ;是相等的,证
明没有输入新的AD值,回去显示老的AD值
ADD3: MOV A,ADDHOLD
CJNE A,#00H,ADD4
MOV ADDHOLD,ADNUMBER ;有一种情况就
是是第一次进来,AD保持值里面是放的初值00,与取的AD值
不同,是这种情况,也返回去
AJM MAIN1
ADD4: MOV ADDNUMBER,ADDHOLD ;是真的输入

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -