关于程序的经验
经验1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。
比如这段代码
void HcSr04Test(void)
{
EA=0; //先关闭中断,必须得加
StartModule(); //开始超神波模块
while (!gEcho); // 当gEcho为零时等待
TR1 = 1; // 开启计数
while (gEcho); // 当RX为1计数并等待
TR1 = 0; // 关闭计数
MesureDistance(); // 计算距离并显示
Delay10ms(); // 以10ms为测距周期
EA=1; //必须得加,这样程序不会卡死,丢失数据程序会卡死
}
假如不加关闭中断,若你在主循环中还用到,其他的中断函数,那么此时当执行到 while (!gEcho) 这条语句时,来了一个中断,会立马执行中断服务程序,
从而打断当前程序,这样程序就容易卡死。
参考链接https://blog.csdn.net/baidu_25505611/article/details/70345499
经验2.关于如何用STC89C52RC单片机的定时器2来产生串口波特率
/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{
T2CON = 0x30; //定时器2用作串口波特率发生器且16位自动重装模式
TL2 = 0xDC; //9600波特率,11.0592Mhz晶振
TH2 = 0xFF; //9600波特率,11.0592Mhz晶振
RCAP2H = 0xFF; //高位重装值
RCAP2L = 0xDC; //低八位重装值
SCON = 0x50; //串口工作方式1,8位uart且波特率可变,且允许串口接收数据
PCON = 0X00; //波特率不加倍
TR2 = 1; //启动T2
EA = 1; //开总中断
ES = 1; //开串口中断
}
/*********************************************************************
* 函 数 名 : UartSendBytes
* 函数功能 : 通过串口往外发送数据
* 参数列表 : uchar *c,要发的数据
* 函数输出 : 无
*********************************************************************/
void UartSendBytes(unsigned char *c)//串口发送数据
{
EA = 0; //开总中断
ES=0; //开串口中断
TI=0; //准备发送数据
while(*c != '\0') //当要发的字符串为空字符,'\0'表示null
{
SBUF = *c; //SBUF为串口数据缓存区,地址为99H
while(!TI); //TI为串行口1发送中断请求标志位,置一表示,发送一个字节完毕
TI = 0; //标志清零,确保下一次发送
c++; //指向下一个字符
}
ES = 1; //发送完成了,开启串口中断服务
EA = 1; //发送完成了,开启总中断服务
}
串口波特率设置详情,请参考连接https://blog.csdn.net/qq_44829055/article/details/110387539
关于'\0'和'0'的区别与'0'和"0"的区别请参考[https://blog.csdn.net/supreme42/article/details/7300451](深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别)

浙公网安备 33010602011771号