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

📄 源程序.asm

📁 本人跟网上学单片机时,调试用过的资料,有汇编和C,
💻 ASM
📖 第 1 页 / 共 5 页
字号:
PUSH ACC
67
CPL P1.0 ;取反P1.0口,实际是为了
不断的将p1.0的电平关系转换,即产生了频率
;频率保持时间//////////////////////////////////////
DJNZ R1,RE
MOV R1,#100
DJNZ R2,RE
MOV R2,#02H
;//////////////////////////////////////////////////
INC DISFLAG
MOV ` A,DISFLAG
CJNE A,#0AH,FF
MOV DISFLAG,#00H
INC DISL
MOV A,DISL
CJNE A,#0AH,FF
MOV DISL,#00H
INC DISH
;//////////////////////////////////////////////////
FF: 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
68
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
POP ACC
RETI
AD: MOV DPTR,#7F00H ;指向转换地址
MOV A,#03H ;指向转换口
MOVX @DPTR,A ;转换
MOV 40H,#64H
D6: DJNZ 40H,D6 ;等100微秒转换完
MOVX A,@DPTR ;转换后的值给A
MOV ADNUMBER,A ;转换的值给30H
RET
DELAY:
MOV R3,#0FFH
D5: DJNZ R3,D5
RET
69
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
7.43 过程检定(数码显示)
程序实例(search.asm):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1
MAIN:
;定义频率200和300//////////////////////////////////
F2H EQU 30H
F2L EQU 31H
F3H EQU 32H
F3L EQU 33H
;//////////////////////////////////////////////////
DISFLAG EQU 34H ;显示标志
DISL EQU 35H ;显示低位
DISH EQU 36H ;显示高位
ADNUMBER EQU 37H ;AD值
DISADL EQU 38H ;显示AD低位
DISADH EQU 39H ;显示AD高位
ADTIME EQU 40H ;AD转换时间值
SCHNUMBER EQU 41H ;搜频比较值
HOLDADL EQU 42H
70
HOLDADH EQU 43H ;搜到的AD值
HOLDFL EQU 44H
HOLDFH EQU 45H ;搜到的频率值
;//////////////////////////////////////////////////
MOV SCHNUMBER,#00H
MOV HOLDADL,#00H
MOV HOLDADH,#00H
MOV HOLDFL,#00H
MOV HOLDFH,#00H ;赋初值
;/////////////////////////////////////////////
;定义频率保持初值/////////////////////////////
MOV R1,#100
MOV R2,#02H
;/////////////////////////////////////////////
MOV ADNUMBER,#00H ;AD转换数初值
;显示高低位初值///////////////////////////////
MOV DISADL,#00H
MOV DISADH,#00H
;/////////////////////////////////////////////
;显示赋初值///////////////////////////////////
MOV DISFLAG,#00H
MOV DISL,#00H
MOV DISH,#00H
;////////////////////////////////////////////
;频率赋初值//////////////////////////////////
MOV F2H,#0F6H
MOV F2L,#3BH
MOV F3H,#0F8H
71
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允许
ADDIS: ACALL AD ;呼叫AD子程序
;将转换的数字量屏蔽高位低位送DISADL保存///////
MOV A,ADNUMBER
ANL A,#0FH
MOV DISADL,A
;/////////////////////////////////////////////
;将转换的数字量屏蔽低位,将高位送DISADH保存////
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV DISADH,A
;/////////////////////////////////////////////
DISPLAY:
MOV A,DISADL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
72
CLR TI
MOV A,DISADH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
ACALL DELAY
;过程检定,即模拟搜到极值//////////////////////
MOV A,ADNUMBER
CLR C
SUBB A,SCHNUMBER ;取AD值与初值比较
JNC SW
;搜频是否完成,完成去显示搜到的值,没有继续搜//
MOV A,DISH
CJNE A,#05H,ADDIS1
73
MOV A,DISL
CJNE A,#00H,ADDIS1
AJMP DISSEARCH
;/////////////////////////////////////////////
;始终将初值赋于最大值,并将此时的频率与AD值保存
SW: MOV SCHNUMBER,ADNUMBER
MOV HOLDADL,DISADL
MOV HOLDADH,DISADH
MOV HOLDFL,DISL
MOV HOLDFH,DISH
;/////////////////////////////////////////////
CJNE A,#05H,ADDIS1
MOV A,DISL
CJNE A,#00H,ADDIS1
AJMP DISSEARCH
ADDIS1:
AJMP ADDIS
;搜到的频率与AD值显示/////////////////////////
DISSEARCH:
MOV A,HOLDADL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D11: JNB TI,D11
CLR TI
MOV A,HOLDADH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
74
MOV SBUF,A
D12: JNB TI,D12
CLR TI
MOV A,HOLDFL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D13: JNB TI,D13
CLR TI
MOV A,HOLDFH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D14: JNB TI,D14
CLR TI
;/////////////////////////////////////////////
LOOP: AJMP LOOP
DIN1:
PUSH ACC
CPL P1.0 ;取反P1.0口,实际是为了不断的将
p1.0的电平关系转换,即产生了频率
;频率保持时间/////////////////////////////////
DJNZ R1,RE
MOV R1,#100
DJNZ R2,RE
MOV R2,#02H
;/////////////////////////////////////////////
INC DISFLAG
75
MOV A,DISFLAG
CJNE A,#0AH,FF
MOV DISFLAG,#00H
INC DISL
MOV A,DISL
CJNE A,#0AH,FF
MOV DISL,#00H
INC DISH
;/////////////////////////////////////////////
FF: 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
76
;/////////////////////////////////////////////
RE:
MOV TH1,F2H
MOV TL1,F2L
POP ACC
RETI
AD: MOV DPTR,#7F00H ;指向转换地址
MOV A,#03H ;指向转换口
MOVX @DPTR,A ;转换
MOV ADTIME,#64H
D6: DJNZ ADTIME,D6 ;等100微秒转换完
MOVX A,@DPTR ;转换后的值给A
MOV ADNUMBER,A ;转换的值给30H
RET
DELAY:
MOV R3,#0FFH
D5: DJNZ R3,D5
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
77
八、DA 转换
8.1 三角波
程序介绍:单片机通过DAC0832转换在LM358的7脚输
出三角波。实际应用如:函数波形发生器。
程序实例(0832shan.asm):
ORG 0000H
MAIN:
MOV DPTR,#0BFFFH ;选通地址
STR1:
MOV R6,#00H
;通过上升和下降来产生三角波///////////////////
;电压随时间上升///////////////////////////////
STR2: MOV A,R6
MOVX @DPTR,A
INC R6
CJNE R6,#0FFH,STR2
;/////////////////////////////////////////////
;电压随时间下降///////////////////////////////
STR3: DEC R6
MOV A,R6
MOVX @DPTR,A
CJNE R6,#00H,STR3
;/////////////////////////////////////////////
AJMP STR1
END
78
8.2 方波
程序介绍:程序介绍:单片机通过DAC0832转换在
LM358的7脚输出方波。实际应用如:函数波形发生器。
程序实例(0832fan.asm):
ORG 0000h
MAIN: MOV DPTR,#0BFFFH
;通过高低电平地的变化来输出方波///////////////
LOOP1:
MOV A,0
MOVX @DPTR,A ;向选通地址送低电平地
ACALL DELAY
MOV A,#0FFH
MOVX @DPTR,A ;向选通地址送高电平
ACALL DELAY
AJMP LOOP1
;/////////////////////////////////////////////
DELAY: MOV 30H,#0FFH ;延时,通过改变它的大小
可以改变占空比
D2: DJNZ 30H,D2
RET
END
8.3 正弦波
程序介绍:程序介绍:单片机通过DAC0832转换在
LM358的7脚输出正弦波。实际应用如:函数波形发生器。
程序实例(0832xuan.asm):
ORG 000H
MAIN: MOV R1,#00H ;取表格初值
79
LOOP1:
;在表格里取数送到指定地址/////////////////////
MOV A,R1
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV DPTR,#0BFFFH
MOVX @DPTR,A
;/////////////////////////////////////////////
INC R1 ;表格加一
AJMP LOOP1 ;循环
SETTAB:
;正弦表格/////////////////////////////////////
DB 80H,83H,86H,89H,8DH,90H,93H,96H
DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H
DB 0C7H,0CAH,0CCH,0CFH,0D1H, 0D4H,0D6H,0D8H
DB 0DAH,0DDH,0DFH,0E1H,0E3H, 0E5H,0E7H,0E9H
DB 0EAH,0ECH,0EEH,0EFH,0F1H, 0F2H,0F4H,0F5H
DB 0F6H,0F7H,0F8H,0F9H,0FAH, 0FBH,0FCH,0FDH
DB 0FDH,0FEH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FEH,0FDH
DB 0FDH,0FCH,0FBH,0FAH,0F9H, 0F8H,0F7H,0F6H
DB 0F5H,0F4H,0F2H,0F1H,0EFH, 0EEH,0ECH,0EAH
DB 0E9H,0E7H,0E5H,0E3H,0E1H, 0DEH,0DDH,0DAH
DB 0D8H,0D6H,0D4H,0D1H,0CFH, 0CCH,0CAH,0C7H
DB 0C5H,0C2H,0BFH,0BCH,0BAH, 0B7H,0B4H,0B1H
DB 0AEH,0ABH,0A8H,0A5H,0A2H, 9FH, 9CH, 99H
DB 96H, 93H, 90H, 8DH, 89H, 86H, 83H, 80H
80
DB 80H, 7CH, 79H, 78H, 72H, 6FH, 6CH, 69H
DB 66H, 63H, 60H, 5DH, 5AH, 57H, 55H, 51H
DB 4EH, 4CH, 48H, 45H, 43H, 40H, 3DH, 3AH
DB 38H, 35H, 33H, 30H, 2EH, 2BH, 29H, 27H
DB 25H, 22H, 20H, 1EH, 1CH, 1AH, 18H, 16H
DB 15H, 13H, 11H, 10H, 0EH, 0DH, 0BH, 0AH
DB 09H, 08H, 07H, 06H, 05H, 04H, 03H, 02H
DB 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H
DB 00H, 00H, 00H, 00H, 00H, 00H, 01H, 02H
DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H
DB 0AH, 0BH, 0DH, 0EH, 10H, 11H, 13H, 15H
DB 16H, 18H, 1AH, 1CH, 1EH, 20H, 22H, 25H
DB 27H, 29H, 2BH, 2EH, 30H, 33H, 35H, 38H
DB 3AH, 3DH, 40H, 43H, 45H, 48H, 4CH, 4EH
DB 51H, 55H, 57H, 5AH, 5DH, 60H, 63H, 66H
DB 69H, 6CH, 6FH, 72H, 76H, 79H, 7CH, 80H
END
8.4 梯形波
程序介绍:程序介绍:单片机通过DAC0832转换在
LM358的7脚输出梯形波。实际应用如:函数波形发生器。
程序实例(0832ti.asm):
ORG 0000h
MAIN:
MOV DPTR,#0BFFFH
STEP: MOV R6,#19H
MOV R4,#0AH
MOV A,0
81
LOOP1: MOVX @DPTR,A ;选通地址
ACALL DELAY ;延时
ADD A,R6 ;每次以19H的梯度增加
DJNZ R4,LOOP1 ;梯度等待的时间
AJMP STEP ;循环
DELAY:
D2: MOV 31H,#0FFH
D1: DJNZ 31H,D1
RET
END
九、PC通讯
发送到上位机显示
程序介绍:单片机利
用串口与定时器功能,以
9600的波特率向PC机发送
"我爱单片机"字符串。图16
PC机用comedebug.com程
序接收。波特率计算请详
见课本。实际应用如: 监控
报警系统。
操作说明:程序写入
后,将数据线插入图16所
示插口,如图17所示,按下图17
波特率按键,这时单片机晶振将会由12M切换到11.0592M
工作(这样做是为了波特率计算方便)最后,打开PC机运
行程序"comedebug.com",如图18所示,设置好波特率,
点击打开串口,将会看到如图所示画面--"我爱单片
82
机"。
图18
程序实例(dispc.asm):
ORG 0000H
MAIN:
MOV TMOD,#20H ;定时器1模式2
MOV TL1,#0FDH
MOV TH1,#0FDH ;波特率9600
SETB TR1 ;开定时器运行
MOV SCON,#01000000B ;串行口工作于方式1
MOV R1,#00H
MAIN1:
MOV A,R1
;/////////////////////////////////////////////
MOV DPTR,#SETTAB
MOVC A,@A+DPTR ;取表格数据送显
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
;/////////////////////////////////////////////
83
CJNE A,#0AH,MAIN1 ;没到结束标志0A继续去
送显
MOV R1,#00H ;到了从头开始送显
AJMP MAIN1
SETTAB:
DB "我爱单片机",0AH
END
十、编程器
89S51--89S52
操作说明:89s51(52)编程器利用了ATMEL公司89S52
的在线可编程功能(ISP)。通过计算机串口将程序下载到
单片机中。编程时,首先连接串口线,一端连实验仪接口,
一端接PC机串口中。MYCOM.EXE程序打开后如图19所示。
首先点擦除,建议擦两次。然后点读取。在右边的文本框
里会看到全是FF,这样表示擦掉了。接着点读取,在弹
出的对话框中找到想要写入程序的16 进制文件(后缀名
为hex).最后单击写入,程序即写入。将单片机换到程
序运行插座上,就可以看到程序运行结果了。
注意:不管是编程时还是程序运行时,一定不要将
单片机的方向放反,否则将会烧坏单片机。
84
图19
十一、中断
11.1 按键数显
程序介绍:程序写入上电后,数码管显示0000,每
按一次按键数显键,数码管显示就会加一。实际应用如:
数码调温显示
程序实例(ajian.asm):
ORG 0000H
AJMP MAIN
ORG 0003H ;外中断0入口
AJMP INT
ORG 0020H
MAIN:
MOV SCON,#00H ;串行口工作于方式0(同
步移位方式)
85
MOV 33H,#00H
MOV 34H,#00H ;显示个,十位初值
SETB EA ;开总中断
SETB EX0 ;开外中断0允许
SETB IT0 ;设为下降沿触发
DISPLAY:
MOV A,33H
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
MOV A,34H
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI ;显示个,十位
MOV 35H,#0FFH
D6: MOV 36H,#0FFH
D5: DJNZ 36H,D5
DJNZ 35H,D6 ;延时
AJMP DISPLAY ;循环
INT:
PUSH ACC
JB P3.2,RE
MOV 30H,#0FFH
D4: MOV 31H,#0FFH
86
D3: DJNZ 31H,D3
DJNZ 30H,D4
JB P3.2,RE ;断键抖动
;是按键了,个位加一,加到10后,十位加一,加到99,回
到00
INC 33H
MOV A,33H
CJNE A,#0FH,RE
MOV 33H,#00H
INC 34H
MOV A,34H
CJNE A,#0FH,RE
MOV 34H,#00H
;/////////////////////////////////////////////
RE:
POP ACC
RETI
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
11.2 PWM码简介及解码原理
PWM 码是一种脉宽调制码,它的组成为9MS 高电
平和4MS 低电平引导脉冲,16 位系统识别码,8 位数据
正码和8 位数据反码。我们要解的就数据码。一个PWM
码的0是由一个0.58ms的低电平和一个0.58ms的高电平
87
组成,1 是由一个0.58ms 的低电平地和一个1.58ms 的高
电平组成。解码原理是这样的。首先通过延时来丢开引导
码,然后通过解码丢掉16 位系统识别码,最后解系统正
码和反码。解开后将正码取反看是否与反码相同,如果相
同,即解开保存其值。解码0 或1是这样的。在低电平的
时候等待,直到为高了后,用一个0.882ms 的延时去量,
量完后,如果为低了,证明前面是一个0.58ms 低电平和一
个0.58ms 高电平地组成,即保存一个0.如果为高,则证

⌨️ 快捷键说明

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