制作一个电子时钟,每一位均可调节,可加减,调节时时钟会停止计时
6个按钮 程序有注释
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
- unsigned char k=0,h=0,m=0,s=0;
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char TempData[8];
- sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
- sbit LATCH2=P2^3;// 位锁存
- /*----------延时时间T=(2*t+5)us-------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*----------延时时间T=tms-------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*----------显示子函数-------------------*/
- void Display(unsigned char FirstBit,unsigned char Num)
- {
- unsigned char i;
- for(i=0;i<Num;i++)
- {
- DataPort=0; //清空数据,防止有交替重影
- LATCH1=1; //段锁存
- LATCH1=0;
- DataPort= weima[i+FirstBit]; //取位码
- LATCH2=1; //位锁存
- LATCH2=0;
- DataPort=TempData[i]; //取显示数据,段码
- LATCH1=1; //段锁存
- LATCH1=0;
- DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
- }
- }
- /*-------------------------------------------------
- 定时器初始化子函数
- -------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD|=0x01;
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- main()
- {
- Init_Timer0();
- while(1)
- {
- if(!key1)
- {
- DelayMs(10);
- if(!key1)
- {
- while(!key1)Display(0,8);
- TR0=~TR0;
- s++;
- }
- }
- if(!key2)
- {
- DelayMs(10);
- if(!key2)
- {
- while(!key2)Display(0,8);
- TR0=~TR0;
- m++;
- }
- }
- if(!key3)
- {
- DelayMs(10);
- if(!key3)
- {
- while(!key3)Display(0,8);
- TR0=~TR0;
- h++;
- }
- }
- if(!key4)
- {
- DelayMs(10);
- if(!key4)
- {
- while(!key4)Display(0,8);
- TR0=~TR0;
- s--;
- if(s==255)
- {
- s=59;
- }
- }
- }
- if(!key5)
- {
- DelayMs(10);
- if(!key5)
- {
- while(!key5)Display(0,8);
- TR0=~TR0;
- m--;
- if(m==255)
- {
- m=59;
- }
- }
- }
- if(!key6)
- {
- DelayMs(10);
- if(!key6)
- {
- while(!key6)Display(0,8);
- TR0=~TR0;
- h--;
- if(h==255)
- {
- h=23;
- }
- }
- }
- if(k>=50)
- {k=0;s++;}
- if(s==60)
- {s=0;m++;}
- if(m==60)
- {m=0;h++;}
- if(h==24)
- h=0;
- TempData[0]=duanma[h/10];
- TempData[1]=duanma[h%10];
- TempData[2]=0x40;
- TempData[3]=duanma[m/10];
- TempData[4]=duanma[m%10];
- TempData[5]=0x40;
- TempData[6]=duanma[s/10];
- TempData[7]=duanma[s%10];
- Display(0,8);
- }
-
- }
- /*------------------------------------------------
- 定时器中断子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- k++;
- }
复制代码
所有资料51hei提供下载:
电子时钟.zip
(16.42 KB, 下载次数: 36)
|