|
本文件是單片機(jī)技術(shù)時(shí)鐘震蕩的仿真圖,是我設(shè)計(jì)所作的,需要的可以來(lái)自取
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (12.08 KB, 下載次數(shù): 87)
下載附件
2020-6-15 18:36 上傳
51hei.png (20.17 KB, 下載次數(shù): 74)
下載附件
2020-6-15 18:36 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define play P0 //數(shù)據(jù)輸出口
- sbit LSA=P1^0;
- sbit LSB=P1^1;
- sbit LSC=P1^2;
- sbit led=P2^2; //鬧鐘檢測(cè)
- sbit k1=P2^7;// 功能切換
- sbit k2=P2^6;//設(shè)置加
- sbit k3=P2^5;// 設(shè)置減
- sbit k4=P2^4; //設(shè)置位選
- sbit beet=P1^5; //蜂鳴器輸出口
- uchar y;//按鍵松開(kāi)
- uchar kai;//鬧鐘開(kāi)啟標(biāo)志
- uchar she;// 位選標(biāo)志 取值范圍0 1 2 3
- uchar t;//時(shí)間計(jì)數(shù)
- uchar num;//功能切換 取值范圍 0 1 2 。0時(shí)鐘設(shè)置,1日期設(shè)置,2鬧鐘設(shè)置
- uchar fen;
- uchar shi;
- uchar miao;
- uchar yue;
- uchar nian;
- uchar ri;
- uchar shijian[8];//用來(lái)臨時(shí)存放數(shù)據(jù)的數(shù)組 ,存放的是要顯示的內(nèi)容
- uchar shi1; //鬧鈴時(shí)
- uchar fen1; //鬧鈴分
- unsigned char code shuma[16]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07, //數(shù)碼管顯示數(shù)組0到9, - ,和學(xué)號(hào)
- 0x7f,0x6f,0x40,0x00, //8 9 10 11
- 0x40,0x40,0x40 };
- uchar brunyue[12]={31,28,31,30,31,30,31,31,30,31,30,31};
- uchar runyue[12]={31,29,31,30,31,30,31,31,30,31,30,31};
- void zhongshe();
- void qishe();
- void naoshe();
- void shezhi();
- void delay10ms(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void delay(unsigned int a) //
- {
- unsigned int b,c;
- for(c=a;c>0;c--)
- for(b=500;b>0;b--);
-
- }
- void naozhong()
- { uint a,m;
- if((shi1==shi)&&(fen1==fen)&&(kai%2))
- { for(m=20;m>0;m--)
- for(a=10;a>0;a--)
- if((k1==0)||(k2==0)||(k3==0)||(k4==0))//按任意鍵 停止鬧鈴
- { kai=0;break; }
- else
- beet=~beet;
- }
- }
- void plays() //輸出顯示數(shù)組中的值***********************************************************************************
- {
- unsigned char i;
- unsigned int j;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//選中第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//選中第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//選中第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//選中第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//選中第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//選中第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//選中第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//選中第7位
- }
- play=shuma[shijian[i]]; //顯示數(shù)組中選中的元素代表的值
- if(t>50)
- { switch(she)
- {
- case(3):
- if((i==0)||(i==1))
- play=0x00; break;
- case(2):
- if((i==3)||(i==4))
- play=0x00; break;
- case(1):
- if((i==6)||(i==7))
- play=0x00; break;
- }
- }
- j=10; //掃描間隔時(shí)間設(shè)定
- while(j--);
- play=0x00;//消隱
- }
- }
- void nao() //把鬧鐘賦值給數(shù)組
- { shijian[7]=kai; //鬧鐘開(kāi)啟標(biāo)志
- shijian[6]=11;
- shijian[5]=11;
- shijian[4]=fen1%10;
- shijian[3]=fen1/10;
- shijian[2]=10;
- shijian[1]=shi1%10;
- shijian[0]=shi1/10;
- }
- void rili() //日期賦值給數(shù)組
- { shijian[7]=ri%10;
- shijian[6]=ri/10;
- shijian[5]=10;
- shijian[4]=yue%10;
- shijian[3]=yue/10;
- shijian[2]=10;
- shijian[1]=nian%10;
- shijian[0]=nian/10;
- }
- void zhong() //電子鐘賦值給數(shù)組
- { shijian[7]=miao%10;
- shijian[6]=miao/10;
- shijian[5]=10;
- shijian[4]=fen%10;
- shijian[3]=fen/10;
- shijian[2]=10;
- shijian[1]=shi%10;
- shijian[0]=shi/10;
- }
- void xuehao() //學(xué)號(hào)賦值給數(shù)組************************************************************************
- { shijian[0]=10;
- shijian[1]=2;
- shijian[2]=3;
- shijian[3]=12;
- shijian[4]=13;
- shijian[5]=14;
- shijian[6]=2;
- shijian[7]=8;
- }
- void chushizhuangtai()//初始狀態(tài)設(shè)置 上電復(fù)位后 依次顯示學(xué)號(hào) 和制造日期************************************************************************************************
- {
- uint csj;
- for(csj=500;csj>1;csj--)
- { xuehao();
- plays();
- delay(1);
- plays();//顯示學(xué)號(hào)
- }
- for(csj=300;csj>1;csj--)
- { rili();
- plays();
- delay(1);//顯示日期
- plays();
- }
- }
- void InitTimer0(void)//開(kāi)定時(shí)器0中斷 設(shè)定10ms**************************************************************************
- {
- TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- } //*****************************************************************************************************************
- void shezhi()//在有位選信號(hào)(也就是she不等于零)的條件下,判斷k2,k3是否有鍵按下,并根據(jù)當(dāng)前所處的模式切換到對(duì)應(yīng)的處理函數(shù)
- { if((she!=0)&&((k2==0)||(k3==0))) //
- { delay10ms();
- if((she!=0)&&((k2==0)||(k3==0))) //如果 有加減鍵按下 且標(biāo)志位 she 在不在 0 狀態(tài)
- {
- switch(num)
- { case(0):
- zhongshe(); break;
- case(1):
- qishe(); break;
- case(2):
- naoshe();break;
- }
- }
- }
- }
- //*******************************************************************************************
- void main()
- {
-
- num=0;kai=1;she=0;
- fen1=1;shi1=12;
- miao=0;fen=0; shi=12;
- ri=21; yue=6; nian=16;
- chushizhuangtai();
- InitTimer0();
- while(1)
- {
- if(k1==0)
- {delay10ms();
- if(k1==0)
- {num=(num+4)%3;
- she=0;}
- led=~led;
- while(!k1) ;}
- if(k4==0)
- {delay10ms();
- if(k4==0)
- she=(she+5)%4;
- while(!k4) ;
- }
- shezhi();
- naozhong();
- plays();
-
- }
- }
- //**********************************************************************************************************************
- void Timer0Interrupt(void) interrupt 1 //作用。 1,每秒加一計(jì)數(shù)。2,處理模式轉(zhuǎn)換標(biāo)志 實(shí)現(xiàn)模式切換
- {
- TH0 = 0x0D8;
- TL0 = 0x0F0; //初值 55536 一次中段時(shí)間 10ms
- t++;
- if(t==100)
- { t=0;
- miao++;
- if(miao>59)
- { miao=0;
- fen++;
- if(fen>59)
- {
- fen=0;
- shi++;
- if(shi>23)
- {
- shi=0;
- ri++;
- if(nian%4==0)
- { if(ri>runyue[yue-1])
- { ri=1;
- yue++; }
- if(yue>12)
- { yue=1;
- nian++; }
- }
- else
- {if(ri>brunyue[yue-1])
- {
- ri=0;
- yue++;
- }
- if(yue>12)
- {
- yue=0;
- nian++ ;
- }
- }
- }
- }
- }
- }
- switch(num)
- {
- case(0):
- zhong();break; // 把時(shí)鐘的值裝入數(shù)組。
- case(1):
- rili();break;// 把日期的值裝入數(shù)組。
- case(2):
- nao();break; // 把鬧鐘的值裝入數(shù)組。
- default:
- zhong();//
- }
- }
- //***********************************************************************************************************************
- void zhongshe()//處于時(shí)鐘狀態(tài)下,當(dāng)有加減信號(hào)時(shí)的處理
- {
- switch(she)
- {
- case(1):
- miao=0;InitTimer0();break;
- case(2): // 位選信號(hào)為分
- if(k2==0)
- fen=(fen+61)%60;//如果加信號(hào),則分加一。否則減一
- else
- fen=(fen+59)%60;
- break;
- case(3): //位選信號(hào)為時(shí)
- if(k2==0)
- shi=(shi+25)%24;
- else
- shi=(shi+23)%24;
- break;
- }
- while((!k2)||(!k3)) ; //松手檢測(cè)
- }
- void naoshe() //同上
- {
- switch(she)
- {
- case(1):
- if(kai==1)
- kai=0;
- else kai=1; break;//鬧鐘的開(kāi)關(guān)
- case(2):
- if(k2==0)
- fen1=(fen1+61)%60;
- else
- fen1=(fen1+59)%60;
- break;
- case(3):
- if(k2==0)
- shi1=(shi1+25)%24;
- else
- shi1=(shi1+23)%24;
- break;
- }
- while((!k2)||(!k3)) ;
- }
- void qishe() //同上
- {
- switch(she)
- {
- case(1):
- if(k2==0)
- {
- if(nian%4==0)
- ri=(ri+runyue[yue-1]+2)%(runyue[yue-1]+1) ;
- else
- ri=(ri+brunyue[yue-1]+2)%(brunyue[yue-1]+1);
- }
-
- else
- {
- if(nian%4==0)
- ri=(ri+runyue[yue-1])%(runyue[yue-1]+1) ;
- else
- ri=(ri+brunyue[yue-1])%(brunyue[yue-1]+1);
- }
- break;
- case(2):
- if(k2==0)
- yue=(yue+14)%13;
- else
- yue=(yue+12)%13;
- break;
- case(3):
- if(k2==0)
- nian++;
- else
- nian--;
- }
- while((!k2)||(!k3)) ;
- }
復(fù)制代碼
51hei.png (5.62 KB, 下載次數(shù): 56)
下載附件
2020-6-15 18:38 上傳
所有資料51hei提供下載:
數(shù)字電路設(shè)計(jì).rar
(720.29 KB, 下載次數(shù): 77)
2020-6-15 16:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|