|
一個(gè)簡(jiǎn)單的四位數(shù)碼管的時(shí)鐘,可以調(diào)節(jié)、暫停、清零時(shí)間,斷電保存并且在設(shè)定的時(shí)間內(nèi)有流水燈亮起。(附有程序和接線圖)
如果有哪里做得不好的還請(qǐng)大家多指教。
0.png (440.27 KB, 下載次數(shù): 75)
下載附件
2017-6-8 16:26 上傳
0.png (527.29 KB, 下載次數(shù): 53)
下載附件
2017-6-8 16:25 上傳
0.png (386.16 KB, 下載次數(shù): 68)
下載附件
2017-6-8 16:26 上傳
單片機(jī)源程序如下:
- /*********************************************************************
- 簡(jiǎn)易時(shí)鐘: 1. 四位數(shù)碼管顯示(分秒計(jì)時(shí))。
- 2. 每到30~40秒時(shí)有流水燈亮起。
- 3. 可斷電保存
- 4. 按鍵1——暫停
- 按鍵2——清零
- 按鍵3——加10秒
- 按鍵4——減10秒
- 按鍵5——加10分
- 按鍵6——減10分
- *********************************************************************/
- #include<reg51.h>
- #include"i2c.h"
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char m=0;
- uchar z=0;
- sbit key1=P1^0; //定義各按鍵對(duì)應(yīng)的IO口
- sbit key2=P1^1 ;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 i;
- uchar display2[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd }; //用于流水燈
- uint counter=0;
- u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
- 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,};// 段選
- u8 smgduan1[16]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //百位的段選
- u8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位選
- u8 a[4];//保存時(shí)鐘的數(shù)據(jù)
- u8 sec,min;
- void delay(u16 i) //延遲函數(shù)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函數(shù)功能 : 往24c02的一個(gè)地址寫入一個(gè)數(shù)據(jù)
- *******************************************************************************/
- void At24c02Write(unsigned char addr,unsigned char dat) //把dat的值存放到addr地址上
- {
- I2C_Start();
- I2C_SendByte(0xa0, 1);//發(fā)送寫器件地址
- I2C_SendByte(addr, 1);//發(fā)送要寫入內(nèi)存地址
- I2C_SendByte(dat, 0); //發(fā)送數(shù)據(jù)
- I2C_Stop();
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : unsigned char At24c02Read(unsigned char addr)
- * 函數(shù)功能 : 讀取24c02的一個(gè)地址的一個(gè)數(shù)據(jù)
- *******************************************************************************/
- unsigned char At24c02Read(unsigned char addr)
- {
- unsigned char sec;
- I2C_Start();
- I2C_SendByte(0xa0, 1); //發(fā)送寫器件地址
- I2C_SendByte(addr, 1); //發(fā)送要讀取的地址
- I2C_Start();
- I2C_SendByte(0xa1, 1); //發(fā)送讀器件地址
- sec=I2C_ReadByte(); //讀取數(shù)據(jù)
- I2C_Stop();
- return sec;
- }
- /***********************************
- 顯示函數(shù)
- ************************************/
- void display()
- {
- a[0]=smgduan[sec%10];
- a[1]=smgduan[sec/10];
- a[2]=smgduan1[min%10];
- a[3]=smgduan[min/10];
- for(i=0;i<4;i++)
- {
- P0=a[i];
- P2=smgwei[4-i];
- delay(300); //不同的延時(shí)時(shí)間對(duì)數(shù)碼管顯示亮度會(huì)產(chǎn)生很大的影響,時(shí)間越短影響越大
- }
- }
- initial() //定時(shí)器0初始化
- { TMOD=0x01; //選擇定時(shí)器工作模式
- TH0=55536/256; //設(shè)置定時(shí)初值
- TL0=55536%256;
- EA=1;
- ET0=1;
- TR0=1; }
- void time1init()
- { //定時(shí)器1初始化
- TMOD=0x01;
- TL1 = 0xCB;
- TH1 = 0xF3;
- EA=1; //總中斷
- ET1=1; //中斷允許開(kāi)關(guān)
- TR1=1; //定時(shí)器開(kāi)關(guān)
- }
- /***********************
- 按鍵掃描函數(shù)
- ************************/
- void keyscan()
- {
- delay(200);
- if(key2==0) //清零
- {
- delay(200);
- min=0;
- sec=0;
- while (!key2);}
- if(key1==0) //暫停
- {
- delay(200);
- while (!key1);
- TR1=~TR1; //停止或啟動(dòng)定時(shí)器1
- }
- if(key3==0) //增加10s,若此時(shí)秒大于50則在增加后進(jìn)min進(jìn)一,sec照量改變
- {
- delay(200);
- if(sec<=49)
- sec +=10;
- else
- {min+=1;
- sec-=50;}
- while(!key3);
- }
- if(key5==0) //增加10m
- {
- delay(200);
- min+=10;
- while(!key5);}
- if(min>=60) //min滿60后全部歸零
- {delay(200);
- min=0;
- sec=0;
- while(!key5);}
- delay(200);
- if(key6==0) //減少10m,若此時(shí)時(shí)間少于10m,則時(shí)間歸零
- {
- delay(200);
- if(min>=10)
- {
- min-=10;
- while(!key6);}
- else
- {delay(200);
- min=0 ;
- sec=0;
- while(!key6);}
- }
- if(key4==0) //減少10秒
- {
- delay(200);
- if(sec>=10)
- {delay(200);
- sec-=10;
- while(!key4);
- }
- else if(min>=1&&sec<=10)
- {delay(200);
- min-=1;
- sec+=50;
- while(!key4);
- }
- else if(min==0&&sec<=10) //時(shí)間少于10s的在按下key4后歸零
- {delay(200);
- min=0;
- sec=0;
- while(!key4);
- }
- }
- }
- /**********************
- 主函數(shù)
- ***********************/
- void main()
- {
- if(m==0) //斷電后讀數(shù)
- { sec=At24c02Read(1);
- min=At24c02Read(2);
- }
- time1init(); //調(diào)用各種子函數(shù)
- while(1)
- { At24c02Write(1,sec);
- keyscan();
- display();
- initial();
- }
- }
-
- void T0_int () interrupt 1 //定時(shí)器0控制流水燈
- { TR0=0;
- ET0=0;
- TH0=55536/256; //設(shè)置初值
- TL0=55536%256;
- if(sec>=30&&sec<=40) //在30s~40s時(shí)流水燈亮起
- {
- if(z<14)
- { counter++;
- if(counter==30) //定時(shí)控制LED燈的改變
- { z++;
- counter=0;
- }
- P3=display2[z]; }
- if(z==14)
- { P3=0xff;
- z=0; }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
時(shí)鐘.zip
(526.98 KB, 下載次數(shù): 28)
2017-6-8 05:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|