單片機(jī)和PC通過串口通信
串口設(shè)置:PC串口參數(shù)設(shè)置
本文引用地址:http://m.butianyuan.cn/article/201611/318354.htm串口號:COM1(默認(rèn),具體視使用情況而定)
波特率:9600
數(shù)據(jù)位:8
其他默認(rèn)
測試方法:可以用串口調(diào)試工具的字符串輸入框輸入:FAFAFA FA FA FA FA FA FACA,選擇HEX發(fā)送,HEX顯示,如果每發(fā)送一次就接收到以上數(shù)據(jù),并在單片機(jī)開發(fā)板上正確顯示,則測試成功。
//52單片機(jī)串口接收和發(fā)送測試程序;
//接收采用中斷方式,發(fā)送采用查詢方式;
//52串口通信,T1做串口波特率發(fā)生器;
#include "Port_Config.h"http://單片機(jī)端口定義
#include "LCD_Driver.h"http://單片機(jī)LCD顯示
#include "52_UART.h"http://52串口
#defineREC_BUF_LEN10//數(shù)據(jù)長度
#defineucharunsigned char;
#defineuintunsigned int;
ucharrec_buf[REC_BUF_LEN];//接收數(shù)據(jù)緩沖區(qū)
uintcheck_sum= 0;//接收數(shù)據(jù)校驗和
ucharcount= 0;//當(dāng)前接收數(shù)據(jù)個數(shù)
bitrec_flag= 0;//數(shù)據(jù)接收完成標(biāo)志
bitstart_flag= 0;//接收數(shù)據(jù)起始標(biāo)志
//==================================================
//函數(shù):void Init_UART1(void)
//描述:串口初始化函數(shù),使用T1方式2自重載方式做波特率發(fā)生器,
//串口使用方式1,8位數(shù)據(jù),可變波特率
//參數(shù):無
//返回:無
//作者:geoff日期:2010/11/04
//修改:日期:
//版本:V1.1
//==================================================
void UART1_Init(void)
{
SCON=0x50 ;//方式1,8位可變波特率
TMOD=0x20 ;//定時器1,方式2,8位自重載
PCON=0x00 ;//倍頻禁用
TH1=0xfa ;//晶振22.1184MHz,波特率9600;
TL1=0xfa ;//9600
IE|=0x90 ;//開中斷
TR1=1 ;//啟動定時器
}
//==================================================
//函數(shù):uchar UART1_Receive_Char(void)
//描述:單片機(jī)從串口接收一個字符
//參數(shù):無
//返回:uchar dat//接收到的數(shù)據(jù)
//作者:geoff日期:2010/11/11
//修改:日期:
//版本:V1.1
//==================================================
uchar UART1_Receive_Char(void)
{
uchar rec_data;
while(!RI);//等待接收完成
RI = 0;//接收完成后,清接收完成中斷
rec_data = SBUF;
return rec_data;
}
//==================================================
//函數(shù):void UART1_Send_Char(uchar send_data)
//描述:單片機(jī)向串口發(fā)送一個字符
//參數(shù):uchar send_data//待發(fā)送數(shù)據(jù)
//返回:無
//作者:geoff日期:2010/11/09
//修改:日期:
//版本:V1.1
//==================================================
void UART1_Send_Char(uchar send_data)
{
SBUF = send_data;
while(!TI);//等待發(fā)送完成
TI = 0;//發(fā)送完成后,清發(fā)送完成中斷
}
//==================================================
//函數(shù):void UART1_Send_String(uchar *str, uchar len)
//描述:單片機(jī)向串口發(fā)送一個字符串
//參數(shù):uchar *str//待發(fā)送數(shù)據(jù)
//uchar len//字符串長度
//返回:無
//作者:geoff日期:2010/11/10
//修改:日期:
//版本:V1.1
//==================================================
void UART1_Send_String(uchar *str, uchar len)
{
uchar i;
for(i=0; i { UART1_Send_Char(*(str+i)); } } //================================================== //函數(shù):void UART1_Intr(void) interrupt 4 //描述:串口中斷處理函數(shù),接受串口向單片機(jī)發(fā)來的數(shù)據(jù) //參數(shù):無 //返回:無 //作者:geoff日期:2010/11/10 //修改:geoff日期:2010/11/12 //版本:V2.1注意:第一個數(shù)據(jù)以0XFA開始 //================================================== void UART1_Intr(void) interrupt 4 { uchar rec_temp; if(RI)//RI=1,串口接收到數(shù)據(jù) { RI = 0;//清RI rec_temp = SBUF;//接收數(shù)據(jù) if((rec_temp==0xfa)&&(count==0))//判斷數(shù)據(jù)是否以O(shè)XFA開始 { check_sum = 0;//清校驗和 rec_buf[count] = rec_temp;//把接收到的數(shù)據(jù)存到接收數(shù)組里 count++;// /////測試用 LCD_DataWrite(rec_temp);//在LCD上顯示接收數(shù)據(jù) check_sum += rec_temp;//計算校驗和 start_flag = 1;//數(shù)據(jù)以O(shè)XFA開始,置開始標(biāo)志 } else if(start_flag==1)//判斷數(shù)據(jù)是否開始 { rec_buf[count] = rec_temp;//接收數(shù)據(jù) count++;// /////測試用 LCD_DataWrite(rec_temp);//在LCD上顯示接收數(shù)據(jù) check_sum += rec_temp;//計算校驗和 if(count==REC_BUF_LEN)//判斷是否是最后一位數(shù)據(jù),第十位 { count = 0;//從0重新計數(shù) start_flag = 0;//接收數(shù)據(jù)結(jié)束 check_sum -= rec_temp;//計算最終校驗和 if((uchar)check_sum==rec_temp)//判斷數(shù)據(jù)接收是否正確, {//數(shù)據(jù)最后一位是校驗和的后8位 rec_flag = 1;//置接收完成標(biāo)志 } } } } } //================================================== //函數(shù):void UART1_Demo(void) //描述:串口通信測試程序,使用T1方式2自重載方式做波特率發(fā)生器, //串口使用方式1,8位,可變波特率 //晶振22.1184MHz,波特率9600; //參數(shù):無 //返回:無 //作者:geoff日期:2010/11/08 //修改:geoff日期:2010/11/09 //版本:V1.1 //================================================== void UART1_Demo(void) { UART1_Init(); TI = 1;//SBUF置空 /////測試用 LCD_RegWrite(0x80); while(1) { if(rec_flag == 1)//把接收到的數(shù)據(jù),發(fā)送到串口輸出 { rec_flag = 0;//清接收完成標(biāo)志 UART1_Send_String(rec_buf,REC_BUF_LEN); } Rst_WDT();//喂狗 } } //================================================== //函數(shù):void main(void) //描述:主函數(shù) //參數(shù):無 //返回:無 //作者:geoff日期:2010/11/08 //修改:日期: //版本:V1.1 //================================================== void main(void) { LCD_Init();//單片機(jī)LCD初始化 UART1_Demo(); } 本文通過約定特定通信協(xié)議,實現(xiàn)單片機(jī)和PC的通信,經(jīng)過測試,單片機(jī)收發(fā)正常;出現(xiàn)不能通信時,可以多發(fā)幾個非0XFA數(shù)據(jù),讓單片機(jī)準(zhǔn)備接收,然后按照約定的格式發(fā)送,并保證每次發(fā)送字符長度為10個字節(jié)。
評論