|
制作一個(gè)電子時(shí)鐘,每一位均可調(diào)節(jié),可加減,調(diào)節(jié)時(shí)時(shí)鐘會(huì)停止計(jì)時(shí)
6個(gè)按鈕 程序有注釋
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到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;// 位鎖存
- /*----------延時(shí)時(shí)間T=(2*t+5)us-------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*----------延時(shí)時(shí)間T=tms-------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*----------顯示子函數(shù)-------------------*/
- void Display(unsigned char FirstBit,unsigned char Num)
- {
- unsigned char i;
- for(i=0;i<Num;i++)
- {
- DataPort=0; //清空數(shù)據(jù),防止有交替重影
- LATCH1=1; //段鎖存
- LATCH1=0;
- DataPort= weima[i+FirstBit]; //取位碼
- LATCH2=1; //位鎖存
- LATCH2=0;
- DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
- LATCH1=1; //段鎖存
- LATCH1=0;
- DelayMs(2); // 掃描間隙延時(shí),時(shí)間太長(zhǎng)會(huì)閃爍,太短會(huì)造成重影
- }
- }
- /*-------------------------------------------------
- 定時(shí)器初始化子函數(shù)
- -------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD|=0x01;
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- 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);
- }
-
- }
- /*------------------------------------------------
- 定時(shí)器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- k++;
- }
復(fù)制代碼
所有資料51hei提供下載:
電子時(shí)鐘.zip
(16.42 KB, 下載次數(shù): 36)
2020-6-17 13:24 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|