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

📄 shifen.c

📁 单片机的四位显示及时间.单片机上电复位后,等待按键4启动定时器0 再次按键4,定时器0停止计数,进入时分初值设置状态,每按一次1键,时加一,每按一次2键,分加一
💻 C
字号:
/*单片机上电复位后,等待按键4启动定时器0;
再次按键4,定时器0停止计数,进入时分初值设置状态,每按一次1键,时加一,每按一次2键,分加一;
第三次按键4退出设置状态,重新启动定时器0*/
#include <reg51.h>
sbit P1_3=P1^3;//键1
sbit P1_2=P1^2;//键2
sbit P2_7=P2^7;//小数点位,低电平有效
sbit P2_1=P2^1;
sbit P2_4=P2^4;
bit flag=0,sign=0,hourfirst=0;//flag=1为设置状态允许外部中断0,1;flag=0退出设置状态禁止外部中断0,1
							  //sign实现一秒小数点闪一次;hourfirst实现时再次为0时仍为时分显示
unsigned char setflag=5;
unsigned char daynumber[12]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char count,second=0,minute=0,hour=0,mouth=1,day=1;
unsigned char dsplow,dsphigh;
unsigned char sel0=0X10,sel1=0X20,sel2=0X40,sel3=0X80;
unsigned char hourset=0,minuteset=0;//闹铃时分设定

void timer0() interrupt 1 using 1//定时器0的中断
{
TH0=0X70;
TL0=0X00; //重置初值
count++;
if(count==13)sign=~sign;//一秒小数点闪一次
if(count>=25)
{count=0;
	second++;
	if(second>=60)
		{second=0;
		minute++;
			if(minute>=60)
				{minute=0;
				hour++;	
					if(hour>=24)
					{hour=0;
					day++;
						if(day>=daynumber[mouth-1])
						{day=1;
						mouth++;
							if(mouth>=13)mouth=1;
						}
					}
				}
		}
	}
}

void int0() interrupt 0 using 0//外部中断0
{
	setflag++;
	if(setflag==6)setflag=0;
	switch(setflag)
	{
		case 0:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=hour;break;
		case 1:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=minute;break;
		case 2:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=mouth;break;
		case 3:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=day;break;
		case 4:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=hourset;break;
		case 5:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=minuteset;break;
		default:break;
	}
}

void int1() interrupt 2 using 2//外部中断1
{
	switch(setflag)
	{
		case 0:hour++;if(hour>=24)hour=0;dsphigh=hour;break;
		case 1:minute++;if(minute>=60)minute=0;dsplow=minute;break;
		case 2:mouth++;if(mouth>=13)mouth=1;dsphigh=mouth;break;
		case 3:day++;if(day>=daynumber[mouth-1])day=1;dsplow=day;break;
		case 4:hourset++;if(hourset>=24)hourset=0;dsphigh=hourset;break;
		case 5:minuteset++;if(minuteset>=60)minuteset=0;dsplow=minuteset;break;
		default:break;
	}
}

void delay(unsigned char t){//t ms延时
unsigned char j;
while(t--){
	for(j=120;j>0;j--){;}
	}
}

void initial()//中断初始化
{
TMOD=0x01;//设定计数模式
TH0=0X70;//设定计数初值
TL0=0X00;
ET0=1;//允许定时器0中断
EA=1;
IT0=1;//下降沿触发
IT1=1;
PX1=1;//外部中断1高优先级
}

void main()//主函数
{
initial();
P2=0X80;//灭灯
while(P1_3);
TR0=1;
for(;;)//闪烁显示时间
	{
	if(!flag)
		{
			if(!P1_2)
			{dsplow=day;dsphigh=mouth;
			}
			else if((!hourfirst)&&(hour==0))//时不为0时,分秒显示跳为时分显示
			{dsplow=second;dsphigh=minute;
			}
			else 
			{hourfirst=1;dsplow=minute;dsphigh=hour;
			}
		}

	if(!P1_3)
		{
			flag=~flag;TR0=~TR0;EX0=~EX0;EX1=~EX1;
			if(!flag){sel0=0X10;sel1=0X20;sel2=0X40;sel3=0X80;}//flag=1为设置状态允许外部中断0,1;flag=0退出设置状态禁止外部中断0,1
		}
	if(hourset==hour&&minuteset==minute){P2_1=1;P2_4=1;}//闹铃时间到红灯亮
	else{P2_1=0;P2_4=0;}

	P0=sel0|(dsphigh/10);//数码管循环选通输出
	delay(1);
	P0=sel1|(dsphigh%10);
	P2_7=sign;
	delay(1)
	P0=sel2|(dsplow/10);
	P2_7=1;
	delay(1);
	P0=sel3|(dsplow%10);
	delay(1);
	}
}

⌨️ 快捷键说明

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