关于程序的经验

经验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之间的区别)

posted @ 2021-04-27 21:46  codeaholic  阅读(98)  评论(0)    收藏  举报