单片机双机通信c51程序

2018-01-12 20:59:26编辑:什么鱼 关键字:单片机  双机通信  c51程序

工程名称:双机通信 
说明:此程序可以实现两个 单片机 之间的相互通信;串口采用方式1  
      工作,10位异步接受和发送,波特率可变,由定时器1控制;且含有校验 


程序说明:SCON:串口通信控制寄存器 
SBUF:串行口的收发缓冲寄存器 
 PCON:电源管理寄存器。当SMOD=1时串行口的波特率加倍。 
IE:中断允许寄存器。ES=1表示允许串行口中断 
TI:发送中断标志位,TI由硬件置位,置位表示一帧信息发送结束,TI在发送数据前必须由软件清0 
RI:接收中断标志位,RI由硬件置位,置位表示一帧信息接收结束,RI在接收数据前必须由软件清0 

*******************************************************************************************/ 

#include //将51中定义常用特殊功能寄存器的变量定义文件包含进来 
#include "LCD12864.h" 

unsigned long vo_num1=0;//接收到的频率值 
unsigned long vo_num3=0;// 接收到的失真度 
unsigned int vo_num4=0;//缓存校验值 
unsigned char vo_num2[8];//缓存我们串口接收到的数据 
unsigned char m=0; 
unsigned int buf; 
unsigned int pf=0;//校验和 
#define seg_c P2 //将数码管的段显示定义到P2口 
#define bit_c P0   //将数码管的位选择定义到P0口 
#define fosc  22118400  //定义晶体振荡频率 
#define  bps  9600 //定义我们要通讯的波特率 
#define th1   256-(fosc/12/16/bps)   //利用宏计算出我们要给定时器中赋什么样的值才能满足我们需要的波特率 
//将0-F 查表 成我们键盘对应的字符  
unsigned char  code  seg[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};//定义从0-9 所对应的段码 
unsigned char  num[8]={9,8,7,6,5,4,3,2}; //声明8个显示缓存 对应我们数码管的8个位        
/********************************************************************************** 
函数名称:串口初始化函数 
**********************************************************************************/  
              
void serial_init (void)  //在使用串口模式1 前要初始 化串口寄存器等... 
{            
  SCON=0x50;   //串口工作于方式1,10位异步接收/发送,波特率可变 
  TMOD=0X20; //因为模式1用到了定时器1的自动重装模式,所以要这样设置定时器 
  PCON=0X00; //为了让通讯速率更快,设置SMOD=1 那么它所在的寄存器PC0N=0X80 ,串行口的波特率加倍。 
  TH1=th1; //将宏计算的定时器初值放到TH1中 
  TL1=th1;      
  TR1=1;//启动定时器来产生串口工作所需要的波特率 
  ES =1;//允许出串口中断 
  EA=1; //打开总中断允许位 


/********************************************************************************** 
函数名称:串口发送数据函数 
**********************************************************************************/  

void putbyte(unsigned char byte)// 利用硬件串口方式1 发送一个字节数据 

   SBUF=byte;//将要发送的数据送到发送缓冲区域,系统自动发送 
   while(!TI);//查询是否发送结束  当TI=1  代表发送结束 
   TI=0;//清发送结束位方便下一次发送 

/********************************************************************************** 
函数名称:串口接收数据函数 
说明:采用中断方式接收数据,串口中断的服务号是4 
**********************************************************************************/  
//串口中断服务函数  无论接收中断或者发送中断都能进来 
serial () interrupt 4   
{   
  
  if(RI)   //RI=1,表示一桢数据接收完 
  {                          
   vo_num2[m]=SBUF; 
   m++; 
 //  if(m>8) 
//   m=0; 
   
   } 
    RI=0;  //RI清0之后才能接收到下一帧数据。 
 }             

/********************************************************************************** 
函数名称:软件延时函数 

**********************************************************************************/  
void delay(unsigned char ms) //软件延迟函数 

  unsigned int a=0; 

   while(ms--) 
   { 
     for(a=0;a<10;a++); 
   } 


/********************************************************************************** 
函数名称:显示函数 
说明:数码管段选是P2口,位选是P0口。 

**********************************************************************************/  

 void display(unsigned int dis) 
{  
        unsigned char loop=0; 
         num[0]=10; 
         num[1]=10; 
         num[2]=10; 
         num[3]=dis/10000;            //得到要显示数据的万位 
         num[4]=(dis%10000)/1000;     //得到要显示数据的千位 
         num[5]=(dis%1000)/100;       //得到要显示数据的百位 
         num[6]=(dis%100)/10;         //得到要显示数据的十位 
         num[7]=(dis%10);             //得到要显示数据的个位 
  for(loop=0;loop<8;loop++) 
         { 
           bit_c=~(0x01<           seg_c=seg[num[loop]]; 
           delay(6); 
     seg_c=0xff;       //在这里加了这句话,消除鬼影 
         } 
         
}  


/********************************************************************************** 
函数名称发送校验函数 
说明: 

**********************************************************************************/  

void  check_transport( unsigned int buf) 
{   
    do 
 {   pf=0x00;                        //校验和清零 
     putbyte(buf);                   //发送数据并求解校验和   
     pf=(pf+buf&0x01+buf&0x02+buf&0x04+buf&0x08+buf&0x10+buf&0x20+buf&0x40+buf&0x80); 
                                 //求解校验和 
     putbyte(pf);                   //发送校验和     

     } while(SBUF!=0);   



/********************************************************************************** 
函数名称:接收校验函数 
说明: 

**********************************************************************************/  
void check_receive() 

  
while(1) 
   {    
      
  pf=0x00;                         //校验和清零                
//      vo_num4=SBUF; 
//  pf=pf+(vo_num4&0x01+vo_num4&0x02+vo_num4&0x04+vo_num4&0x08+vo_num4&0x10+vo_num4&0x20+vo_num4&0x40+vo_num4&0x80);   

        vo_num2[m]=SBUF; 
  pf=pf+( vo_num2[m]&0x01+vo_num2[m]&0x02+ vo_num2[m]&0x04+ vo_num2[m]&0x08+ vo_num2[m]&0x10+ vo_num2[m]&0x20+ vo_num2[m]&0x40+vo_num2[m]&0x80); 


                                  //求解校验和 
  if((SBUF^pf)==0x00)             //判断求出的校验和与接收到的校验和是否相等 
   { 
      putbyte(0x00);   
    m++;          

   break; 
   } 
   else  
   { 
    putbyte(0xff);              //如果不相等。则发送ff 
  
          } 
      }//while(1) 


  

  

/********************************************************************************** 
函数名称:主函数 
说明: 

**********************************************************************************/  

void disp(void) 

 lcd_init(0); 
 refrash_charactor(); 
 lcd_clear(); 
 str_1="频率:        Hz"; 
 str_2="失真度:0.      "; 

 lcd_display(1,1,str_1); 
 lcd_display(1,2,str_2); 


main() 

   unsigned char temp; 
    serial_init ();  //在使用串口模式1 前要初始   
    disp();                  
                    

  while(1) 
  {   
   
//      putbyte(0xeb)  ; 
//   putbyte(0x90)  ; 
//   putbyte(0xaa)  ; 
//   m=0; 
              
//      check_receive();   
     if(vo_num2[0]==0xeb&&vo_num2[1]==0x90&&vo_num2[2]==0xaa) 
  
  { vo_num1=vo_num2[3]*256+vo_num2[4];//频率 
   vo_num3=(vo_num2[5]*256+vo_num2[6])*10; //失真度 
   refrash_charactor(vo_num1,vo_num3); 
   lcd_display(4,1,freq); 
   lcd_display(6,2,dist); 
   m=0; 
  } 
  }//while(1)  

关键字:单片机  双机通信  c51程序

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018011237327.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:智能家居控制系统C程序
下一篇:单片机实现测温电路

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机实现LED流水灯(数组方式和位运算方式)

/* 名称:51单片机实现LED流水灯(数组方式和位运算方式)说明:今天又重新开始系统的学习51了,LED就算个开端吧。 要注意两点: 1、sfr和sbit是C语言扩展出来的关键字。其中sfr用于对特殊功能寄存器进行声明,sbit用于对某些特殊功能寄存器的某位进行声明。这里和宏定义很相似,但是不能用宏定义进行替换,对于前者是因为51单片机的寄存器存在于内部空间0x80-0xFF,这空间属于直接寻址,51特殊功能寄存只能直接寻址,不能间接寻址。如果用宏定义的话,在翻译成汇编时就会认为是通过总线访问对应的外部地址了。对于后者,sbit是定义一个标志位,也叫位变量。而类似于#define key1 P3
发表于 2018-07-21 13:08:22

51单片机之按键实验

/* 名称:51单片机之按键实验 说明:键盘是计算机最基础、最重要的输入设备之一。对于键盘来说,其工作任务大体可以分为以下三项: (1)、按键识别。即判断有无按键按下。 (2)、求键值。判断哪个键被按下。 (3)、执行相应的操作。 在这里,实验所用到的键盘为独立键盘和矩阵键盘。对于独立键盘,它的每个按键需要占用一个IO口。一般来说,按键一端接地,另一端接IO口。当按键按下时,线路被导通,IO口被拉低,即状态为‘0’。所以在使用是我们一般把对应IO口置成高电平,然后不断检测此IO口是否被拉低,从而判断按键是否按下。 对于矩阵键盘来说,它用较少的IO口完成较多个按键
发表于 2018-07-21 13:07:26

51单片机之数码管显示实验

/* 名称:51单片机之数码管显示实验 说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。 本实验编写了几个数码管显示的简单程序。在此不做赘述了。*/#include <reg52.h>#define uchar unsigned char//共阳极段码(a在高位,dp在低位
发表于 2018-07-21 13:06:23

STC单片机片内EEPROM的读写

宏晶STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。首先是stcEEPROM.h头文件内容:/*When         Who     Remarks----------------------------------2011-Oct-06  黄长浩  初始版本 */ #ifndef __STCEEPROM_H__#define
发表于 2018-07-17 21:12:48

AVR单片机ATMEGA8 USART的使用

;       [Bus Signal]  TX, RX, CK    USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。在博主目前的项目中使用通信主要是通过RS485协议来进行通信,RS485通信是工业上非常常见的半双工异步通信典型通信协议,特征是通信的设备都挂载到主线上,使用差分信号来判断收发,且同一时刻只能进行一个功能(收信息或者发信息)那么在博主这边的软件处理方式如下;首先要
发表于 2018-07-16 20:41:43

AVR单片机中ATmega8的AD转换探究

AD采集最好要满足的条件:采样频率不小于被采集信号最高频率的两倍,则采样输出信号就可以无失真的重新啊还原输入信号,通常的实际应用中,采样频率为采集最高频率的5-10倍。AD芯片的数据输出方式有串行和并行两种方式,对于AVR单片机来说A/D芯片和AVR单片机接口是需要考虑的一些问题:(1)模拟信号输入的连接:单端输入时,VIN+引脚直接与信号输入连接,VIN-接地。差分输入时,单端输入正信号,VIN+引脚直接与信号连接,VIN-引脚接地。单端输入负信号,VIN-引脚与信号连接,VIN+引脚接地。(2)数据输入线与系统总线的连接:有可控制的三态输出门时候可以直接和系统总线连接,没有输出门的时候要通过I/O口进行连接。(3)启动信号
发表于 2018-07-16 20:40:14

小广播

何立民专栏

单片机及嵌入式宝典

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

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