欢迎来到天天文库
浏览记录
ID:37716630
大小:18.56 KB
页数:4页
时间:2019-05-29
《单片机接收电脑四个字节,并判断返回一个确认值,+两个按键发送给电脑四个字节》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、/*本程序设计为主程序内循环检测中断标示位TI,如果有接收中断就进入计数式接收,每接收到一位,接收储存在数据shuju[i]里的0到32并将接收到的字节反回发送给电脑,菜母鲎纸冢琲就计数加一,并且每次都判断一次C够了四位,就再次判断第一位是否为0X05,如果是置P0口为0x00,并发送0x00这个字符到电脑,电脑通过串口助手接收后显示,如果接收的第一位不是0x05,就只发送每次接收的字节,P0口不改变,不发送识别用电脑的串口助手发送任意四个16进制数字字符,单片机就可以接收并识别,如果只发送3个以下,单片机接收并发回
2、接收到的3个字符,但不作处理,按K1、K2健,单片机会发送4个预定的字符,但第一位强行改成了0x01/0x02,第二、三位是预定的数字加自己的第几个位数的数字,第四位是第2+3位的和,K1只取了和,没有求模,但它如果大于256应该会自己益出,就是自己减去256从新开始显示,K2是直接加入了第2+3位数据的和的求模就是直接除以256只要于数,这个作用相当于数据校验让接收方可以根据同样的方法校验一下接收过来的数据是否正确,*/#include#includeunsignedcharj,
3、k;unsignedcharshuju[4]={0,0,0,0};//待发送的数据unsignedchardaifa[4]={0,0,0,0};//待发送的数据unsignedcharm,i,tmp;//m、i为收发数据的位数,tmp为接收数据的时间限制等待时间数sbitK1=P1^0;//定义按键1sbitK2=P1^1;//定义按键2sbitK3=P3^3;//定义按键2voiddelay(unsignedinta)//延时,省略了一个定时器,定时器用tmp来代替了{while(--a);}voidsend_char
4、(unsignedchartxd)//传送一个字符的调用子程序{SBUF=txd;//传送一个字符while(!TI);//等特数据传送TI=0;//清除数据传送标志}main()//传送一个字符主程序{REN=1;//定时器1工作于8位自动重载模式,用于产生波特率SM0=0;//波特率9600SM1=1;TMOD=0x20;//设定串行口工作方式TH1=0xFD;//波特率不倍增TL1=0xFD;//启动定时器1TR1=1;EA=1;ES=1;P0=0xff;while(1){if(RI)//是否有中断,有就开始准备好
5、收数据了{RI=0;//先把串口接收中断标志清0复位,好让它接收下一个字节m++;//要接收的个数,接收一位,就加一tmp=0;//等待接收时间清0shuju[m]=SBUF;//暂存接收到的数据send_char(shuju[m]);//回传接收到的数据iif(m==4)//判断是否接收够了四个字节,如果够了四个字节,进入{m=0;//如果够了四个字节,m的任务完成,就可以清0if(shuju[1]==0x05)//然后判断第一个字节是否为0X05{m=0;//所以就把m清0P0=0x00;//如果是0X05,Po口显
6、示0x00,点亮8个LEDsend_char(P0);//同时,通过串口把Po状态0x00发送到电脑,这个相当于}//给电脑发了一个反馈信号,告诉电脑收到了正常的数据包else{//判断如果第一个字节不是0X05就执行P0=0xff;//Po口关闭led,不给电脑上传数据}}}if(m)//m说明前面只要有一次发生接收中断,就开始进入tmp计数,没有就不进入可以节省{//cpu的负担,不用时刻都在让tmp计数,tmp++;//执行完上面的循环接收时,不管接收到几个,tmp都做为计数器功能,加一if(tmp==10)//经
7、测试正常接收四个字节,tmp会加到4,{m=0;//所以不管接收了几个,等tmp加到了10,不管接收几位,就把m和tpm强行tmp=0;//给清0.目的是防止接收3个以下数量的字节,少于4个都是错包强行丢弃}//下次再有数据中断时,重新开始接收四个字节}//发送方也必需从新发送四个完整字节,否则一律丢弃////////////if(K1==0)//如果有健按下{delay(5000);//延时一下if(K1==0)//确实有按键按下{while(!K1);//等待忪手j=2;//设定一个将要发送的第一个起始数据为2for
8、(i=0;i<4;i++)//循环发送四个字节,i自动加一,{daifa[i]=j;//待发的数据等于数据位数i默认从0开始if(i==0)//确认如果是第一个将要发送的字节{daifa[i]=0x01;//把第一个字节强行改成0x01,用第一位当作数据包识别位}if(i==3)//确认如果是第四个字节,强行把它用第
此文档下载收益归作者所有