历史上的今天
今天是:2024年09月08日(星期日)
2020年09月08日 | 单片机双机串口通信原理图
2020-09-08 来源:51hei

主机程序:
#include unsigned char i=1; unsigned char ACK=1; void delay() //延时函数 { unsigned char i,j; for(i=255;i>0;i--) for(j=100;j>0;j--){} } unsigned char kbscan() //键盘扫描函数 { unsigned char sccode,recode; //定义行、列 P1=0xf0; //高四位作为输入先写1 if((P1&0xf0)!=0xf0) //判断是否按键按下 { delay(); //延时消抖 if((P1&0xf0)!=0xf0) //再次判断判断有没有按键按下 { sccode=0xfe; while((sccode&0x10)!=0) { P1=sccode; if((P1&0xf0)!=0xf0) //判断当前行是否有按键按下 { recode=P1&0xf0; //保留高四位输入值 sccode=sccode&0x0f; //保留第低四位的值 return(recode+sccode); } else sccode=(sccode<<1)|0x01; } } } return 0; } send()interrupt 4 //串行口通信中断 { if(TI==1&&ACK==1) { TI=0; if(i==0||i==0x22||i==0x44||i==0x66||i==0x88||i==0xaa||i==0xcc||i==0xdd||i==0xee) //有按键按下,需要修改波特率 { ACK=0; SBUF=i; //发送数据 } else if(i==11) //循环发送,发了十一个字符后重新发 { i=1; SBUF=1; } else { i++; SBUF=i; //发送数据 } } else if(RI==1) //接收回应的信号 { RI=0; ACK=SBUF; //接收回应信号 修改初值 触发串口通信中断 TI=1; TH1=TL1=i; i=1; } } void main() { TMOD=0x20; TH1=0x00;TL1=0x00; //置初值 TR1=1;EA=1;ES=1; //使T1开始工作;开总中断、串行中断 SCON=0x50; //使T1工作在工作方式1 SBUF=i; while(1) { while(kbscan()) { switch(kbscan()) //不同的按键对应不同的波特率 { case 0xeb:i=0x00;break; case 0xdb:i=0x22;break; case 0xbb:i=0x44;break; case 0xed:i=0x66;break; case 0xdd:i=0x88;break; case 0xbd:i=0xaa;break; case 0xee:i=0xcc;break; case 0xde:i=0xdd;break; case 0xbe:i=0xee;break; } } } } 复制代码 丛机程序: #include #define LCD_DATA P0 sbit LCD_BUSY=LCD_DATA^7; sbit LCD_RW=P3^3; sbit LCD_RS=P3^2; sbit LCD_EN=P3^4; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; sbit P24=P2^4; sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7; sbit P30=P3^0; sbit P31=P3^1; sbit P32=P3^2; sbit P33=P3^3; sbit P34=P3^4; sbit P35=P3^5; sbit P36=P3^6; sbit P37=P3^7; unsigned char i=0; void LCD_check_busy(void) //检测LCD状态 { while(1) { LCD_RS=0; LCD_RW=1; LCD_EN=0; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; LCD_EN=0; } } void LCD_cls(void) //LCD清屏 { LCD_check_busy(); LCD_EN=0; LCD_RS=0; LCD_RW=0; LCD_DATA=0x01; LCD_EN=1; LCD_EN=0; } void LCD_write_instruction(unsigned char LCD_instruction)//写指令到LCD { LCD_check_busy(); LCD_EN=0; LCD_RS=0; LCD_RW=0; LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0; } void LCD_write_data(unsigned char LCD_data)//输出一个字节数据到LCD { LCD_check_busy(); LCD_EN=0; LCD_RS=1; LCD_RW=0; LCD_DATA=LCD_data; LCD_EN=1; LCD_EN=0; } void LCD_initial() { LCD_write_instruction(0x38); //两行显示 LCD_write_instruction(0x0C); //显示开 LCD_write_instruction(0x06); //光标加1 LCD_write_instruction(0x01); //清屏 } re() interrupt 4 //串行口通信中断 { if(RI==1) { RI=0; i=SBUF; // 接收数据 if(i==0||i==0x22||i==0x44||i==0x66||i==0x88||i==0xaa||i==0xcc||i==0xdd||i==0xee) { SBUF=1; //接收发过来 要修改的初值 } else //接收正常通信的数据 { LCD_write_instruction(0x80+i); LCD_write_data('0'+i); if(i==11)LCD_initial(); } } else if(TI==1) { TI=0; TH1=i;TL1=i; //发送确认信号后 修改初值 } } void main() { TMOD=0x20; TH1=0x00;TL1=0x00; //置初值 TR1=1;EA=1;ES=1; //使T1开始工作;开总中断、串行中断 SCON=0x50; //使T1工作在工作方式1
史海拾趣
|
5月的社区明星火热出炉~~~~:D 本月优秀工程师(依据发帖数排名): 最佳风度奖:quanzx 最佳主人奖:wangjiafu1985 最具奉献奖: richiefang 本月博客之星:chbaaic 优秀版主:gaoxiao 请当选的朋友发表感言,并将联系方式(姓 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 LCD显示好帮手 基于.net的应用程序,请安装.net库方能正常使用 支持各种能输入的文字和符号,转换为点阵。支持颜色转换成相应代码。 … 查看全部问答> |
|
以下是在基于ATmega16写的程序,行是B口的低4位,列是B口的高4位。 程序功能:读取键值,然后通过数码管显示键值。 程序看过很多遍了,没有问题,但就是不能正确的显示健值(12,13,14,15键值能正常显示,其它的键值在数码管的十位会显示0,个 ...… 查看全部问答> |
|
最近在搞三星6410开发板,将6410的bsp中bootloader/eboot/文件夹下的usb.C文件中加入加入键盘的报告描述符,并加入散转的代码case report_descriptor...........,并修改idproduct=ox0001,idvender=ox8888;然后编写返回代码。 用vs2005构建系统, ...… 查看全部问答> |
|
大家有对ARM开发很熟悉的么,我是通信专业的,毕业设计做这东西,对人脸识别算法了解点,对这个MFC编程完全白痴,希望有牛人可以交流下啊~我邮箱zhangtengxss@163.com 希望大家联系我啊… 查看全部问答> |
|
我表哥有个小厂专门做遥控器之类的,由于不能自己开发芯片,多数要高价外出购买,所以我想能不能自己学学这方面的知识,或许可以帮他一些忙。 我现在在搞C#,不知道要达成能自己开发这些芯片需要学习些什么?请大家不吝赐教啊! 分数可以再加,分 ...… 查看全部问答> |
|
我以前用ucosii在s3c44b0上面做的程序,一直运行正常。很来又做了一个不带ucosii的支持外部中断2的程序,使用ISR,工作也正常,但将这个程序写到原 先带ucosII的程序上后,就每次开机就死机。不知道为什么。 我原先不带外部中断2的程序的初始化代 ...… 查看全部问答> |
|
我用的是EK-LM3S811开发板,在移植uCOS的过程中,测试了两个管脚,分别是PB1和PC5(没有复用JTAG管脚),下载调试几次都是可以的,但突然就提示“Could not initialize target device! Please power cycle the board and try again”的典型锁死提示 ...… 查看全部问答> |




