⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 51单片机C语言常用模块与综合系统设计实例精讲
💻 C
字号:
#include <./Atmel/at89x52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include "source.h"
void start_t2imer(void)//初始化定时器2,每10毫秒中断一次
{
  T2CON=0X00;
	RCAP2L=TIMER2L; //10ms
	TL2=TIMER2L;
	RCAP2H=TIMER2H;
	TH2=TIMER2H;
 	ET2=1;//enable timer2 interrupt
	TR2=1;//start timer
}
void stop_t2imer(void)//停止定时器2
{
	ET2=0; //disable timer2 interrupt
	TR2=0; //stop timer2 counter;
}
void reset_timer(unsigned char i)//停止软定时器i
{
	extern  struct my_timer TT[TIMER_NUM];
	TT[i].enable=0;
	TT[i].count=0;
}
void set_timer(unsigned char i,unsigned int count) //设置软定时器i的超时时间为count*10毫秒 
{
	TT[i].count=count;
	TT[i].enable=1;
}
bit detect_timeout(void){//检测定时器是否超时间
	unsigned char temp;
	bit ret;
	ret=0;
	if(timerout&TIMOUT_MOVE_ARROW){//箭头移动定时器超时,箭头可以移动一个步进
		timerout &=~TIMOUT_MOVE_ARROW;
		send_status_msg(MSG_STATUS_MOVE);
	}
	if(timerout&TIMOUT_ADV_CHANGE){//信息转换定时器超时,发送一个信息转换消息
		timerout &=~TIMOUT_ADV_CHANGE;
		send_hbs_msg(MSG_HBS_INFO_CHANGE);
	}
	if(timerout&TIMOUT_RTC){//1秒的实时时钟换定时器超时
		timerout &=~TIMOUT_RTC;
		rtc_update();//更新读出的RTC时间
		show_time();//在屏幕上显示时间。
	}
	if(timerout&TIMOUT_TEMPERATURE){//温度转化定时器超时
		timerout &=~TIMOUT_TEMPERATURE;
		switch(others.tem_fsm){
			case 0x00://等待300毫秒后开始温度转化
				others.tem_fsm=0X01;
				set_timer(TMPERA_TIMER,30);//power on 300 ms.
				break;
			case 0x01://开始温度转换
				others.tem_fsm=0X02;
				tmstart();//温度转换开始
				set_timer(TMPERA_TIMER,150);//必须到1.5秒后才能读到温度值
				break;
			case 0x02://温度传感器温度转换完毕,可以读取温度值了。
				others.tem_fsm=0X00;
				temp=tmrtemp_all();//temp为返回的温度值,其值为最高位为‘1’表明位负的温度,为‘0’表明为正的温度,其他的7比特表明温度值。
				others.temperature=temp;
				send_hbs_msg(MSG_HBS_UPD_TEMPE);//通知屏幕下半部分显示的程序,温度可以进行更新了。
				set_timer(TMPERA_TIMER,50);//再等待0.5秒后进行状态转换
				break;
			default:
				others.tem_fsm=0x00;
				set_timer(TMPERA_TIMER,50);
				break;
		}
	}
	if(timerout&TIMOUT_TEST_TIMER){//测试定时器超时
		static unsigned char test_num=0;
		static unsigned char flag_inc=1;
		static unsigned char flag_clear=0;
		timerout &=~TIMOUT_TEST_TIMER;
		if(flag_clear){//发送清除三角箭头消息
			flag_clear--;
			send_status_msg(MSG_STATUS_CLEAR);							
		}
		else{//在正常模式下,发送向上或向下箭头的消息
			if(flag_inc){//在每个TEST_TIMER超时时,使test_num的数值增加1,增长到22时停止增长
				if(test_num>21){//到达数字22后数字停止跳动3秒
					test_num=1;
					flag_clear=3;	
				}
				else{
					test_num++;
					send_status_msg(MSG_STATUS_UP);					
				}
			}
			else{//在每个TEST_TIMER超时时,使test_num的数值减少1,减少到1时停止减少
				if(test_num>2){
					test_num--;
					send_status_msg(MSG_STATUS_DOWN);				
				}
				else {//到达数字1后数字停止跳动3秒
					test_num=1;
					flag_clear=3;	
				}
			}
			scentry.storey[1]=test_num/10;//把test_num十位赋给显示数字的十位
			scentry.storey[0]=test_num%10;//把test_num个位赋给显示数字的个位。这样显示数字就在由1增加到22,再由22减少到1,如此循环。
		}
	}
	return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -