当前位置:首页 > 单片机 > 单片机
[导读]串口调试这个东西真的太经典了,虽然我对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);

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭