访问手机版页面
你的位置:老古开发网 > 51单片机 > 51单片机Keil C51编程 > 正文  
代码调试之串口调试2
内容导读:
串口调试这个东西真的太经典了,虽然我对51的串口通信方式还是一知半解,但是这几天调试程序,又通过看郭天祥的书,对51的串口有了进一步的认识,串口调试的程序需要多多收集,开始德飞来板子上的串口程序感觉起来就

串口调试这个东西真的太经典了,虽然我对51的串口通信方式还是一知半解,但是这几天调试程序,又通过看郭天祥的书,对51的串口有了进一步的认识,串口调试的程序需要多多收集,开始德飞来板子上的串口程序感觉起来就是个渣渣,一点都不好用,在调试程序的时候老是出问题,上一篇调试串口的程序就是移植德飞来板子上的程序,不仅波特率不能自己更改,比较死板,要注意的东西很多,不适合,今天调试温度传感器那个程序,突然间发现一个比较又用的串口调试程序,就晒在园子里,供大家参考

//****************************************************************//

// AM系列读单总线使用范例

//单片机 :AT89S52 或 STC89C52RC

// 功能 :串口发送温湿度数据 波特率 9600

// 晶振 :12M (用户系统时钟如不是12M 请更改相关宏定义及注释的延时时间)

// 编译环境: Keil3

// 公司 :奥松电子

//****************************************************************//


#include "reg52.h"

#include


//用户根据自己的晶振修改相应值

#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; //收到起始标志位

unsigned char Sensor_ErrorFlag; //读取传感器错误标志

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作为波特率发生器,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; //清除接收中断标志

REN = 1; //允许串行接收

ES = 1; //允许串行中断

TR2 = 1; //启动定时器1


EA=1;//开总中断

}


/********************************************

|* 功能: 串口发送函数 *|

********************************************/

void UARTSend(char UCHAR)

{

SBUF=UCHAR;

while(TI==0);

TI=0;

}

/********************************************

|* 功能: 串口中断函数 *|

********************************************/

void UARTRead(void) interrupt 4

{

char temp;

if(RI)

{

RI=0;

temp = SBUF;

}

}

/********************************************

|* 功能: 串口发送子函数 *|

********************************************/

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(' ');

}

}

/********************************************

|* 功能: 串口发送传感器数据函数 *|

********************************************/

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 //校验失败 送上读到数据

{

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);

}

标签: 串口调试,代码调试,
来源:互联网 作者:karen 时间:2018/9/21 11:00:02
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐