可以设置时间的计时器
完整电路图:
完整代码:
/*
实验说明:实验接线: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();}
}
效果展示: