仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
原理: 共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。led數碼管由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。LED數碼管以發光二極管作為發光單元,顏色有單紅, 黃,藍,綠,白,黃綠等效果。單色,分段全彩管可用大樓,道路,河堤輪廓亮化,LED數碼管可均勻排布形成大面積顯示區域,可顯示圖案及文字,并可播放不同格式的視頻文件。
(僅寫所用到的主要原理,不要介紹單片機本身的特點)
(4) 電路原理圖
(5) 所用主要元器件清單
序號 名稱 規格型號 數量 備注
1 MCU STC89C51 1
2 晶振 11.0592MHz 1
3 數碼管 2位共陰數碼管 3
4 芯片 74HC595 2
5 按鍵 6*6*5 4
6 上拉電阻 10k 1
7 復位電路 10uf 1
8 電阻 5.1k 1
9 電阻 100 1
10 蜂鳴器 Buz 1
(6) 軟件框圖
單片機源程序如下:
- #include<reg51.h> //包含51單片機頭文件
- #define uchar unsigned char//把unsigned char 定義為uchar
- #define uint unsigned int//把unsigned int定義為uint
- /*定義外部按鍵接口*/
- sbit K1=P3^3; //調整
- sbit K2=P3^0; //確定
- sbit K3=P3^2; //加
- sbit K4=P3^1; //減
- sbit BUZZ=P1^7; //蜂鳴器
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf7,0XAF,0XFF}; //共陽數碼管編碼
- uchar Show_table[6];//定義顯示數組
- uchar temp_time=0,time_1s=0,time_1m=0,time_1h=0;//定義中間時間變量
- int hour_shi=0,hour_ge=0,mine_shi=0,mine_ge=0;//定義時間變量
- uchar w = 0;
- uchar mode=0;
- uchar zhengdian_flag=0; //整點報時標志
- uchar flash_time=0;
- bit flash_flag=0;
- uchar key_num=0;
- /*定時器0初始化*/
- void Time0_init()
- {
- TMOD |= 0x01; //使用模式1,16位定時器
- TH0 = (65536-50000)/256; //定時器裝入初始值50ms
- TL0 = (65536-50000)%256;//裝入定時器低八位計數值
- EA = 1; //總中斷
- ET0 = 1;//定時器0初始化
- TR0 = 1;//打開定時器
-
- }
- void Delay_ms(uint i)//1ms延時
- {
- uchar x,j;//定義兩個無符號字符型變量
- for(j=0;j<i;j++)//循環j=0,只要j<i,j就加一直到j大于i
- for(x=0;x<=148;x++);//循環x=0,只x<=0,x就減一直到x大于148
- }
- /*獨立按鍵程序*/
- void KeyRead()
- {
- static uchar key_up=1;//按鍵松開標志
- if(key_up&&(K1==0||K2==0||K3==0||K4==0))
- {
- Delay_ms(2);//去除抖動
- key_up=0;
- if(K1==0)key_num=1;
- else if(K2==0)key_num=2;
- else if(K3==0)key_num= 3;
- else if(K4==0)key_num= 4;
-
- }else if(K1==1&&K2==1&&K3==1&&K4==1)// 無按鍵按下
- {
- key_up=1;
- key_num= 0;
- }
- else
- {key_num= 0;}
- }
- void display(void)//數碼管顯示程序
- {
- static uchar step=0;
- P0 = 0xff; //關閉數碼管顯示
- switch(step++) //依次傳送數據
- {
- case 0:P2=0x01;P0 = table[Show_table[0]];
- break;
- case 1:P2=0x02;P0 = table[Show_table[1]];
- break;
- case 2:P2=0x04;P0 = table[Show_table[2]];
- break;
- case 3:P2=0x08;P0 = table[Show_table[3]];
- break;
- case 4:P2=0x10;P0 = table[Show_table[4]];
- break;
- case 5:P2=0x20;P0 = table[Show_table[5]];
- break;
- }
- if(step>5)step=0; //一共6位數碼管 ,超過了就從0 開始
- }
- //*************************************
- //主函數
- ///***********************************
- void main(void)
- {
- Time0_init(); //初始化定時器
- while(1)
- {
- KeyRead();//讀取按鍵值
- switch(key_num)
- {
- case 1: //調整按鍵
- mode++;
- if(mode>4)mode=1;
- break;
- case 2: //確定按鍵
- mode=0;
- break;
- case 3: //增加按鍵
- if(mode==1)
- {
- hour_shi++;
- if(hour_shi>2)hour_shi=0;
- }
- else if(mode==2)
- {
- hour_ge++;
- if(hour_shi<2)
- {
- if(hour_ge>9)hour_ge=0;
- }
- else
- {
- if(hour_ge>3)hour_ge=0;
- }
- }
- else if(mode==3)
- {
- mine_shi++;
- if(mine_shi>5)mine_shi=0;
- }
- else if(mode==4)
- {
- mine_ge++;
- if(mine_ge>9)mine_ge=0;
- }
- break;
- case 4: //減少按鍵
- if(mode==1)
- {
- hour_shi--;
- if(hour_shi<0)hour_shi=2;
- }
- else if(mode==2)
- {
- hour_ge--;
- if(hour_shi<2)
- {
- if(hour_ge<0)hour_ge=9;
- }
- else
- {
- if(hour_ge<0)hour_ge=3;
- }
- }
- else if(mode==3)
- {
- mine_shi--;
- if(mine_shi<0)mine_shi=5;
- }
- else if(mode==4)
- {
- mine_ge--;
- if(mine_ge<0)mine_ge=9;
- }
- break;
- }
- if(mode==0)//正常顯示模式
- {
- Show_table[0]=hour_shi;
- Show_table[1]=hour_ge;
- Show_table[2]=mine_shi;
- Show_table[3]=mine_ge;
- hour_shi=time_1h/10;
- hour_ge=time_1h%10;
- mine_shi=time_1m/10;
- mine_ge=time_1m%10;
- }
- else//設定模式
- {
- if(flash_flag)//首先亮,這里其實就是利用程序循環3000次來達到延時的效果
- {
- if(mode==1)
- {
- Show_table[3]=mine_ge;
- Show_table[mode-1]=hour_shi;
- }
- else if(mode==2)
- {
- Show_table[0]=hour_shi;
- Show_table[mode-1]=hour_ge;
- }
- else if(mode==3)
- {
- Show_table[1]=hour_ge;
- Show_table[mode-1]=mine_shi;
- }
- else if(mode==4)
- {
- Show_table[2]=mine_shi;
- Show_table[mode-1]=mine_ge;
- }
- }
- else//然后熄滅,這樣就閃爍了, 這里其實就是利用程序循環6000次來達到延時的效果
- {
- Show_table[mode-1]=18; //查數碼管表
- }
- time_1h=hour_shi*10+hour_ge;
- time_1m=mine_shi*10+mine_ge;
- }
-
- Show_table[4]=time_1s/10;
- Show_table[5]=time_1s%10;
- display();//顯示時間數據
- }
- }
- //定時器0中斷
- void time0(void)interrupt 1
- {
- static uchar temp_3s=0;
- if(mode==0)
- {
- flash_time=0;
- temp_time++;
- if(temp_time>=20)//1s=20*50ms
- {
- temp_time=0;
- time_1s++;
- if(time_1s>=60)
- {
- time_1s=0;
- time_1m++;
- if(time_1m>=60)
- {
- time_1m=0;
- time_1h++;
- BUZZ=0; //打開蜂鳴器
- zhengdian_flag=1;
- if(time_1h>=23)
- {
- time_1h=0;
- }
- }
- }
- }
- }
- flash_time++;
- if(flash_time>2)
- {
- flash_flag=~flash_flag;
- flash_time=0;
- }
- if(zhengdian_flag)
- {
- temp_3s++;
- if(temp_3s>=60)//3000MS=50*60
- {
- zhengdian_flag=0;
- temp_3s=0;
- BUZZ=1;//3S后蜂鳴器關閉
- }
- }
- else
- {
- temp_3s=0;
- }
- TH0=(65536-50000)/256;//重新裝入計數器初值高八位
- TL0=(65536-50000)%256;//重新裝入計數器初值低八位
- }
復制代碼 Keil代碼與Proteus仿真下載:
5-數碼管時鐘.zip
(249.22 KB, 下載次數: 70)
2022-4-4 18:01 上傳
點擊文件名下載附件
|