51单片机串口通信程序,支持自定义协议

发布者:泥匠手最新更新时间:2019-12-06 来源: 51hei关键字:51单片机  串口通信  自定义协议 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#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])

                                {

[1] [2]
关键字:51单片机  串口通信  自定义协议 引用地址:51单片机串口通信程序,支持自定义协议

上一篇:2864串口接线方式与实例程序
下一篇:51单片机旋转led(POV-LED)显示系统设计报告与代码

推荐阅读最新更新时间:2024-11-22 12:51

基于51单片机的报警器设计原理与分析
1.实验任务   用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。 2.电路原理图               图4.6.1 3.系统板上硬件连线 (1).把“ 单片机 系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2).在“音频放大模块”区域中的SPK OUT端口上接上一个8欧的或者是16欧的喇叭; (3).把“单片机系统”区域中的P1.7/RD端口用导线连接到“四路拨动开关”区域中的K1端口上; 4.程序设计内容 (1
[单片机]
基于<font color='red'>51单片机</font>的报警器设计原理与分析
自制51单片机超大数码管时钟
市面上出售的数码管一般都很小,本人用led发光管自己制作了一种个头很非常大的数码管,挂在家里显示效果非常牛逼下面是实物图: 下面是电路图: 下面是c51程序源代码: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define pos P0 //设置数码显示的位选 #define segs P1 //设置数码显示的段选 code unsigned char d = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0
[单片机]
自制<font color='red'>51单片机</font>超大数码管时钟
Linux下ARM 和单片机的串口通信设计
0 引言 数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。 1 硬件连接 s3c2440 是 三星 公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与8051
[单片机]
【嵌入式开发】STM8S103F3P6单线半双工串口通信
最近突然接手一个项目,很基础的一些单片机操作就可以完成,唯一值得说道的就是受限于任务要求,需要采用单线通信方式。拿到这个要求的时候有点懵,之前倒是从来没有用过单线的串口通信。 首先翻了下StrongerHuang的例程,没有,看来还是只能自己来了,在这也对StrongerHuang表示感谢,找到datasheet,这里直接可以看到STM8支持单线半双工,还有别的方法,后面再说。   既然有这样的功能,那么再找找Reference manual看,所有的信息如下:   可以看到讲得很简单,主要就是控制寄存器的配置和引脚的设置。按照这个搞了一天都没有弄出来。问题主要出在哪呢(直接马后炮)?   引脚使用。上面提到了单线半
[单片机]
简易数字存储示波器的设计
摘要:随着电子通信以及教学事业的发展,示波器的应用越来越广泛,它在教学中所起到的作用越来越重要,示波器可以测量信号的幅度,频率以及波形等等,但是高精度的示波器非常昂贵,对于非盈利事业的教学组织来说无疑不合适,所以提出了一种以单片机为控制核心的简易示波器设计方案。它由前向控制部分,数据采集和存储部分,51单片机控制部分以及按键和MS12864R显示部分组成。 传统意义上的模拟示波器虽然功能较全,但是价格昂贵,体积大、重量重、成本高、等一系列问题使应用受到了限制。对于大多数学生以及教学组织来说,利用示波器主要是进行一些理论性的测试与实验,高精度高成本示波器的作用不是很必要,为此,笔者提出了一种便携式数字存储示波器的设计,它采用了L
[单片机]
简易数字存储示波器的设计
C51单片机定时器介绍
简介 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。 标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。 时钟周期与机器周期 定时器的本质原理就是:每经过1个机器周期,计数存储器的值就加1。因此当使用定时器时,就必须掌握时钟周期和机器周期的关系。 时钟周期 :晶振频率的倒数
[单片机]
23-基于51单片机土壤湿度检测及自动浇花系统(带时间显示)
具体实现功能 具体功能: (1)液晶第一行显示实际湿度,液晶第二行显示当前时间; (2)按键说明:减键、加键、设置键; (3)可以设置湿度上下限报警范围,具有掉电保存功能,上电无需重新设置; (4)当湿度低于下限值时,打开水泵(风扇开始转动)进行抽水且声光报警,当湿度高于上限值时,自动关闭水泵停止抽水。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O
[单片机]
23-基于<font color='red'>51单片机</font>土壤湿度检测及自动浇花系统(带时间显示)
51单片机-串口&液晶屏Ⅰ
1.题目要求 这一次我们将上一讲的代码作为基础,要实现的任务就是电脑端发送过来的字符串单片机把它们显示在液晶屏上,由于液晶屏只能显示ASCII码的字符,无法显示汉字,所以电脑端发送过来的字符串也必须是英文输入法下打出的字符。 当单片机接收完字符串之后液晶屏显示“Reception Complete!”表示接收完成,持续一秒之后,蜂鸣器响一下,然后把接收到的字符串显示在液晶屏上,发送过来的字符串的字符数不能超过32个,因为液晶屏的显示范围只有32个格。 2.main.c测试代码 #include reg52.h #include function.h //详见第六章第8讲 #include lcd.h //详
[单片机]
<font color='red'>51单片机</font>-串口&液晶屏Ⅰ
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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