|
Altium Designer畫的8位共陽數(shù)碼管顯示51單片機(jī)時鐘原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (30.5 KB, 下載次數(shù): 41)
下載附件
2018-10-13 15:11 上傳
0.png (61.34 KB, 下載次數(shù): 47)
下載附件
2018-10-13 15:10 上傳
0.png (11.44 KB, 下載次數(shù): 34)
下載附件
2018-10-13 15:11 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (19.95 KB, 下載次數(shù): 46)
下載附件
2018-10-13 15:10 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar sec,min,hour;//定義時、分、秒變量
- uchar counter10ms0,counter10ms1; //定義T0和T1的10ms計數(shù)變量
- uchar counter05s0;//定義0.5秒變量
- uchar KeyCounter; //定義保存功能按鍵計數(shù)值變量
- uchar OldKey; //定義保存按鍵狀態(tài)變量
- bit AddFlag,SubbFlag;//定義加、減按鍵標(biāo)志
- bit FlashFlag; //定義閃爍標(biāo)志
- sbit LED1=P1^0;
- sbit LED2=P1^1;
- sbit LED3=P1^2;
- sbit LED4=P1^3;
- uchar Disbuff[8]={0,0,10,0,0,10,0,0};//定義數(shù)碼管顯示緩沖區(qū)單元
- uchar code DisCode[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //共陽數(shù)碼管段碼,0~9及“-”“熄滅”字符的字型碼
- sbit LED=P3^4; //工作指示燈
- /****************************************
- * 延時函數(shù)Delaynms(uint dly) *
- * 延時時間 dly x 1ms 12MHz *
- ****************************************/
- void Delaynms(uint dly)
- {
- uchar i;
- while(dly--)
- for(i=0;i<123;i++);
- }
- /***************************************/
- /****************************************
- * 顯示函數(shù)Display() *
- * 功能:根據(jù)將8個數(shù)碼管顯示一遍 *
- ****************************************/
- void Display(void)
- {
- uchar i,n=0x01;
- for(i=0;i<8;i++)
- {
- P0=DisCode[Disbuff[i]]; //送段碼
- P2=~n; //開位選
- Delaynms(1); //延時
- n=n<<1; //位選移位
- P0=0xff; //段碼低電平全滅
- P2=0xff; //經(jīng)過非門后變成高電平,使得位選關(guān)閉
- }
- }
- /****************************************/
- /****************************************
- * BIN碼變換成BCD碼函數(shù)TimeDataBin2Bcd() *
- * 功能:將時、分、秒分離出十位和個位 *
- ****************************************/
- void TimeDataBin2Bcd()
- {
- Disbuff[0]=hour/10;//分離小時十位
- Disbuff[1]=hour%10;//分離小時個位
- Disbuff[3]=min/10;//分離分鐘十位
- Disbuff[4]=min%10;//分離分鐘個位
- Disbuff[6]=sec/10;//分離秒十位
- Disbuff[7]=sec%10;//分離秒個位
- }
- /***************************************/
- /****************************************
- * 讀入按鍵函數(shù)ReadKey() *
- * 功能:若有按鍵按下,返回按鍵值 *
- * 若沒有按鍵按下,返回255 *
- ****************************************/
- uchar ReadKey()
- {
- uchar Key;
- Key=P3&0xe0; //讀入按鍵值 P3&1110 0000
- if(Key!=0xe0)
- { //若有鍵按下
-
- Delaynms(10);
- Key=P3&0xe0; //重新讀入按鍵值
- if(Key!=0xe0)
- { //若有鍵按下
- if((Key!=0xe0)&&(OldKey==0xe0)) //判斷是否下降沿
- {
- OldKey=Key; //保存本次按鍵值
- return(Key); //返回按鍵值
- }
- }
- }
- OldKey=Key; //無鍵按下,保存本次按鍵值,返回255
- return(255); //不能夠刪,否則出錯
- }
- /***************************************/
- /****************************************
- * 按鍵分析函數(shù)KeyAnalysis(uchar Key) *
- * 功能:對功能鍵計數(shù) *
- * 對加、減鍵設(shè)標(biāo)志 *
- ****************************************/
- void KeyAnalysis(uchar Key)
- {
- if(Key!=255)
- { //有鍵按下
- switch(Key)
- {
- case 0x60: KeyCounter++; //功能鍵按下 0110 0000 因為85行Key=P3&0xe0; //重新讀入按鍵值
- if(KeyCounter==3)KeyCounter=0;
- break;
- case 0xa0: if(KeyCounter!=0)AddFlag=1;break; //+鍵按下 1010 0000
- case 0xc0: if(KeyCounter!=0)SubbFlag=1;break; //-鍵按下 1100 0000
- }
- }
- }
- /***************************************/
- /****************************************
- * 時間調(diào)整函數(shù)AdjTime() *
- * 功能:對分鐘、小時加、減設(shè)置 *
- * *
- ****************************************/
- void AdjTime()
- {
- if(KeyCounter==1)
- { //設(shè)置分鐘
- if(AddFlag)
- { //分鐘+設(shè)置
- AddFlag=0; //標(biāo)志位要清零 ,否則影響下次按鍵判斷
- min++;
- if(min==60)min=0;
- }
- if(SubbFlag)
- { //分鐘-設(shè)置
- SubbFlag=0; //標(biāo)志位要清零 ,否則影響下次按鍵判斷
- min--;
- if(min==255)min=59; //分鐘減到0的時候,unsigned char型的變量回到255
- }
- }
- if(KeyCounter==2)
- { //設(shè)置小時
- if(AddFlag)
- { //小時+設(shè)置
- AddFlag=0;
- hour++;
- if(hour==24)hour=0;
- }
- if(SubbFlag)
- { //小時-設(shè)置
- SubbFlag=0;
- hour--;
- if(hour==255)hour=23;
- }
- }
- }
- /***************************************/
- /****************************************
- * 閃爍控制函數(shù)FlashControl() *
- * 功能:對調(diào)整的分鐘、小時進(jìn)行熄滅設(shè)置 *
- * *
- ****************************************/
- void FlashControl()
- {
- if(FlashFlag)
- {
- if(KeyCounter==1)
- {
- Disbuff[3]=11; //DisCode[11]=0x00,數(shù)碼管滅
- Disbuff[4]=11;
- }
- if(KeyCounter==2)
- {
- Disbuff[0]=11;
- Disbuff[1]=11;
- }
- }
- }
- /******************************?????*********/
- /*void LEDFLASH(void)
- {
- LED1=~LED1;
- LED2=~LED2;
- LED3=~LED3;
- LED4=~LED4;
-
- }
- */
- void main(void)
- {
- uchar Key;
- P1=0XF0; //時分間隔的兩個LED燈亮
- TMOD=0x11; //定時器0,1都設(shè)置為工作方式一
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- ET0=1;ET1=1; //開定時器0,1的中斷
- EA=1; //開總中斷
- while(1)
- {
- Key=ReadKey(); //讀取按鍵,檢測按鍵是否按下
- KeyAnalysis(Key); //判斷哪個按鍵按下
- if(KeyCounter==0) //假如沒有按下功能鍵
- { TR0=1; //啟動定時器0,秒計數(shù)
- TR1=0;
- TimeDataBin2Bcd(); //分離變量以便后面數(shù)碼管的顯示
- }
- else
- {
- TR0=0; //關(guān)閉定時器0,
- TR1=1; //啟動定時器1
- AdjTime(); //調(diào)整時間
- TimeDataBin2Bcd(); //分離變量以便后面數(shù)碼管的顯示
- FlashControl(); //對調(diào)整的分鐘、小時進(jìn)行熄滅數(shù)碼管設(shè)置
- }
- Display(); //顯示數(shù)碼管
- }
- }
- void Timer0(void) interrupt 1
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- counter10ms0++;
-
- if(counter10ms0==50)
- {
- counter10ms0=0;
- counter05s0++;
- LED=0; //LED=P3^4; //工作指示燈亮
- if(counter05s0==2) //1s到來
- {
- counter05s0=0;
- sec++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
電子時鐘資料全.zip
(2.56 MB, 下載次數(shù): 181)
2018-10-13 09:12 上傳
點擊文件名下載附件
一套資料 下載積分: 黑幣 -5
|
|