代碼調(diào)試之串口調(diào)試2
串口調(diào)試這個東西真的太經(jīng)典了,雖然我對51的串口通信方式還是一知半解,但是這幾天調(diào)試程序,又通過看郭天祥的書,對51的串口有了進一步的認(rèn)識,串口調(diào)試的程序需要多多收集,開始德飛來板子上的串口程序感覺起來就是個渣渣,一點都不好用,在調(diào)試程序的時候老是出問題,上一篇調(diào)試串口的程序就是移植德飛來板子上的程序,不僅波特率不能自己更改,比較死板,要注意的東西很多,不適合,今天調(diào)試溫度傳感器那個程序,突然間發(fā)現(xiàn)一個比較又用的串口調(diào)試程序,就曬在園子里,供大家參考
//****************************************************************//
// AM系列讀單總線使用范例
//單片機 :AT89S52 或 STC89C52RC
// 功能 :串口發(fā)送溫濕度數(shù)據(jù) 波特率 9600
// 晶振 :12M (用戶系統(tǒng)時鐘如不是12M 請更改相關(guān)宏定義及注釋的延時時間)
// 編譯環(huán)境: Keil3
// 公司 :奧松電子
//****************************************************************//
#include "reg52.h"
#include
//用戶根據(jù)自己的晶振修改相應(yīng)值
#define FOSC 11059200
#define BAUD 9600
//讀傳感器 端口位定義,可修改
sbit Sensor_SDA = P0^0;
sbit Sensor_SCL = P0^1;
// 變量定義
unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char Sensor_Check; //校驗和
unsigned char Sensor_AnswerFlag; //收到起始標(biāo)志位
unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標(biāo)志
unsigned int Sys_CNT;
unsigned int Tmp;
unsigned char *String;
//字符串定義
#define S_Temp "Temp:"
#define S_RH "RH:"
#define S_CRCT "Check: True"
#define S_CRCF "Check: Wrong"
#define S_Data "Data: "
#define S_NotS "Sensor Not Connected"
/********************************************
|* 功能: 延時 晶振為12M時 *|
|* t = 1 為 20us 然后成倍增加10us左右 *|
********************************************/
void Delay_N10us(unsigned char t)
{
while(t--)
{
_nop_();
}
}
/********************************************
|* 功能: 延時 晶振為12M時 *|
|* 延時大約 1ms *|
********************************************/
void Delay_N1ms(unsigned int t)
{
unsigned int i;
unsigned int j;
for(j=t;j>0;j--)
for(i=124;i>0;i--); //延時大約 1ms
}
/********************************************
|* 功能: 初始化串口 *|
********************************************/
void InitUART(void)
{
unsigned int iTmpBaud;
unsigned long lTmpBaud;
iTmpBaud = 0;
//首先選定定時器2作為波特率發(fā)生器,16位定時器,自動裝載
SCON = 0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI //0 1 0 1 0 0 0 0
PCON = 0x00; //PCON的地址是87H,這里SMOD =0
T2CON = 0x30; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 0
T2MOD = 0x00; // / / / / / / T2OE DCEN //0 0 0 0 0 0 0 0
lTmpBaud = FOSC/BAUD;
lTmpBaud /= 32; //12T-mode
iTmpBaud = lTmpBaud & 0xFFFF;
iTmpBaud = 65536 - iTmpBaud;
RCAP2H = (iTmpBaud>>8) & 0x0FF;
RCAP2L = iTmpBaud & 0x0FF;
RI = 0; //清除接收中斷標(biāo)志
REN = 1; //允許串行接收
ES = 1; //允許串行中斷
TR2 = 1; //啟動定時器1
EA=1;//開總中斷
}
/********************************************
|* 功能: 串口發(fā)送函數(shù) *|
********************************************/
void UARTSend(char UCHAR)
{
SBUF=UCHAR;
while(TI==0);
TI=0;
}
/********************************************
|* 功能: 串口中斷函數(shù) *|
********************************************/
void UARTRead(void) interrupt 4
{
char temp;
if(RI)
{
RI=0;
temp = SBUF;
}
}
/********************************************
|* 功能: 串口發(fā)送子函數(shù) *|
********************************************/
void UART_PutString(unsigned char *buf)
{
while(*buf)
UARTSend(*buf++);
}
void UART_PutStringAndNum(unsigned char *buf ,unsigned int num)
{
unsigned char a[3],i;
a[3] = '0'+num%10;
a[2] = '.';
a[1] = '0'+num/10%10;
a[0] = '0'+num/100%10;
while(*buf)
UARTSend(*buf++);
UARTSend(' ');
for(i=0;i<4;i++)
{
UARTSend(a[i]);
}
}
void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)
{
unsigned char a[2],i,j;
while(*buf)
UARTSend(*buf++);
UARTSend(' ');
for(i=0;i<5;i++)
{
a[0] = bufdata[i]/16;
a[1] = bufdata[i]%16;
for(j=0;j<2;j++)
{
if(a[j]>9)
{
a[j] = (a[j]-10)+'A';
}
else
{
a[j] = a[j]+'0';
}
UARTSend(a[j]);
}
UARTSend(' ');
}
}
/********************************************
|* 功能: 串口發(fā)送傳感器數(shù)據(jù)函數(shù) *|
********************************************/
void UARTSend_Nbyte(void)
{
if(Sensor_AnswerFlag == 1)
{
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
//校驗成功
if(Sensor_Check ==Sensor_Data[4])
{
String = S_RH;//"RH:";
Tmp = Sensor_Data[0]*256+Sensor_Data[1];
UART_PutStringAndNum(String,Tmp);
UARTSend(' ');
UARTSend(' ');
String = S_Temp;// "Temp:";
Tmp = Sensor_Data[2]*256+Sensor_Data[3];
UART_PutStringAndNum(String,Tmp);
UARTSend(' ');
UARTSend(' ');
String = S_CRCT;//"Check: True";
UART_PutString(String);
}else //校驗失敗 送上讀到數(shù)據(jù)
{
String = S_Data;//"Data: ";
UART_PutStringAnd_Data(String,Sensor_Data);
UARTSend(' ');
UARTSend(' ');
String = S_CRCF;//"Check: Wrong";
UART_PutString(String);
}
}// 傳感器未連接
else
{
String = S_NotS; //"Sensor Not Connected";
UART_PutString(String);
}