制作一個電子時鐘,每一位均可調節,可加減,調節時時鐘會停止計時
6個按鈕 程序有注釋
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QzpcVXNlcnNc5oiR5ZyoXEFwcERhdGFcUm9hbWluZ1xEaW5nVGFsa1wxNjA2MzAwMDU1X3YyXEltYWdl.png (21.71 KB, 下載次數: 75)
下載附件
2020-6-17 13:25 上傳
單片機源程序如下:
- #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.png (5.09 KB, 下載次數: 64)
下載附件
2020-6-17 17:52 上傳
所有資料51hei提供下載:
電子時鐘.zip
(16.42 KB, 下載次數: 36)
2020-6-17 13:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|