📄 51+Ҧ
字号:
/***************************************************************************
标题: 串口调试程序,中断法接收数据
效果: 运行本例子,打开本例子文件夹中的上位机软件,设置波特率2400,再进行发送数据,数码管显示接收内容
本店网站 http://xxdpj.taobao.com/
以芯换心 竭诚为您服务 您学习单片机的好帮手
近期本店有很多优惠活动 有空就进来看看吧
http://xxdpj.taobao.com/
技术支持QQ:412150384
******************************************************************************/
;脚功能定义
KEY1 EQU P3.7 ;定义按键1
KEY2 EQU P3.6 ;定义按键2
KEY3 EQU P3.5 ;定义按键3
KEY4 EQU P3.4 ;定义按键4
KEY5 EQU P3.3 ;定义按键5
KEY6 EQU P3.2 ;定义按键5
SMG_q EQU P1.0 ;定义数码管阳级控制脚,千位
SMG_b EQU P1.1 ;定义数码管阳级控制脚,百位
SMG_s EQU P1.2 ;定义数码管阳级控制脚,十位
SMG_g EQU P1.3 ;定义数码管阳级控制脚,个位
;定义数据RAM空间
LDB EQU 30H ;定义一个变量存放显示值
OLDKEY EQU 31H ;保存按键接口状态
;数据存放
ORG 0100
TABLE: DB 0C0h,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;表:共阳数码管 0-9 A-F
ORG 0000H
LJMP MAIN
ORG 0023H ;串口中断
LJMP COM
ORG 0100H
MAIN: MOV TMOD,#20H ;设置定时器1为模式2,做为波特率发生器
MOV TL1,#0F3H ;2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
MOV TH1,#0F3H ;
SETB TR1 ;启动波特率发生
MOV SCON,#50H ;串口的工作方式,设置为方式2
SETB ES ;打开串口中断
SETB EA ;打开总中断
MOV LDB,#0 ;变量复值0
M0: LCALL READKEY ;
JZ M10
DEC A ;
JNZ M1 ;按下1键
INC LDB ;显示数据加1处理
SJMP M10 ;处理后转入显示
M1: DEC A ;处理按键2按下,与上类同
JNZ M2
DEC LDB ;减1处理
SJMP M10
M2: DEC A ;处理键3按下
JNZ M3
MOV A,LDB ;将变量加16处理,十六进制数
ADD A,#16
MOV LDB,A
SJMP M10
M3: DEC A ;按键4按下
JNZ M4
MOV A,LDB ;将变量减16处理
SUBB A,#16
MOV LDB,A
SJMP M10
M4: DEC A ;按键5按下
JNZ M5
MOV LDB,A ;将变量清0
SJMP M10
M5: DEC A ;按键6按下,发送数据到串口
JNZ M10
MOV A,LDB
MOV SBUF,A
JNB TI,$ ;等待发关完成
CLR TI ;
M10: MOV A,LDB ;用A做参数传递到显示子程序进行显示
LCALL DISPLAY ;调用显示子程序
LJMP M0 ;循环扫描按键
;串口中断,串口中断其实很简单,设置正确通讯的波特率,中断一来接收数据即可
COM: JNB RI,CR ;判断是接收中断处理
CLR RI ;允许接收下一字节,等待下一次中断
MOV A,SBUF ;将当前接收的数据存入变量空间
MOV LDB,A
CR: RETI
;读键值---------------------------------------------
READKEY:
MOV A,P3 ;
ANL A,#0XFC ;
CJNE A,OLDKEY,K01;
CLR A ;
SJMP K10 ;
K01: MOV R7,#10 ;延时约10MS,消抖动
CALL DELAYM ;
MOV A,P3 ;
ANL A,#0XFC ;
CJNE A,#0XFC,K02 ;
SJMP K09 ;
K02: MOV OLDKEY,A ;
JB KEY1,K1 ;
MOV A,#1 ;
SJMP K10 ;
K1: JB KEY2,K2 ;
MOV A,#2 ;
SJMP K10 ;
K2: JB KEY3,K3 ;
MOV A,#3 ;
SJMP K10 ;
K3: JB KEY4,K4 ;
MOV A,#4 ;
SJMP K10 ;
K4: JB KEY5,K5 ;
MOV A,#5 ;
SJMP K10 ;
K5: JB KEY6,K10 ;
MOV A,#6 ;
SJMP K10 ;
K09: CLR A ;
MOV OLDKEY,#0XFC;
K10: RET;
;延时子程序,可由R7控制时间量--------------------------
DELAYM: MOV R6,#200
DJNZ R6,$
DJNZ R7,DELAYM
RET
;数码管显示子程序-------------------------------------
DISPLAY:MOV DPTR,#TABLE
MOV B,#16
DIV AB
CLR SMG_s ;选择十位数码管
MOVC A,@A+DPTR ;查表输出定义好的数码管段值到P0口,显示相应的内容
MOV P0,A
LCALL DELAY ;延时,停留一会,让人眼感触到它的亮度
MOV P0,#0FFH ;清除数码管显示,因是共阳型,所以不是0
SETB SMG_s ;关闭十位数码管
CLR SMG_g ;选择个位数码管
MOV A,B ;个位显示
MOVC A,@A+DPTR ;查表输出定义好的数码管段值到P0口,显示相应的内容
MOV P0,A
LCALL DELAY ;延时,停留一会
MOV P0,#0FFH ;清除数码管显示
SETB SMG_g ;关闭个位数码管
RET
;短延时子程序,-----------------------------------------
DELAY: MOV R7,#10 ;延时子程序
DJNZ R7,$
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -