历史上的今天
今天是:2024年12月06日(星期五)
2019年12月06日 | 51单片机串口通信程序,支持自定义协议
2019-12-06 来源:51hei
单片机源程序如下:
#include"reg52.h" /*51串口通信by沸腾的冰块/不拼不活*/
typedef unsigned int u16;
typedef unsigned char u8;
#define Data_SIZE 7 //存入数组RevBuf数据长度==uart_Data_SIZE-2
#define uart_Data_SIZE 5//协议实际长度(一个汉字占两位)
u8 RevBuf[Data_SIZE]; //数据接收缓冲区
u8 indata[uart_Data_SIZE]; //防数据抵消缓冲区
u16 data_count=0; //数据长度,串口中断自增
u16 temp_length=0; //数据长度,协议长度中转
u8 flished_flag=0; //数据接收符合要求标志
u8 uart_flished_flag=0; //串口成功标志
u8 i=0;//延时用
u16 temp=0,count=0;//temp缓存,count用于判断是否接受到数据
sbit LED1=P1^0;sbit k1=P2^0;
sbit LED2=P1^1;sbit k2=P2^1;
sbit LED3=P1^2;sbit k3=P2^2;
sbit LED4=P1^3;sbit k4=P2^3;
sbit LED5=P1^4;sbit k5=P2^4;
sbit LED6=P1^5;sbit k6=P2^5;
sbit LED7=P1^6;sbit k7=P2^6;
sbit LED8=P1^7;sbit k8=P2^7;
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFA;//在此修改波特率
TL1 = TH1;
PCON = 0x80;
EA = 1;
ES = 1;
TR1 = 1;
}
void delay(u16 i)
{
while(i--);
}
void keypros()//按键处理
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
LED1=~LED1;
}
while(!k1);
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
LED2=~LED2;
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
LED3=~LED3;
}
while(!k3);
}
if(k4==0)
{
delay(1000);
if(k4==0)
{
LED4=~LED4;
}
while(!k4);
}
if(k5==0)
{
delay(1000);
if(k5==0)
{
LED5=~LED5;
}
while(!k5);
}
if(k6==0)
{
delay(1000);
if(k6==0)
{
LED6=~LED6;
}
while(!k6);
}
if(k7==0)
{
delay(1000);
if(k7==0)
{
LED7=~LED7;
}
while(!k7);
}
if(k8==0)
{
delay(1000);
if(k8==0)
{
LED8=~LED8;
}
while(!k8);
}
}
void UartSendByte(unsigned char c)//发送一个字符
{
SBUF = c;
while(!TI);
TI = 0;
}
void UartSendString(u8 *string)//发送一个字符串
{
while(*string)
{
UartSendByte(*string++);
}
}
void main(void)
{
InitUART();
UartSendString("Uart_test is OK rn");
while(1)
{
keypros();
if(count count=data_count; if(temp!='n') //判断是否接收到结束符 { RevBuf[data_count-1]=temp;// 否,就存到RevBuf【】数组中 flished_flag=0;//未接收完 } else { temp_length=data_count;//是,记录其数据长度 data_count=count=0; flished_flag=1;//接收完 } } if(temp_length == Data_SIZE&&flished_flag==1) //判断数据长度是否满足要求,是否接收完。 { for(i=0;i indata[i]=RevBuf[i]; //缓冲区 } uart_flished_flag=1; //数据接收成功标志 flished_flag=0; } if(uart_flished_flag==1) //数据接收完整成功 { UartSendString("你发送的是rn"); for(i=0;i SBUF = indata[i]; while(!TI); TI=0; } UartSendString("rn"); uart_flished_flag=0; if(indata[1]=='n')//发送:on :1 switch(indata[4]) {
史海拾趣
|
设计要求,设计一个电子密码锁,在开锁的状态下输入密码,密码共四位,用数据开关k1~k10分别表示0~9,输入密码用数码管显示,最后输入的密码显示在最右边的数码管上,即每输入一位数,密码在数码管上的显示左移一位,可删除输入的数字,删除的是最 ...… 查看全部问答> |
|
Altera公司宣布其将与代理商联手合作在2010年8月至9月期间在中国大陆9个城市举办免费的技术研讨会。很好的机会,不容错过哦在研讨会上可以了解到Altera系列产品是在高端数字系统设计上的应用。还将展示Altera解决方案如何推动视频和图像处理设计实 ...… 查看全部问答> |
|
〖ST网站提供适用于STM32F105/107的USB和以太网函数库下载〗 STM3210C-EVAL评估版演示程序和使用手册。STM32_OTG_LIB —— STM32F105xx和STM32F107xx USB OTG函数库,使用手册STM32_ETH_Lib —— STM32F107xx互联型产品线以太网底层驱动,和基于uIP TCP/IP协议栈的网 ...… 查看全部问答> |
|
谈谈我对DSP的了解和学习 可能大家认为这题目怎么不一样?呵呵只是为了让大家更仔细认真的看完我发的帖子,大家提出你的想法,一起讨论。 首先:要感谢TI公司 ...… 查看全部问答> |
|
最近拿到一个数据采集器项目的文件,打开里面全是.S43文件,而且是用汇编语言,和我一直用的.C文件有什么不同?而且.S43文件在output里,实在是不懂。。。看图片。。。 另外,最近在针对一个上位机和下位机通讯的协议编程,我觉得很难啊,协议的各 ...… 查看全部问答> |
|
液晶面板反垄断,中国对三星等6家外企开出3.53亿元人民币罚单 本帖最后由 jameswangsynnex 于 2015-3-3 20:04 编辑 中国对境外企业价格垄断开出首张罚单——韩国三星、LG,中国台湾地区奇美、友达等六家国际大型面板生产商,因垄断液晶面板价格,遭到国家发改委经济制裁3.53亿元人民币。这也是迄今为止中国开 ...… 查看全部问答> |




