给出函数的主要简要流程步骤:void main(void) { Init_Timer0(); //定时器0初始化 UART_Init(); DelayMs(200); //延时有助于稳定 Init_ST7920(); //初始化 ClrScreen(); buzzer =1; while(1) { if(dealSuduFlag == 1) { Sudu=(float)PluNum0.23.6/2; //m/s 20个脉冲为1圈 3s时间进行检测 disPlu = PluNum/2; //转速 PluNum=0; dealSuduFlag=0; juli = juli+Sudu0.2; //公里 } if(disFlag==1) //显示 { disFlag=0; //标志位清零 ReadTempFlag++; //读取温度计时 if(ReadTempFlag >= 3) { ReadTempFlag=0; temp1=ReadTemperature(); //读取温度 temperature=(float)temp10.0625; //温度值转换 } if((yeweiG == 0)&&(yeweiD == 0))//上下液位有水 { yeweiFlag = 'H'; } sprintf(dis0,"液位 %c ",yeweiFlag);//打印 LCD_PutString(0,1,dis0,16);//显示 sprintf(dis1,"温度 %4.1fC 40 ",temperature);//打印 LCD_PutString(0,2,dis1,16);//显示 if((Sudu>1.5)||(temperature>40)||(yeweiFlag=='L')) //异常情况 {buzzer = !buzzer;} } } }
时间: 2024-01-10 22:02:07 浏览: 27
这段代码主要是一个嵌入式系统的主函数,包含以下几个步骤:
1. 初始化定时器0,用于定时处理一些任务;
2. 初始化UART串口通信模块,用于与外部进行通信;
3. 延时200ms,等待系统稳定;
4. 初始化ST7920液晶显示模块;
5. 清屏;
6. 开启蜂鸣器;
7. 进入主循环,不断进行以下几个操作:
a. 如果dealSuduFlag标志位为1,表示需要进行速度检测,计算出当前速度和里程,并将标志位清零;
b. 如果disFlag标志位为1,表示需要进行信息显示,包括读取温度、液位状态等,并将标志位清零;
c. 当液位低于一定程度、温度过高或速度异常时,触发蜂鸣器报警。
以上就是这段代码的主要流程步骤。
相关问题
TC7 = TIMER_PERIOD; // 设置定时器计数值出错
很可能是因为`TIMER_PERIOD`的数据类型不匹配而导致设置定时器计数值出错。在S9S12G128芯片中,定时器计数器的计数值是一个16位无符号整数,范围是0x0000~0xFFFF。因此,如果`TIMER_PERIOD`的数据类型不是16位无符号整数,就会导致设置定时器计数值出错。
要解决这个问题,可以将`TIMER_PERIOD`的数据类型改为16位无符号整数,即`unsigned int`或`uint16_t`。同时,为了避免数据类型不匹配的问题,可以将定时器计数值直接赋值给`TC7H`和`TC7L`寄存器,而不是使用`TC7`寄存器。具体代码如下:
```
#define TIMER_PERIOD 8000 // 定时器计数值
void timer_init(void);
interrupt VectorNumber_Vtimch7 void timer_isr(void);
void main(void) {
timer_init(); // 初始化定时器
EnableInterrupts; // 开启全局中断
for(;;) {
// 主循环中可以执行其他操作
}
}
void timer_init(void) {
TSCR1 = 0x80; // 启动定时器,使用内部总线时钟
TSCR2 = 0x00; // 设置定时器时钟分频系数为1,不使用输出比较功能
TIOS |= 0x80; // 设置定时器7为输出比较模式
TC7H = TIMER_PERIOD >> 8; // 设置定时器计数值的高8位
TC7L = TIMER_PERIOD & 0xFF; // 设置定时器计数值的低8位
TIE |= 0x80; // 开启定时器7的中断
}
interrupt VectorNumber_Vtimch7 void timer_isr(void) {
TFLG1 |= 0x80; // 清除定时器7中断标志位
// 在这里执行需要定时执行的操作
}
```
在上述代码中,首先将`TIMER_PERIOD`的数据类型改为了`unsigned int`,并将其值设为8000,即定时器计数值的1/1000。然后在`timer_init()`函数中,将定时器计数值的高8位和低8位分别赋值给`TC7H`和`TC7L`寄存器。最后开启定时器7的中断。
这样做可以避免数据类型不匹配的问题,同时也可以提高代码的可读性和可维护性。
修改语法 typedef void *TIMER_ID; typedef void (* TAL_TIMER_CB)(void); TIMER_ID zcd_timer; void zcd_callback_func(void) {} unsigned char zero_crossing_detect_unit_sw_timer_create(TAL_TIMER_CB func, void *arg, TIMER_ID *timer_id) { //函数关联的是开启定时器,形参是时间到了执行硬件动作,并且查看是否开启硬件,初始化是开启定时器,并且返回OK if(zero_crossing_detect_unit.zcb_sw_timer_create(zcb_timer_callback, NULL, &zcd_timer) != OPRT_OK) { rt = OPRT_COM_ERROR; } return rt; }
TIMER_ID *timer_id) {
// 初始化定时器并返回OK
zcd_timer = zero_crossing_detect_unit.zcb_sw_timer_create(func, arg, timer_id);
if (zcd_timer != NULL) {
return OK;
} else {
return ERROR;
}
}
// 回调函数
void zcd_callback_func(void) {}
// 定义类型
typedef void *TIMER_ID;
typedef void (*TAL_TIMER_CB)(void);
// 定义变量
TIMER_ID zcd_timer;
// 创建定时器
unsigned char zero_crossing_detect_unit_sw_timer_create(TAL_TIMER_CB func, void *arg, TIMER_ID *timer_id) {
// 调用函数创建定时器
zcd_timer = zero_crossing_detect_unit.zcb_sw_timer_create(func, arg, timer_id);
// 判断定时器是否创建成功
if (zcd_timer != NULL) {
return OK;
} else {
return ERROR;
}
}