单片机程序Word格式.docx
《单片机程序Word格式.docx》由会员分享,可在线阅读,更多相关《单片机程序Word格式.docx(35页珍藏版)》请在冰豆网上搜索。
CLRC;
进位位清零,为接受P1口的值做准备
MOVP1.0,#00H;
赋值,全灭
MOVC,P1.0;
P1.0口值送进位位
MOVP1.2,C;
进位位C送值到P1.2口,输出
ACALLDELAY
重复上面操作
MOVP1.1,#00H
MOVC,P1.1
MOVP1.3,C
MOVR6,#1;
延时子程序.
MOVR7,#1
实验二外部中断
LEDEQUP1.0;
P1.0口连接LED显示灯
LEDBUFEQU00H;
初始值设为0,即为低电平
LJMPSTART
ORG0003H;
外部中断0(INT0)的入口地址
LJMPINT0;
跳转到中断入口处
ORG0100H
START:
MOVSP,#60H;
地址指针
CLRLEDBUF
CLRLED
MOVTCON,#01H;
初始化,设置为工作方式1
MOVIE,#10000001B;
EA=1开中断,EX0=1外部中断0中断允许
ORLIP,#0000H;
中断优先级设置
LJMP$
INT0:
PUSHPSW;
程序状态字PSW内容压入堆栈保存
CPLLEDBUF;
取反,即发生翻转
MOVC,LEDBUF
MOVLED,C
POPPSW;
恢复程序状态字PSW的内容
RETI
END
实验三八段数码管显示
LEDMAP:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
DB00H,49H
MOV40H,#08H
MOV41H,#00H
MOV42H,#08H
MOV43H,#01H
MOV44H,#00H
MOV45H,#04H
LOOP1:
MOVR0,#40H;
送数据地址,即显示缓冲区地址
MOVR1,#6;
循环次数
MOVR2,#00100000B;
从左边第一个开始显示
LOOP2:
MOVDPTR,#8002H;
送位口地址
CLRA
MOVX@DPTR,A;
关所有位
MOVA,@R0;
取显示数据
MOVDPTR,#LEDMAP;
送段码表首地址
MOVCA,@A+DPTR;
由序码找段码
MOVDPTR,#8004H;
送段口地址
送段码
MOVDPTR,#8002H;
MOVA,R2;
显示位
显示
取显示位
RRA;
右移,下一位显示
MOVR2,A
INCR0;
数据地址加1,准备取下一个数
DJNZR1,LOOP2;
(R1-1)≠0,即6位未显示完,循环
JMPLOOP1
MOVR6,#2;
延时1ms
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
实验四行列扫描式键盘
OUTBITEQU8002H;
位显示地址和列
OUTSEGEQU8004H;
段显示地址
INEQU8001H;
键盘行地址
LEDBUFEQU40H;
显示缓冲区地址
RKEYEQU46H;
键值存储区
LJMPMAIN
DB3FH,06H,5BH,4FH,66H;
0~4
DB6DH,7DH,07H,7FH,6FH;
5~9
DB77H,7CH,39H,5EH,79H,71H;
A~F
DB00H,49H;
关断和“三”
延时子程序
***************************************
MOVR7,#0FAH
DL0:
DJNZR7,DL0;
执行时间大约1ms
DJNZR6,DELAY
LED显示子程序
****************************************
DISPLAY:
MOVR0,#LEDBUF
循环六次
MOVR2,#20H;
从高位开始点亮
MOVDPTR,#OUTBIT;
送位地址
MOVA,#00H
MOVX@DPTR,A;
关断所有数码管
MOVCA,@A+DPTR;
由序码求段码
MOVDPTR,#OUTSEG;
MOVX@DPTR,A
MOVA,R2
位显示
MOVR6,#03H
LCALLDELAY;
调用子程序
右移
MOVR2,A
数据地址加1,准备显示下一位
DJNZR1,LOOP;
键盘子程序
*****************************************
KEY:
LCALLTESTKEY
JZKEYQ;
没有按下,跳转退出
MOVR6,#10
防抖延时10ms
LCALLTESTKEY;
再次确认
JZKEYQ
LCALLGETKEY;
取键值
等待按键释放
WAITREL:
防抖延时
JNZWAITREL;
没有松开继续循环
KEYQ:
按键测试子程序,判断有无键按下
TESTKEY:
MOVDPTR,#OUTBIT;
送列地址
MOVA,#0H
对列置零
MOVDPTR,#IN;
送行地址
MOVXA,@DPTR
CPLA
ANLA,#0FH;
对行进行判断
获取键值子程序
从第五列开始判断
GETKEY:
MOVA,#11011111B
第5列置零
K58:
CJNEA,#08H,K54
MOVRKEY,#07H;
7键按下,送键值存储区
LJMPGETKQ
K54:
CJNEA,#04H,K52
MOVRKEY,#04H;
4键按下,送键值存储区
K52:
CJNEA,#02H,K51
MOVRKEY,#01H;
1键按下,送键值存储区
K51:
CJNEA,#01H,K48
MOVRKEY,#00H;
0键按下,送键值存储区
************************************************
进入第四列判断
K48:
MOVA,#11101111B
第4列置零
送行地址
CJNEA,#08H,K44
MOVRKEY,#08H;
8键按下,送键值存储区
K44:
CJNEA,#04H,K42
MOVRKEY,#05H;
5键按下,送键值存储区
K42:
CJNEA,#02H,K41
MOVRKEY,#02H;
2键按下,送键值存储区
K41:
CJNEA,#01H,K38
MOVRKEY,#0FH;
F键按下,送键值存储区
***********************************************
进入第三列判断
K38:
MOVA,#11110111B
第3列置零
对行进行判断
CJNEA,#08H,K34
MOVRKEY,#09H;
9键按下,送键值存储区
K34:
CJNEA,#04H,K32
MOVRKEY,#06H;
6键按下,送键值存储区
K32:
CJNEA,#02H,K31
MOVRKEY,#03H;
3键按下,送键值存储区
K31:
CJNEA,#01H,K28
MOVRKEY,#0EH;
E键按下,送键值存储区
**********************************************
进入第二列判断
K28:
MOVA,#11111011B
第2列置零
CJNEA,#08H,K24
MOVRKEY,#0AH;
A键按下,送键值存储区
K24:
CJNEA,#04H,K22
MOVRKEY,#0BH;
B键按下,送键值存储区
K22:
CJNEA,#02H,K21
MOVRKEY,#0CH;
C键按下,送键值存储区
K21:
CJNEA,#01H,K18
MOVRKEY,#0DH;
D键按下,送键值存储区
*********************************************
进入第一列判断
K18:
MOVA,#11111101B
第1列置零
CJNEA,#08H,K14
MOVRKEY,#10H;
10键按下,送键值存储区
K14:
CJNEA,#04H,K12
MOVRKEY,#11H;
11键按下,送键值存储区
K12:
CJNEA,#02H,K11
MOVRKEY,#12H;
12键按下,送键值存储区
K11:
CJNEA,#01H,K08
MOVRKEY,#13H;
13键按下,送键值存储区
********************************************
进入最后一列判断
K08:
MOVA,#11111110B
第0列置零
K04:
CJNEA,#04H,K02
MOVRKEY,#14H;
14键按下,送键值存储区
K02:
CJNEA,#02H,K01
MOVRKEY,#15H;
15键按下,送键值存储区
K01:
CJNEA,#01H,K00
MOVRKEY,#16H;
16键按下,送键值存储区
K00:
MOVRKEY,#0EEH
SJMPGETKQ
GETKQ:
主程序
************************************
MAIN:
MOVSP,#60H
MOVLEDBUF,#0DH
MOVLEDBUF+1,#00H
MOVLEDBUF+2,#08H
MOVLEDBUF+3,#01H
MOVRKEY,#0DAH
MLOOP:
LCALLDISPLAY
LCALLKEY
MOVA,RKEY
ANLA,#0F0H
SWAPA
MOVLEDBUF+4,A;
显示高位
ANLA,#0FH
MOVLEDBUF+5,A;
显示低位
LJMPMLOOP
实验五计数器
MOV40H,#00H;
千
MOV41H,#00H;
百
MOV42H,#00H;
十
MOV43H,#00H;
个
MOV44H,#02H
MOV45H,#02H
MOVTMOD,#05H;
初始化,工作方式设置
MOVTL0,#00H;
初值设为0,低4位
MOVTH0,#00H;
初值设为0,高4位
SETBTR0;
TR0=1,启动计数器
MOVR3,TL0;
低位送到R3
MOVA,R3
低八位低4位个
MOV40H,A
SWAPA;
高低位交换
MOV41H,A;
低八位高4位十
MOVR3,TH0;
高位送到R3
高八位低4位百
MOV42H,A
高八位高4位千
MOV43H,A
MOVR0,#40H;
数据缓冲区地址
MOVR1,#6;
最高位开始显示
去显示数据
MOVDPTR,#8004H;
MOVA,R2
MOVR6,#3;
实验六定时器
ORG000BH;
定时器T0溢出中断入口地址
LJMPSINT0
MOVTMOD,#01H;
设置定时器T0工作在方式1
MOVTH0,#3CH;
置初值,高8位送TH0
MOVTL0,#0B0H;
置初值,低8位送TL0
SETBET0;
ET0置1,定时器T0溢出中断允许
SETBEA;
EA置1,开中断
MOVR7,#10;
开始计时
SETBP1.0;
P1.0置1,即输出高电平
CJNER7,#00H,LOOP1;
R70,继续循环
CPLA;
交换A值
MOVP1,A;
A值送P1口输出,即发生反转
SINT0:
DJNZR7,B1;
判断循环次数,跳转
CPLP1.0
JMPB2
B1:
重新装载时间常数
MOVTL0,#0B0H
B2:
RETI
实验七模拟量输入
;
AD_CS----CS1
CS0832EQU09000H
OUTBITEQU0A002H;
位显示地址
OUTSEGEQU0A004H;
CS0809EQU8000H
RADINGEQU31H;
I0~I7通道号寄存器
RADEQU32H;
AD值寄存器
DJNZR7,DL0
MOVR0,#LEDBUF;
循环次数
MOVR2,#20H;
从高位开始显示,即左边开始
段显示
送显示位
MOVR6,#03H
CALLDELAY;
右移,准备显示下一位
数据存储区加1,准备显示下一位
MOVLEDBUF,#08H
MOVLEDBUF+1,#01H
MOVLEDBUF+2,#00H
MOVLEDBUF+3,#04H
MOVLEDBUF+4,#00H
MOVLEDBUF+5,#00H
MOVR5,#0FFH;
数字量应00到0FFH
DIRLOP:
LCALLDISPLAY;
调用显示子程序
DJNZR5,DIRLOP;
(R5-1)≠0,跳转
ADLOOP:
MOVRADING,#01H;
置初值
LCALLAD;
调用AD转换子程序
LCALLADDIR;
调用读取和显示AD转换结果子程序
LJMPADLOOP;
AD:
MOVDPTR,#CS0809;
指向0通道
MOVA,DPL;
ADDA,RADING
MOVDPL,A
启动AD转换
MOVR5,#40H;
查询,是否转换结束
DJNZR5,$
MOVXA,@DPTR;
读取转换结果
MOVRAD,A;
送转换结果
ADDIR:
MOVA,RAD;
取转换结果
交换高低位
ANLA,#0FH;
低位清零
MOVLEDBUF+4,A;
MOVLEDBUF+5,A;
显