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

📄 timer.c

📁 带温度显示的电子钟
💻 C
字号:
/*---------------------------------------------------------------
井威改了	
说明:一个可设定时间的时钟,外接12MHZ的晶振
 4个button用来调节时间的
 button0 小时加1
 button1 小时减1
 button2 分钟加1
 button3 分钟减1
 hs 小时十位
 hg 小时个位
 fs 分钟十位
 fg 分钟个位
 ms 秒钟十位
 mg 秒钟个位
 初始化时间为00:00:00
---------------------------------*/		
#include <reg51.h>
#include <ds18b20.h>

#define uint unsigned int
#define uchar unsigned char
/*七段共阳管显示定义*/ 
uchar code SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//初始化变量
uchar hs=0,hg=0,fs=0,fg=0,ms=0,mg=0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_7=P1^7;

void delay(uchar k);		    //延时子程序
void time_pro();				//时间处理子程序
void display();					//显示子程序

//延时k ms的子程序

void delay(uchar k)
	{
		unsigned char j;
		while((k--)!=0)
			{
				for(j=0;j<125;j++)
					{;}
			}
	}				 
	
void time_pro(void)
	{
		
		if(mg==10)			//秒钟设为60进制
			mg=0,ms++;
		if(ms==6)
			ms=0,fg++;
		if(fg==10)			//分钟设为60进制
			fg=0,fs++;
		if(fs==6)
			fs=0,hg++;
		if(hs!=2&&hg==10)	//时钟设为24进制
			hg=0,hs++;
		if(hs==2&&hg==4)
			hg=0,hs=0;
	}
	
void display(void)
	{
				P2=0x01;			
					P0=SEG7[hs];	//显示小时的十位
					delay(4);
				P2=0x02;
					P0=SEG7[hg];	//显示小时的个位
					delay(4);
				P2=0x4;
					P0=SEG7[fs];	//显示分钟的十位
					delay(4);
				P2=0x08;
					P0=SEG7[fg];	//显示分钟的个位
					delay(4);
				P2=0x10;
					P0=SEG7[ms];	//显示秒钟的十位
					delay(4);
				P2=0x20;
					P0=SEG7[mg];	//显示秒钟的个位
					delay(4);
//每次显示的延时4ms,这样可以保证动态扫描6个LED
/*本来显示的位段码应是从0x01到0x20的,但是这样设置的话,在P0显示
的顺序就向右移了一位,在其他IO口就不会哦,不知道是什么原因,
希望有人可以告诉我,Email:tian53169@163.com
为了在P0口中按正确的顺序显示,我把位段码向右移了一位,就是现在的顺序了
*/
						
	}
	
void timer0(void) interrupt 1 using 1		//定时器0方式1,50ms中断一次
	{

		P1_7=!P1_7;				//当P_7=1启动T/C1的中断
		TH0=(65536-50000)/256;
		TL0=(65536-50000)%256;

	}

void timer1(void) interrupt 3 using 2		//计数器1方式2,1s中断一次
	{
		mg++;			//秒钟加1
	}
	

void button0(void)	//按键0的子程序
	{
		if(P1_0==1)
			{
				delay(50);	//延时50ms去抖动,再扫描
				if(P1_0==1)
					hg++;
			}
	}

void button1(void)	//按键1的子程序
	{
		if(P1_1==1)
			{
				delay(50);
				if(P1_1==1)
					{
						if(hs==0&&hg==0)	//为00时减1为23
							hs=2,hg=3;
						else if(hg==0)
									hs--,hg=9;
								else
									hg--;
					 }
			}
	}

void button2(void)	//按键2的子程序
	{
		if(P1_2==1)
			{
				delay(50);
				if(P1_2==1)
					fg++;
			}
	}

void button3(void)	//按键3的子程序
	{
		if(P1_3==1)
			{
				delay(50);
				if(P1_3==1)
					{
						if(fs==0&&fg==0)		//当为00时减1为59
							fs=5,fg=9;
						else if(fg==0)
									fs--,fg=9;
								else
									fg--;
					 }
			}
	}

void main(void)
	{
		P1_7=1;
		P1=0x00;								//初始化p1口,全设为0
		TMOD=0x61;							//time1为计数器,方式2,time0为定时器,方式1
		TH0=(65536-50000)/256;	//预置计数初值
		TL0=(65536-50000)%256;
		TH1=256-10;
		TL1=256-10;
		EA=1;										//开cpu中断
		ET0=1;									//T/C0开中断
		ET1=1;									//T/C1开中断
		TR0=1;									//启动T/C0开始计时
		TR1=1;									//启动T/C0开始计时
		do
			{
				
				button0();	//扫描按键0
				button1();	//扫描按键1
				button2();	//扫描按键2
				button3();	//扫描按键3
				time_pro();	//时间处理
				display();	//显示时间	

			} 
		while(1);
				
	}
									

⌨️ 快捷键说明

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