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

📄 main.c

📁 单片机时钟的例子
💻 C
字号:
//大虾电子网为大虾时钟实验板所配程序
//可以键切换显示时/分显示时钟或者秒/分秒显示
//可以键控时钟停止和运行
//电路图和产品地址http://shop.daxia.com/product.asp?id=682
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件

sbit K1= P3^2;	   //第一个按键
sbit K2= P3^3;	   //第二个按键
sbit K3= P3^4;	   //第三个按键
sbit K4= P3^5;	   //第四个按键
                   //自己可以定义更多的按键

uchar code dx516[3] _at_ 0x003b;//这是为了仿真设置的

//共33个字模:依次为16个无小数点的LED显示数码+16个有小数点的LED数码+1个全灭 (有些数码管没有小数点,其中2个小数点位置在中间的时钟点上)
//"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","0.","1.","2.","3.","4.","5.","6.","7.","8.","9.","A.","B.","C.","D.","E.","F."," "
uchar code numcode[33]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28,0x30,0x25,0xe1,0x26,0x61,0x71,0x80,0x9e,0x42,0x0a,0x1c,0x09,0x01,0x9a,0x00,0x08,0x10,0x05,0xc1,0x06,0x41,0x51,0xff};

//定义时,分,秒,分秒
uchar hour=8;//小时
uchar min=0; //分
uchar sec=0; //秒
uchar fsec=0; //分秒
uchar mode=1;//显示模式,默认为显示秒和分秒
bit run=1;   //是否计时 =1计时,=0暂停
uchar dis[4]; //4位显示缓存

void main(void)	// 主程序
{
	uchar i;

	RCAP2H =0xee; //1/400秒中断一次
	RCAP2L =0x00;	
	TR2=1;	  //启动定时器
	ET2=1;    //打开定时器2中断
	PT2=1;    //定时器2优先


	EA=1;     //打开总中断

	while(1)  //程序循环
	{
		//显示数据
		if(mode==0)	//显示小时+分钟模式
		{
			dis[3]=hour/10;	  //显示小时
			dis[2]=hour%10;
			if((fsec>50))	//每一秒中的一半灭掉和显示时钟点
			{
				dis[1]=min/10;	   //不显示时钟点
				dis[0]=min%10;				
			}
			else
			{	 
				dis[1]=min/10+16;  //显示时钟点
				dis[0]=min%10+16;	
			}
            
		}
		else if(mode==1)  //显示秒+分秒模式
		{
			dis[3]=sec/10;
			dis[2]=sec%10; 
			dis[1]=fsec/10+16; //+16把中间的时钟点同时显示出来
			dis[0]=fsec%10+16;	
		}

		//扫描开关
		 if(!K1) //显示时,分
		 {
	 		mode=0;
			while(!K1);
			for(i=0;i<255;i++);
		 }
		 if(!K2) //显示秒,分秒
		 {
			mode=1;
			while(!K2);
			for(i=0;i<255;i++);
		 }
		 if(!K3) //启动计时
		 {
	 		run=1;
			while(!K3);
			for(i=0;i<255;i++);
		 }
		 if(!K4) //停止计时
		 {
			run=0;
			while(!K4);
			for(i=0;i<255;i++);
		 }
		 
	}
}
//定时器2中断,兼LED扫描和时钟
timer2() interrupt 5    
{
	uchar code p1line[4]={0xf7,0xfb,0xfd,0xfe};	//P1扫描线,轮流用低点品扫描4条线,扫描4个数码管
	static uchar t;
	
	TF2=0;
    t++;
     //时间计时
    if(t==4)
	{	
		t=0;
		if(run)fsec++; //分秒加1
		if(fsec==100)
		{
			fsec=0;
			sec++;	  //秒加1

			if(sec==60)
			{
				sec=0;
				min++;	   //分加1
				if(min==60)
				{
					min=0;
					hour++;	 //小时加1
					if(hour==24)hour=0;
				}
			}
		}
	}

	//扫描数码管
	P1= 0xff; //这句是防止出现鬼影,
	P2=numcode[dis[t]];
    P1= p1line[t];
   
}

⌨️ 快捷键说明

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