|
51單片機(jī)8位7段數(shù)碼管時(shí)鐘
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖_20200329221408.png (19.17 KB, 下載次數(shù): 83)
下載附件
2020-3-29 22:14 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #include"intrins.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit fmq=P3^0; //蜂鳴器控制
- char table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff, 0xc6, 0xc7, 0x88,}; //共陽極數(shù)碼管編碼 “0-9”
- // 0 1 2 3 4 5 6 7 8 9 不顯示 C L A
- uchar val[8]={0,0,0,0,0,0,11,12}; //數(shù)碼管顯示緩沖區(qū)
- uint count=0; //
- char shi=0,fen=0,miao=0; //時(shí)分秒變量
- char nzshi=0,nzfen=0,nzmiao=0; //鬧鐘時(shí)分秒變量
- uchar wei=0x01,duan=0; // 控制數(shù)碼管段 和位顯示的變量
- void led() //數(shù)碼管掃描函數(shù)
- {
- P0=0Xff;
- P2=wei;
- if((duan==1)||(duan==3)) //這里是加小數(shù)點(diǎn)用的
- {
- P0=(table[val[duan]]&0x7f);
- }
- else
- {
- P0=table[val[duan]];
- }
-
- duan++;
- if(duan>7)
- duan=0;
- wei=_crol_(wei,1);
- }
- void time0init() //定時(shí)器0初始化
- {
- TMOD=0X01;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- ET0=1;
- TR0=1;
- EA=1;
- }
- uchar keytime=0; //按鍵
- uint bjtime=0; //報(bào)警計(jì)時(shí)變量
- bit sjbs=0; //按鍵A 控制時(shí)間走停的變量
- void time0() interrupt 1 // 定時(shí)器0中斷服務(wù)函數(shù)
- {
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- if(sjbs)
- {
- count++;
- }
- bjtime++;
- keytime++;
- led(); //2ms掃描一次數(shù)碼管顯示
- }
- uchar key() //按鍵掃描程序
- {
- static uchar kzt=0;
- uchar sb=25;
- switch(kzt)
- {
- case 0:
- P1=0xff;
- if(P1!=0xff)
- {
- kzt=1;
- return 25;
- }
- break;
- case 1:
- P1=0xff;
- if(P1!=0xff)
- {
- switch(P1)
- {
- case 0xfe:
- sb=1;
- break;
- case 0xfd:
- sb=2;
- break;
- case 0xfb:
- sb=3;
- break;
- case 0xf7:
- sb=4;
- break;
- case 0xef:
- sb=5;
- break;
- case 0xdf:
- sb=6;
- break;
- case 0xbf:
- sb=7;
- break;
- case 0x7f:
- sb=8;
- break;
- }
- kzt=2;
- return sb;
- }
- else
- {
- kzt=0;
- return 25;
- }
- break;
- case 2:
- P1=0xff;
- if(P1==0xff)
- {
- kzt=0;
- return 25;
- }
- break;
- }
- return 25;
- }
-
- void sj() //時(shí)分秒時(shí)間更新
- {
- if(count>499)
- {
- count=0;
- miao++;
- if(miao>59)
- {
- miao=0;
- fen++;
- if(fen>59)
- {
- fen=0;
- shi++;
- if(shi>23)
- {
- shi=0;
- }
- }
- }
-
- }
-
- }
- void main()
- {
- uchar keycode=25,zt=1;
- bit bjbs=0;
- fmq=1;
- time0init(); //初始化定時(shí)器0
- while(1)
- {
- if(keytime>9) //20ms 掃描一次按鍵
- {
- keytime=0;
- keycode=key();
- }
-
- if(((fen==0)&&(miao==0))||((shi==nzshi)&&(fen==nzfen)&&(miao==nzmiao)))
- { // 判斷整點(diǎn) 判斷是否到鬧鐘時(shí)間
- bjbs=1;
- fmq=0;
- bjtime=0;
- }
-
-
- if(bjbs) //報(bào)警處理
- {
- if(bjtime>30000)
- {
- fmq=1;
- bjbs=0;
- }
- if((keycode>1)&&(keycode<5)) //只要在鳴叫時(shí)調(diào)節(jié)就停止鳴叫
- {
- bjbs=0;
- fmq=1;
- }
- }
-
-
-
- switch(zt)
- {
- case 1: // 時(shí)鐘顯示
-
- val[0]=shi/10; //顯示數(shù)據(jù)更新
- val[1]=shi%10;
-
- val[2]=fen/10;
- val[3]=fen%10;
-
- val[4]=miao/10;
- val[5]=miao%10;
-
- val[6]=11;
- val[7]=12;
-
- if(keycode==1) //A 時(shí)間運(yùn)行與暫停
- {
- sjbs=!sjbs;
- keycode=25;
- }
- sj();
-
- if(keycode==2) //B 秒加1
- {
- miao++;
- if(miao>59)
- {
- miao=0;
- }
- keycode=25;
- }
-
- if(keycode==3)//C分 加1
- {
- fen++;
- if(fen>59)
- {
- fen=0;
- }
- keycode=25;
- }
-
- if(keycode==4)//D 時(shí)加1
- {
- shi++;
- if(shi>23)
- {
- shi=0;
- }
- keycode=25;
- }
-
- if(keycode==5) //E 進(jìn)入鬧鐘設(shè)置狀態(tài)
- {
- zt=2;
- keycode=25;
- }
-
- break;
-
-
- case 2: //鬧鐘顯示與調(diào)節(jié)
-
- sj(); //時(shí)間更新
- val[0]=nzshi/10; //顯示數(shù)據(jù)更新
- val[1]=nzshi%10;
-
- val[2]=nzfen/10;
- val[3]=nzfen%10;
-
- val[4]=nzmiao/10;
- val[5]=nzmiao%10;
-
- val[6]=13;
- val[7]=12;
- if(keycode==2) //B 鬧鐘秒加1
- {
- nzmiao++;
- if(nzmiao>59)
- {
- nzmiao=0;
- }
- keycode=25;
- }
-
- if(keycode==3) //C 鬧鐘分加1
- {
- nzfen++;
- if(nzfen>59)
- {
- nzfen=0;
- }
- keycode=25;
- }
-
- if(keycode==4) //D 鬧鐘時(shí)加1
- {
- nzshi++;
- if(nzshi>23)
- {
- nzshi=0;
- }
- keycode=25;
- }
-
- if(keycode==5) //E 進(jìn)入時(shí)鐘顯示狀態(tài)
- {
- zt=1;
- keycode=25;
- }
- break;
-
- }
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
時(shí)鐘.rar
(87.8 KB, 下載次數(shù): 44)
2020-3-29 22:12 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|