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