//采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为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);
}
Kinonoyomeo
- 粉丝: 92
- 资源: 1万+
最新资源
- 遗传算法带时间窗车辆路径规划问题VRPTW 内容:MATLAB程序完整源代码 用遗传算法求解工业园自主导航AGV快递配送车路径规划及投入AGV数量 详情:通过txt文档给定各客户坐标位置、方便取快
- 基于springboot高校就业招聘系统 - 编程语言:Java - 数据库:MySQL - 前端技术:Vue - 后端技术:SpringBoot全部资料+详细文档.zip
- 基于SSH(Struts2+Spring+Hibernate)搭建的失物招领平台,进行简单修改即可用于各高校失物招领。全部资料+详细文档.zip
- 基于SpringBoot框架的模拟高校招生的平行志愿录取系统全部资料+详细文档.zip
- 基于SSM的高校共享单车管理系统全部资料+详细文档.zip
- 基于SSM的高校人事招聘管理系统全部资料+详细文档.zip
- 基于SSM的高校考务管理系统,项目部署环境为腾讯云全部资料+详细文档.zip
- 基于ThinkPHP的高校班级管理系统全部资料+详细文档.zip
- 基于ssm高校学籍管理系统毕业源码案例设计全部资料+详细文档.zip
- 基于SSM框架的高校实验室管理系统全部资料+详细文档.zip
- 基于VC++的高校教材管理系统全部资料+详细文档.zip
- 基于Vue+Springboot高校失物招领系统设计毕业源码案例设计全部资料+详细文档.zip
- 基于Vue和SpringBoot的高校固定资产管理系统,用于实现高校对固定资产的管理需求,包含资产品类、资产单位、资产仓库、资产供应商、资产库存、资产采购、资产
- 基于Vue高校选课系统全部资料+详细文档.zip
- 基于Vue2+Spring Boot+Element-UI 的前后端分离项目高校二手物品交易平台全部资料+详细文档.zip
- Securecrt 9.6.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈