3328|0

399

帖子

0

TA的资源

裸片初长成(初级)

楼主
 

单片机的通信??这是怎么回事 [复制链接]

这是程序 RS EQU P2.0 RW EQU P2.1 EN EQU P2.2 LCD_X EQU 2FH PLAYFLAG BIT 20H.0 ;********************************************************* ORG 0000H LJMP MAIN ORG 0023H LJMP T_SERIL ORG 0030H ;********************************************************* ; 主程序 ;********************************************************* MAIN: MOV SP,#60H MOV P0,#0FFH MOV P2,#0FFH MOV TEMP,#00H MOV TEMP1,#00H CLR PLAYFLAG MOV R1,#DISBUF ;清显存单元 CLR1: MOV @R1,#20H INC R1 CJNE R1,#50H,CLR1 CALL SET_LCD ;LCD1602初始显示 MOV TMOD,#20H ;定时器1工作于8位自动重载模式,用于产生波特率 MOV TH1,#0FDH MOV TL1,#0FDH ;波特率9600 MOV SCON,#50H ;设定串行口工作方式 ANL PCON,#00H ;波特率不倍增 SETB EA ;允许总中断 SETB ES ;允许串行中断 SETB TR1 ;启动定时器1 MOV LCD_X,#00H MOV R1,#DISBUF MAIN1: CALL PLAY JMP MAIN1 ;********************************************************* ; LCD1602 初始化子程序 ;********************************************************* INIT_LCD: ;8位I/O控制 LCD 接口初始化 MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY5MS MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY5MS MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY5MS MOV A,#0CH ;开显示,关光标, CALL WCOM CALL DELAY5MS MOV A,#01H ;清除 LCD 显示屏 CALL WCOM CALL DELAY5MS RET ;********************************************************* ; LCD1602 显示字符程序 ; 在LCD的第一行或第二行显示信息字符 ;********************************************************* LCD_SHOW: CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 JMP FILL LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#0C0H ;设置 LCD 的第二行地址 CALL WCOM FILL: CLR A ;填入字符 MOVC A,@A+DPTR ;由消息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 RET LC1: CALL WDATA ;写入数据 INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET CLR_LINE: ;清除该行 LCD 的字符 MOV R0,#24 CL1: MOV A,#' ' CALL WDATA DJNZ R0,CL1 RET ;********************************************************* ; 写指令使能子程序 ; RS=L,RW=L,D0-D7=指令码,E=高脉冲 ;********************************************************* WCOM: MOV P0,A CLR RS CLR RW SETB EN CALL DELAY0 CLR EN RET ;********************************************************* ;写数据使能子程序 ;RS=H,RW=L,D0-D7=数据,E=高脉冲 ;********************************************************* WDATA: MOV P0,A SETB RS CLR RW SETB EN CALL DELAY0 CLR EN RET DELAY0: MOV R7,#250 ;延时500微秒 DJNZ R7,$ RET ;********************************************************* ;LCD第二行显示字符子程序 ;A=ASC DATA ;********************************************************* LCDP2: MOV TEMP1,A MOV A,LCD_X ;设置显示地址 ADD A,#0C0H ;设置LCD的第二行地址 CALL WCOM ;写入命令 MOV A,TEMP1 CALL WDATA ;写入数据 RET ;********************************************************* ; LCD 初始化设置 ;********************************************************* SET_LCD: CLR EN CALL INIT_LCD ;初始化 LCD CALL DELAY5MS MOV DPTR,#INFO1 ;指针指到显示信息1 MOV A,#1 ;显示在第一行 CALL LCD_SHOW SET_LCD2: MOV DPTR,#INFO2 ;指针指到显示信息2 MOV A,#2 ;显示在第二行 CALL LCD_SHOW RET INFO1: DB " SERIAL TRANFER ",0 ;LCD 第一行显示信息 INFO2: DB " ",0 ;LCD 第二行显示信息 ;********************************************************* ; 串口中断服务子程序 ;********************************************************* T_SERIL: PUSH ACC CLR ES ;关闭串行中断 CLR RI ;清除串行接受标志位 MOV A,SBUF ;从串口缓冲区取得数据 CJNE A,#0DH,T_LOOP ;0D-回车 JMP T_END T_LOOP: CJNE A,#0AH,T_LOOP1 ;0A-换行 JMP T_END T_LOOP1: MOV BUF,A CJNE A,#31H,T_LOOP2 MOV TEMP,#57H ;W CALL SENDDATA JMP T_LOOP8 T_LOOP2: CJNE A,#32H,T_LOOP3 MOV TEMP,#49H ;I CALL SENDDATA JMP T_LOOP8 T_LOOP3: CJNE A,#33H,T_LOOP4 MOV TEMP,#4CH ;L CALL SENDDATA JMP T_LOOP8 T_LOOP4: CJNE A,#34H,T_LOOP5 MOV TEMP,#4CH ;L CALL SENDDATA JMP T_LOOP8 T_LOOP5: CJNE A,#35H,T_LOOP6 MOV TEMP,#41H ;A CALL SENDDATA JMP T_LOOP8 T_LOOP6: CJNE A,#36H,T_LOOP7 MOV TEMP,#52H ;R CALL SENDDATA JMP T_LOOP8 T_LOOP7: MOV TEMP,A CALL SENDDATA T_LOOP8: SETB PLAYFLAG MOV @R1,BUF INC R1 CJNE R1,#50H,T_END MOV R1,#DISBUF T_END: SETB ES POP ACC RETI ;********************************************************* ; 串口发送数据子程序 ;********************************************************* SENDDATA: MOV A,TEMP MOV SBUF,A JNB TI,$ ; 等特数据传送 CLR TI ; 清除数据传送标志 RET ;********************************************************* ; 显示子程序 ;********************************************************* PLAY: JNB PLAYFLAG,PLAYEND ;判是否需要显示 CALL SET_LCD2 ;清LCD1602第二行 MOV R1,#DISBUF MOV LCD_X,#00H PLAY1: MOV A,@R1 ;显示接收的数据 CALL LCDP2 INC LCD_X INC R1 CJNE R1,#50H,PLAY1 MOV R1,#DISBUF ;清显存单元 CLR2: MOV @R1,#20H INC R1 CJNE R1,#50H,CLR2 CLR PLAYFLAG MOV R1,#DISBUF PLAYEND: RET ;********************************************************* ; 延时5MS子程序 ;********************************************************* DELAY5MS: MOV R6,#25 DL2: MOV R7,#100 DJNZ R7,$ DJNZ R6,DL2 RET ;********************************************************* END 接到什么就发回来什么。可是我发01,接收到的是BF BD 为什么会这样。
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表