|
单片机源程序如下:
- //采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为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);
- }
复制代码
所有资料51hei提供下载:
|
-
-
6.2 PC机与单片机串口通信.zip
4.62 KB, 下载次数: 157, 下载积分: 黑币 -5
-
-
6.1 PC机与PC机串口通信.zip
3.1 KB, 下载次数: 43, 下载积分: 黑币 -5
-
-
6.3 PC机与智能仪器串口通信.zip
4.39 KB, 下载次数: 49, 下载积分: 黑币 -5
-
-
6.4 PC机与PLC串口通信.zip
4.89 KB, 下载次数: 42, 下载积分: 黑币 -5
-
-
6.5 PC机与GSM短信模块串口通信.zip
32.72 KB, 下载次数: 40, 下载积分: 黑币 -5
评分
-
查看全部评分
|