做网站怎么切psd图,免费搭建永久网站,宣传片拍摄手法及技巧,大型门户网站开发案例本文为博主 日月同辉#xff0c;与我共生#xff0c;csdn原创首发。希望看完后能对你有所帮助#xff0c;不足之处请指正#xff01;一起交流学习#xff0c;共同进步#xff01; 发布人#xff1a;日月同辉,与我共生_单片机-CSDN博客 欢迎你为独创博主日月同… 本文为博主 日月同辉与我共生csdn原创首发。希望看完后能对你有所帮助不足之处请指正一起交流学习共同进步 发布人日月同辉,与我共生_单片机-CSDN博客 欢迎你为独创博主日月同辉与我共生点赞❤❤❤关注收藏评论☺。 系列专栏 CSDN-单片机串口通信学习系列 我的格言是“尽最大努力做最好的自己 要转载请提前告知 版权声明本文为CSDN博主「日月同辉与我共生」的原创文章CSDN独一份。 目录
一、系统设计要求
二、系统设计原理
三、硬件设计
四、软件设计
4.1串口初始化
4.2接收中断
4.3定时器初始化
4.4定时器中断
4.5主程序
4.6发送数据
4.7清除缓存
4.8uart.h
五、结果展示
一、系统设计要求
最开始单片机com1发送字符串Wait for Serial Communication Tset Start.和Please Send a string of data:给虚拟串口com3接着虚拟串口发送多个数据数据长度不定但限制在20以下给单片机com1com1接收后重新将数据发送回com3。
二、系统设计原理
com3每发1个数据单片机需要时间来接收这个时间一般不会超过5ms若超过5ms则说明接收数据的工作已经完成则将接收完成标志位recv_flag置1最后在主程序中处理接收的数据这里是重新发送给com3因此可以利用c51单片机内部的定时器0定时1ms定义计数变量recv_timer_cnt该变量超过5则说明接收完成每接收一个数据计数变量要清0。接收完成数据后软件定时器变量清0让定时器不再工作同时重新发送数据给com3并清除缓冲。
三、硬件设计
com1发送端TXD接com2发送端TXDcom1接收端RXD接com2接收端RXD。
虚拟终端RXD接TXD因为单片机发送数据给com3而虚拟终端可以理解为虚拟串口com3。 四、软件设计
4.1串口初始化
串口工作方式为方式1(8位异步通信)定时器采用定时器T1的工作方式28位自动重载波特率为9600bit/s晶振频率为11.0592Mhz。接收一帧数据的初始化采用中断法。
void UartInit(void) //9600bps11.0592MHz
{PCON 0x7F; //波特率不倍速SCON 0x50; //8位数据,可变波特率TMOD 0x0F; //设置定时器模式TMOD | 0x20; //设置定时器模式TL1 0xFD; //设置定时初始值TH1 0xFD; //设置定时重载值ET1 0; //禁止定时器中断ES1; //串口中断打开TR1 1; //定时器1开始计时
}
4.2接收中断
软件定时器标志位置1定时器工作开始定时--接收数据--每接收一帧数据就计数清0
void ES_timers() interrupt 4 //接收中断
{if(RI){ RI0; start_timer1;//1.开定时器标志位置1if(recv_cntMAX_REX_NUM) //在规定字符长度范围内接收数据 {recv_buf[recv_cnt]SBUF; //2.接收数据recv_cnt; }else{recv_cntMAX_REX_NUM;}recv_timer_cnt0; //3.每接收一帧数据就计数清0}
}
4.3定时器初始化
定时1ms
void Timer0_Init(void) //1毫秒11.0592MHz
{TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x66; //设置定时初始值TH0 0xFC; //设置定时初始值TF0 0; //清除TF0标志ET01;TR0 1; //定时器0开始计时
}4.4定时器中断
计数变量recv_timer_cnt超过5时说明接收完成计数变量recv_timer_cnt清0。
void T0_timer() interrupt 1
{TR00;if(start_timer 1){recv_timer_cnt;if(recv_timer_cntMAX_timer_cnt) //计数值超过规定范围说明接收完成{recv_timer_cnt0; recv_cnt0;recv_flag1;//接收完成标志位置1}}TL0 0x66; //设置定时初始值TH0 0xFC; //设置定时初始值TR01;
}4.5主程序
软件定时器变量清0(定时器不再工作)--接收完成标志位清0--发送数据--清除缓存
void main()
{UartInit(); //调用串口初始化函数Timer0_Init();EA1; //总中断允许printf(Wait for Serial Communication Tset Start.\r\n);printf(Please Send a string of data:\r\n);while(1){if(recv_flag){start_timer0;recv_flag0;//接收完成标志位清0sendString(recv_buf);//发送数据clr_recvbuffer(recv_buf);//清除缓冲函数}}
}4.6发送数据
void sendByte(unsigned char dat) //发送一帧数据功能函数
{SBUFdat;while(!TI);TI0;
}void sendString(unsigned char *dat)//发送字符串函数
{while(*dat ! \0){sendByte(*dat);}
}char putchar(char c)
{sendByte(c);return c;
}4.7清除缓存
unsigned char *bufrecv_buf则buf[i]0是将第i1个数据清0。
void clr_recvbuffer(unsigned char *buf)
{unsigned char i;for(i0;iMAX_REX_NUM;i){buf[i]0;}
}4.8uart.h
#ifndef __UART_H__
#define __UART_H__#include reg51.h
#include stdio.h#define MAX_REX_NUM 20 //规定最大长度
#define MAX_timer_cnt 5 //定时计数规定值超过该值说明接收完成extern unsigned char recv_buf[MAX_REX_NUM];//将数据存储到该数组中
extern unsigned char recv_cnt;
extern unsigned char start_timer;//软件定时器变量1说明定时器开始工作
extern unsigned char recv_timer_cnt;//软件定时器计数变量
extern unsigned char recv_flag;//接收完成标志位void UartInit(void);
void sendByte(unsigned char dat);
void sendString(unsigned char *dat);
char putchar(char c);
void clr_recvbuffer(unsigned char *buf);#endif
五、结果展示
最开始显示正确 为了测试能否接收到不同长度的数据做了2次实验。
第一次实验长度为81 2 abc b cc 6 7 8 第二次实验长度为41 2 abc 600 下一文将着重判断数据帧头来接收一串数据亲爱的读者敬请期待下一文更精彩
一日不读书胸臆无佳想。我叫不白吃喜欢我的可以支持我博主名叫日月同辉,与我共生
日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客日月同辉,与我共生擅长单片机基础,单片机串口通信,等方面的知识,日月同辉,与我共生关注stm32,c语言,51单片机,proteus,单片机领域.https://blog.csdn.net/LIN___IT?spm1000.2115.3001.5343