访问电脑版页面

导航:老古开发网手机版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
栏目: [ 51单片机Keil C51编程]

相关阅读

几种码制转换 BCD TO HEX,HEX TO BCD ,BIN TO HEX

让Ultra Edit和Keil结合的更紧密

在KEIL C51上仿真完了,怎样生成HEX文件去烧写??

在Keil c51调试中,如何查看外部存储器XDATA?

Keil C51中如何实现代码优化?

C51中 INT 转换为 2个CHAR?

Keil C51编译错误总结

proteus与keil的完美结合(没有开发板,让你也学的爽!)

C51 的重入问题 WARNING L15: MULTIPLE CALL TO SEGMENT(转)

[转载]C51中断处理过程

那位大虾能告诉我C51 的printf()函数有什么用?

keil 7.0编译出现:error C316: unterminated conditionals

51单片机CO2检测显示程序解析

在Keil c51调试中,如何查看特殊寄存器?

Keil C51单片机中变量的使用方法解析

volatile的用法

在Keil c51调试中,如何查看全部256bytes的内部RAM?

MCS51单片机程序设计时堆栈的计算方法解析

SBUF=0x65,c=SBUF结果为c=0???

keil C51 怎样把修改的startup.a51 加到工程文件中