亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

【天天報資訊】單片機入門之數(shù)碼管定時鬧鐘(2)

2023-06-27 15:11:53 來源:愛瑞單片機

在之前的文章中我們學(xué)習(xí)了數(shù)碼管定時鬧鐘中的按鍵中斷的寫法,接下來我們需要將我們的按鍵、蜂鳴器和我們之前設(shè)計的數(shù)碼管計時器相結(jié)合起來,就可以實現(xiàn)一個數(shù)字時間現(xiàn)實的定時鬧鐘了。


(資料圖)

一、功能概述

通過按鍵來控制設(shè)定的時間,當?shù)竭_時間后進入外部中斷,蜂鳴器開始工作,實現(xiàn)定時鬧鐘的功能。時間數(shù)字在四位數(shù)碼管上進行顯示,分鐘倒計時定時鬧鐘的功能,在此基礎(chǔ)上還可以添加小時的數(shù)碼管,來對小時的時間進行設(shè)置,原理還是類似的。

二、顯示原

本設(shè)計同樣采用的AT89C51單片機來實現(xiàn)多位數(shù)碼管的控制,附帶按鍵設(shè)置時間,以及蜂鳴器鬧鐘的功能。

電路連接如下:

三、程序代碼設(shè)計

結(jié)合我們前幾章所學(xué)的數(shù)碼管以及定時器、中斷的方法來對程序進行編寫。

程序如下:

#include< reg52.h >#include< intrins.h >#define uchar unsigned char#define uint unsigned intsbit key1=P3^0;//按鍵sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit buffer=P2^3;//蜂鳴器sbit DU =P2^6;//段選sbit WE =P2^7;//位選uchar bitdata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數(shù)碼管1-8uchar segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段選0-9,-uchar dis_arr[]={10,10,10,10,10,10};//時鐘顯示數(shù)組uchar time[]={0,0,0};//時鐘 時分秒uchar time_In[]={0,0,0,0,0,0};uchar time_clk[]={0,0,0};//鬧鐘 時分秒uchar num=0;uchar mode=0;uchar keydown=0;uchar clk_state=0;uchar keyIn,keyvalue,i,temp;//矩陣鍵盤讀入void key();void init();uchar keyscan();//矩陣鍵盤掃描函數(shù)void delayms(uint x);//延時函數(shù)void display(uchar duan1,uchar duan2,uchar duan3,uchar duan4,uchar duan5,uchar duan6);void display_1(uchar wei,uchar duan);void input();void soundTime();void main(){input();init();while(1){key();if(mode==0)//時鐘    display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);else if(mode==1)//鬧鐘display(time_clk[0]/10,time_clk[0]%10,time_clk[1]/10,time_clk[1]%10,time_clk[2]/10,time_clk[2]%10);}}void init()//初始化函數(shù){P3=0xff;//給高電平TMOD=0x01;//定時器工作方式選擇1TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1; //開總中斷ET0=1;//允許定時器0中斷TR0=1;//開始計數(shù)//P1=1;}void delayms(uint x)//延時函數(shù){uint i,j;for(i=x;i >0;i--)for(j=110;j >0;j--);}void key(){while(key2==0){input();break;}if(key1==0){delayms(200);if(key1==0)//{while(!key1){TR0=0;display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}TR0=1;}{TR0=!TR0;while(!key1)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}//else if(TR0==0)TR0=1;}else if(key1==1){mode++;if(mode==2)mode=0;}}if(key3==0){delayms(200);if(key3==0){if(mode==0){time[0]=0;time[1]=0;time[2]=0;num=0;while(!key3)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}else if(mode==1){time_clk[0]=0;time_clk[1]=0;time_clk[2]=0;while(!key3)display(time_clk[0]/10,time_clk[0]%10,time_clk[1]/10,time_clk[1]%10,time_clk[2]/10,time_clk[2]%10);}}else if(key3==1){buffer=1;/*P1=1;*/}}}uchar keyscan()//矩陣鍵盤掃描函數(shù){keyvalue=99;P3=0xfe;temp=P3;   temp=temp&0xf0;//判斷是否還等于0xf0while(temp!=0xf0){delayms(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:{keyvalue=0;keydown=1;break;}case 0xde:{keyvalue=1;keydown=1;break;}case 0xbe:{keyvalue=2;keydown=1;break;}case 0x7e:{keyvalue=3;keydown=1;break;}}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;   temp=temp&0xf0;//判斷是否還等于0xf0while(temp!=0xf0){delayms(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:{keyvalue=4;keydown=1;break;}case 0xdd:{keyvalue=5;keydown=1;break;}case 0xbd:{keyvalue=6;keydown=1;break;}case 0x7d:{keyvalue=7;keydown=1;break;}}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;   temp=temp&0xf0;//判斷是否還等于0xf0while(temp!=0xf0){delayms(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:{keyvalue=8;keydown=1;break;}case 0xdb:{keyvalue=9;keydown=1;break;}case 0xbb:{keyvalue=10;keydown=1;break;}case 0x7b:{keyvalue=11;keydown=1;break;}}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;   temp=temp&0xf0;//判斷是否還等于0xf0while(temp!=0xf0){delayms(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:{keyvalue=12;keydown=1;break;}case 0xd7:{keyvalue=13;keydown=1;break;}case 0xb7:{keyvalue=14;keydown=1;break;}case 0x77:{keyvalue=15;keydown=1;break;}}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return keyvalue;}void display(uchar duan1,uchar duan2,uchar duan3,uchar duan4,uchar duan5,uchar duan6){display_1(0,duan1);delayms(1);display_1(1,duan2);delayms(1);display_1(2,10);delayms(1);display_1(3,duan3);delayms(1);display_1(4,duan4);delayms(1);display_1(5,10);delayms(1);display_1(6,duan5);delayms(1);display_1(7,duan6);delayms(1);}void display_1(uchar wei,uchar duan){DU=1;P0=segdata[duan];DU=0;P0=0xff;WE=1;P0=bitdata[wei];WE=0;P0=0x00;}void input()//輸入{EA=0;for(i=0;i< 8;i++)//重置為-便于下次使用dis_arr[i]=10;while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[0]=keyIn;time_In[0]=keyIn;if(time_In[0] >=0&&time_In[0]<=2)break;}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[1]=keyIn;time_In[1]=keyIn;if((time_In[1] >=0&&time_In[1]<=9)&&(time_In[0]*10+time_In[1])< 24)break;}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[2]=keyIn;time_In[2]=keyIn;if(time_In[2] >=0&&time_In[2]<=5)break;}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[3]=keyIn;time_In[3]=keyIn;if((time_In[3] >=0&&time_In[3]<=9)&&(time_In[2]*10+time_In[3])< 60)break;}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[4]=keyIn;time_In[4]=keyIn;if(time_In[4] >=0&&time_In[4]<=5)break;}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);keyIn=keyscan();if(keydown==1){keydown=0;dis_arr[5]=keyIn;time_In[5]=keyIn;if((time_In[5] >=0&&time_In[5]<=9)&&(time_In[4]*10+time_In[5])< 60){if(mode==0){time[0]=time_In[0]*10+time_In[1];time[1]=time_In[2]*10+time_In[3];time[2]=time_In[4]*10+time_In[5];}else if(mode==1){time_clk[0]=time_In[0]*10+time_In[1];time_clk[1]=time_In[2]*10+time_In[3];time_clk[2]=time_In[4]*10+time_In[5];}break;}}}while(1){display(dis_arr[0],dis_arr[1],dis_arr[2],dis_arr[3],dis_arr[4],dis_arr[5]);if(key3==0){delayms(10);if(key3==0){EA=1;break;}}}}void T0_time() interrupt 1//中斷函數(shù){TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==20)//循環(huán)20次為一秒{num=0;time[2]++;//秒加一if(time[2]==60)//秒到60進位{time[2]=0;//秒清零分鐘加一time[1]++;if(time[1]==60)//分鐘到60進位{time[1]=0;//分鐘清零小時加一time[0]++;  soundTime();//整點報時if(time[0]==24)//小時滿24清零time[0]=0;}}if((time[0]==time_clk[0])&&(time[1]==time_clk[1])&&(time[2]==time_clk[2])){buffer=0;/*P1=0;*/}}}void soundTime(){buffer=0;delayms(10);buffer=1;}

四、總結(jié)

到這一章我們所學(xué)習(xí)的數(shù)碼管應(yīng)用也結(jié)束了,其實并沒有想象中的復(fù)雜,數(shù)碼管從一位到多位,段碼并沒有變化,而是用不同的位碼來對每一個數(shù)碼管進行控制,在之后我們還可以使用定時器的功能來實現(xiàn)對時間的計算,后來增加了外部中斷,這使得時間可以由我們個人去通過按鍵來設(shè)定,在增加蜂鳴器就實現(xiàn)了數(shù)碼管定時鬧鐘的設(shè)計目標。接下來我們將對SHT30溫濕度傳感器進行設(shè)計。

標簽:

上一篇:PWM是如何實現(xiàn)?PWM基本原理
下一篇:最后一頁