⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51程序.txt

📁 PC机与单片机串口通信,PC机与单片机串口通信
💻 TXT
字号:

//采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为9600bit/s。每个数据帧包含10Byte信息,1Byte作为帧起始标志,8Byte数据,1Byte的校验和。
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#define COUNT 10                   // 定义接收缓冲区大小 
unsigned char buffer[COUNT];	      //定义接收缓冲区
unsigned char point;                   //定义接收数据个数指示变量
void UART_init();                    //串口初始化函数
void COM_send(void);                //串口接收函数
unsigned char CLU_checkdata(void);     //计算校验位函数
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//初始化串行口和波特率发生器
//--------------------------------------------------------------------------------------------------
void UART_init()
{                    
SCON =0x58;          //选择串口工作方式,打开接收允许
TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1;              //启动定时器T1
ET1 =0; 
ES=1;                //允许串行口中断
PS=1;                //设计串行口中断优先级
EA =1;               //单片机中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
  unsigned char RECEIVR_buffer;
  if(RI)                                     //处理接收中断
  {
RI=0;                                //清除中断标志位
RECEIVR_buffer=SBUF;		          //接收串口数据
if(point==0)						 //如果还没有接收到起始位
        {
         if(RECEIVR_buffer=='S')             //判断是否起始标志位
           point++;				          //是准备接收下一位
	        else
		      point=0;				          //不是,继续等待起始位
	       } 
else if(point>0&&point<10)				 //判断是否接收够十位数据
	     buffer[point++]=RECEIVR_buffer;	     //不够,把接收到的数据放入接收缓存区
else point=0;               		 	 //缓冲区已满,清除缓存区内数据重新接收
}
If(TI)                                   //处理发送中断
 { 
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
for(point=0;point<=10,TI=1;point++)	       //连续发送十位数据                                      
  {
   SBUF=buffer[point];                  //把缓存区的数据都发送到串口
   TI=0;
   }
}
//--------------------------------------------------------------------------------------------------
// 函数名称: CLU_checkdata()计算校验位函数
// 输入变量: 无
// 输出变量: checkdata,包括起始位在内的前九位数据的校验和
// 函数功能: 计算校验和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{										 //计算校验位
 unsigned char checkdata=0;
for(point=0;point<9,TI=1;point++)
  {
   checkdata=checkdata|buffer[point];
   }
 return(checkdata);
 }
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度各子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
 void main(void)
 {
 unsigned char checkdata;
 do
 {
  UART_init();						 //初始化串口
  if(point==10)						 //判断数据是否接收完成
  checkdata=CLU_checkdata;			 //调用求校验和函数
  if(checkdata==buffer[9])			      //判断校验和是否正确
  COM_send();                         //正确则调用发送程序 
  point=0;
  }
   while(1);
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -