注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙粒的博客

 
 
 

日志

 
 

C51通信:自定义数据帧  

2014-11-18 20:57:40|  分类: 通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、c51程序功能

c51接收特定的数据帧,并执行数据帧定义的功能;

二、数据帧自定义:

1、定义设备开关量

0x02(开始)    0x4B(表示开关量)  0x01(设备编号)  0x10(启动) 

0x02(开始)    0x4B(表示开关量)  0x01(设备编号)  0x11(停止) 

2、定义模拟量

0x02(开始)    0x53(表示模拟量)  0x01(设备编号)  0x03(数据例如0x03

三、代码

 

/*

程序说明:

1c51接收特定数据帧

数据帧10x02(开始)  0x4B(表示开关量)  0x01(设备编号)  0x10(启动)  

数据帧20x02(开始)  0x4B(表示开关量)  0x01(设备编号)  0x11(停止)

数据帧30x02(开始)  0x53(表示模拟量)  0x01(设备编号)  0x03(数据例如0x03

 

 

2

收到数据帧1,使P1.0=0;信号灯亮

收到数据帧2,使P1.0=1;信号灯暗

收到数据帧3,使P1=tab[buffer[3]];

 

 

*/

 

#include <reg52.h>

#define uchar unsigned char

 

//定义接收缓存

#define COUNT 4

uchar buffer[COUNT];

 

//定义数码管转换表

//共阳:

uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

 

 

//记录接收字节数

uchar point;

 

//定义开始字符

#define start 0x02

 

sbit light=P1^0;

 

 

//串口设置,

void init();

void process();

 

//主函数

void main()

{

     point=0;

 

     init();

 

     while(1)

     {

            //对接收到的数据处理

            process();

     }

 

 

 

 

}

 

 

//初始化工作,

//T0T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号

//串口设置,

void init()

{

  //----T1 波特率设置

  //T1,方式2,自动重载作波特率发生器

  //T0,方式016位计数器,作定时器,超时溢出(需要时设置)

  TMOD=0x21;

 

  //T1常数计算,baud=9600,f=11.0592MHZ

  //晶振->12分频->定时器输入,8位计数,定时器输出->2分频(默认SMOD=0,如SMOD=1不分频)->16分频->波特率

  //常数TC=2^8-f/12/2/16/baud 

  TL1=0xfd;

  TH1=0xfd;

 

  //串口设置

  //串口方式1,允许接收

  SCON=0x50;

 

  //中断设置,串口开中断

  ES=1;    //串口开中断

  //启动定时器,启动波特率

  TR1=1;

 

  //--T0 定时器设置     (根据需要设置)

  //常数设置,f=11.0592Mhz,定时t=0.0711秒,

//  TL0=0x00;

//  TH0=0x00;

  //开中断

//  ET0=1;

  //启动

//  TR0=1;

 

  //开总中断

  EA=1;   //打开 总允许

 

 

 

}

 

//处理接收到的数据

void process()

{

     //收到数据帧1

     if( (buffer[1]==0x4B) && (buffer[2]==0x01) && (buffer[3]==0x10) )

            light=0;

 

     //收到数据帧2

     if( (buffer[1]==0x4B) && (buffer[2]==0x01) && (buffer[3]==0x11) )

            light=1;

 

     //收到数据帧3

     if( (buffer[1]==0x53) && (buffer[2]==0x01) )//&& (buffer[3]==0x03) )

            P1=tab[buffer[3]];

 

    

             

}

 

//串口中断程序

void communication() interrupt 4

{

     //定义变量

     uchar receive_buf;

 

     //收到数据

     if(RI)

     {

            //中断标志清零

            RI=0;

            //接收数据

            receive_buf=SBUF;

 

            //

            if(point==0)

            {     

                   //还未接收到数据,检测收到的数据是否“开始”字符

                   if(receive_buf==start)

                          point++; 

                   else

                          point=0;                         

            }

            else if(point>0 && point<COUNT)

                   //接收指定字节数量的数据

                   buffer[point++]=receive_buf;

            else

                   //接收到指定数据,point=0,准备重新接收数据

                   point=0;

     }

 

 

 

    

 

}

 

 

//T0 中断程序,(根据需要编写)

//TF0 由硬件置1,若开中断,进入中断程序,由硬件自动清0;

/*

void timer0() interrupt 1

{

}

*/

 

 

  评论这张
 
阅读(302)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017