最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

可以设置时间的计时器

互联网 admin 2浏览 0评论

可以设置时间的计时器

完整电路图:

完整代码:

/*
实验说明:实验接线:1,动态数码管模块-->单片机管脚参考动态数码管显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)实验现象:数码管上显示秒表
*/#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;sbit k1=P3^1;   //jia
sbit k2=P3^0;  //jian
sbit k3=P3^2;  //mode
sbit k4=P3^3;	 //定义按键端口u8 KEY_Scan(u8 mode);
void KEY_Pros();u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值u8 ssec,sec,min; //毫秒,秒,分
u8 DisplayData[8];
u8 mode = 0;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);	
}/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能		   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0Xd8;	//给定时器赋初值,定时10msTL0=0Xf0;	TR0=1;//打开定时器			
}/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)	 //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位	//1111 1110   显示第一位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位  //1111 1101case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位}P0=DisplayData[i];//发送段码delay(100); //间隔一段时间扫描	P0=0x00;//消隐}
}void datapros()
{DisplayData[0]=smgduan[min/10];DisplayData[1]=smgduan[min%10];DisplayData[2]=0x40;	DisplayData[3]=smgduan[sec/10];DisplayData[4]=smgduan[sec%10];DisplayData[5]=0x40;DisplayData[6]=smgduan[ssec/10];DisplayData[7]=smgduan[ssec%10];
}void time_process(){if(TF0==1)	  //定时器T0溢出标志{TF0=0;TH0=0Xd8;	//给定时器赋初值,定时10msTL0=0Xf0;ssec++;if(ssec>=100)  //1s{ssec=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;}}	}	}	
}#define  K1_MODE  1
#define  K2_ADD  2
#define  K3_DEC  3//mode:  0-单次扫描   1-连续扫描
u8 KEY_Scan(u8 mode)
{static u8 key=1;if(key&&(k1==0||k2==0||k3==0)){delay(1000);   //消抖key=0;if(k3==0){return K1_MODE;}else if(k1==0){return K2_ADD;}else if(k2==0){return K3_DEC;	}}else if(k1==1&&k2==1&&k3==1){key=1;	}if(mode){key=1;}return 0;	
}void KEY_Pros()
{u8 key;key=KEY_Scan(0);if(key==K1_MODE)   //模式选择{mode++;//while(!start);  //等待按键释放if(mode==1){TR0=!TR0;		//定时器的控制位取反}else if(mode==2){//TR0=TR0;		//定时器的控制位取反}else {mode=0;TR0=!TR0;}}if(mode==1)	 //温度上限设置{switch(key)	{case K2_ADD: 	   //加sec++;if(sec>=60)sec=0;break;case K3_DEC: 	 //减sec--;if(sec<=0)sec=59;break;}datapros();DigDisplay();	 }else if(mode==2)  //温度下限设置{switch(key)	{case K2_ADD: 	   //加min++;if(min>=60)min=0;break;case K3_DEC: 	 //减min--;if(min<=0)min=59;break;}datapros();DigDisplay();	}}
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main(void)
{	Timer0Init();  //定时器0初始化while(1){time_process();if(mode==0){datapros();DigDisplay();	}KEY_Pros();}		
}

效果展示:

 

 

 

可以设置时间的计时器

完整电路图:

完整代码:

/*
实验说明:实验接线:1,动态数码管模块-->单片机管脚参考动态数码管显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)实验现象:数码管上显示秒表
*/#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;sbit k1=P3^1;   //jia
sbit k2=P3^0;  //jian
sbit k3=P3^2;  //mode
sbit k4=P3^3;	 //定义按键端口u8 KEY_Scan(u8 mode);
void KEY_Pros();u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值u8 ssec,sec,min; //毫秒,秒,分
u8 DisplayData[8];
u8 mode = 0;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);	
}/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能		   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0Xd8;	//给定时器赋初值,定时10msTL0=0Xf0;	TR0=1;//打开定时器			
}/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)	 //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位	//1111 1110   显示第一位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位  //1111 1101case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位}P0=DisplayData[i];//发送段码delay(100); //间隔一段时间扫描	P0=0x00;//消隐}
}void datapros()
{DisplayData[0]=smgduan[min/10];DisplayData[1]=smgduan[min%10];DisplayData[2]=0x40;	DisplayData[3]=smgduan[sec/10];DisplayData[4]=smgduan[sec%10];DisplayData[5]=0x40;DisplayData[6]=smgduan[ssec/10];DisplayData[7]=smgduan[ssec%10];
}void time_process(){if(TF0==1)	  //定时器T0溢出标志{TF0=0;TH0=0Xd8;	//给定时器赋初值,定时10msTL0=0Xf0;ssec++;if(ssec>=100)  //1s{ssec=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;}}	}	}	
}#define  K1_MODE  1
#define  K2_ADD  2
#define  K3_DEC  3//mode:  0-单次扫描   1-连续扫描
u8 KEY_Scan(u8 mode)
{static u8 key=1;if(key&&(k1==0||k2==0||k3==0)){delay(1000);   //消抖key=0;if(k3==0){return K1_MODE;}else if(k1==0){return K2_ADD;}else if(k2==0){return K3_DEC;	}}else if(k1==1&&k2==1&&k3==1){key=1;	}if(mode){key=1;}return 0;	
}void KEY_Pros()
{u8 key;key=KEY_Scan(0);if(key==K1_MODE)   //模式选择{mode++;//while(!start);  //等待按键释放if(mode==1){TR0=!TR0;		//定时器的控制位取反}else if(mode==2){//TR0=TR0;		//定时器的控制位取反}else {mode=0;TR0=!TR0;}}if(mode==1)	 //温度上限设置{switch(key)	{case K2_ADD: 	   //加sec++;if(sec>=60)sec=0;break;case K3_DEC: 	 //减sec--;if(sec<=0)sec=59;break;}datapros();DigDisplay();	 }else if(mode==2)  //温度下限设置{switch(key)	{case K2_ADD: 	   //加min++;if(min>=60)min=0;break;case K3_DEC: 	 //减min--;if(min<=0)min=59;break;}datapros();DigDisplay();	}}
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main(void)
{	Timer0Init();  //定时器0初始化while(1){time_process();if(mode==0){datapros();DigDisplay();	}KEY_Pros();}		
}

效果展示:

 

 

 

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论