久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
紅外遙控單片機(jī)數(shù)碼管時(shí)鐘制作
[打印本頁]
作者:
dzdiy
時(shí)間:
2015-4-11 22:35
標(biāo)題:
紅外遙控單片機(jī)數(shù)碼管時(shí)鐘制作
初學(xué)單片機(jī)的菜鳥們,都很想自己制作一款單片機(jī)電子鐘,放在自己的電腦桌上,展現(xiàn)一下學(xué)習(xí)單片機(jī)的成果,現(xiàn)在就來講一講制作這款遙控單片機(jī)數(shù)碼管時(shí)鐘的過程。單片機(jī)采用STC89C52RC單片機(jī),時(shí)鐘芯片采用DS1302控時(shí),18B20采集溫度,紅外遙控(通用電視機(jī)頂盒遙控器),萬年歷顯示,一路鬧鐘,自動(dòng)/手動(dòng)切換顯示,超低功耗掉電工作模式(適合電池供電),擁有備用電源掉電不掉時(shí)。數(shù)碼管經(jīng)消影處理,亮度顯示均勻,兩個(gè)二位一體數(shù)碼管是互相倒過來安裝的,從而讓兩個(gè)小數(shù)點(diǎn)在中間形成一個(gè)冒號(hào)。完整程序下載:
遙控單片機(jī)數(shù)碼管時(shí)鐘程序(無鬧鐘版).rar
(47.93 KB, 下載次數(shù): 292)
2015-4-11 22:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
測(cè)量溫度時(shí)的情況:
制作一款單片機(jī)電子鐘需要那些元器件呢?請(qǐng)看下圖,所需要的元件名稱、外形及數(shù)量都在圖中。
數(shù)碼管的選擇,本作品要選用的是二位一體共陽極0.56寸數(shù)碼管,下圖有兩種二位一體共陽極數(shù)碼管,但左邊的共有18個(gè)引腳,右邊的只有10個(gè),為了方便布線,我們選擇右邊的10引腳哪種數(shù)碼管。數(shù)碼管的引腳,本作品將兩個(gè)數(shù)碼管相倒安裝,所以其引腳順序也不一樣了,請(qǐng)對(duì)照下面兩幅圖片,安裝時(shí)看清認(rèn)準(zhǔn)。
這里就不給出電原理圖,而直接給出實(shí)物連接圖,下面給出的圖,布的是雙層板,新手們先從單層的練起,然后再縮小布局,采用雙層板。圖中藍(lán)色線表示洞洞板的布線,紅色線表示頂層線。安裝時(shí)整板是根據(jù)洞洞板來布局的,焊接時(shí),紅線作為飛線來布,圖中的Z1表示接線端子,H1是一體化紅外接受頭,數(shù)碼管一定是共陽極數(shù)碼管,焊接時(shí)先焊飛線,再焊元件。數(shù)碼管的四角都有突起,所以放在洞洞板上與板面之間會(huì)有縫隙,可以將飛線隱藏在數(shù)碼管的下面。本作品中的DS1302沒有裝備用電池。本程序加入了自動(dòng)軟件校時(shí),但由于硬件本身,每個(gè)人做出來的時(shí)間誤差都不一樣,只要修改校時(shí)數(shù)據(jù)就可以了,只要對(duì)時(shí)準(zhǔn)確,天誤差一般都可調(diào)整到小于一秒。
下面說一下遙控器的用法,是不是很熟悉啊,電視機(jī)頂盒的遙控器......
電源鍵:進(jìn)入/退出待機(jī)狀態(tài),待機(jī)時(shí)第一個(gè)小數(shù)點(diǎn)閃爍
待機(jī)鍵:開啟/關(guān)閉掉電模式
聲道鍵:切換自動(dòng)/手動(dòng)顯示
確認(rèn)鍵:手動(dòng)切換顯示界面
電視鍵:時(shí)間小時(shí)/月加一
點(diǎn)播鍵:時(shí)間小時(shí)/月減一
廣播鍵:時(shí)間分鐘/年/日加一
資訊鍵:時(shí)間分鐘/年/日減一
調(diào)整方法:在各自的顯示界面,按加一或減一鍵即可調(diào)整時(shí)間/年份/日月
制作遙控單片機(jī)數(shù)碼管時(shí)鐘的注意事項(xiàng):
1、先說一下數(shù)碼管斷碼的問題,大家可以看到,一共用了兩個(gè)二位一體的數(shù)碼管,第一個(gè)是正放的,第二個(gè)是反放的,所以兩個(gè)數(shù)碼管的引腳順序是不一樣的,再有就是根據(jù)硬件來接線的,為了方便走線,所以數(shù)碼管的段碼引腳和P0口的連接不是按照a,b,c,d,e,f,g,dp的順序來的,所以大家可能會(huì)覺得程序里的數(shù)碼管段碼數(shù)組會(huì)很奇怪,只要大家自己根據(jù)自己的接法改一下就好了。
2、硬件布局方面,由于都是沒有錢的學(xué)生,那種專門的印制的電路板我們是做不起的,但是大家都應(yīng)該有洞洞板(萬用板)。洞洞板是個(gè)好東西,在洞洞板上做東西能極大的提高我們硬件布局和接線的能力,要盡量少使用飛線,元器件的擺放要合理,比如說晶振與芯片的連接不能太遠(yuǎn),18B20溫度傳感器要遠(yuǎn)離單片機(jī),數(shù)碼管等會(huì)發(fā)熱的元器件,不然就不準(zhǔn)了......
3、軟件方面,理論上說,軟件是萬能的,但有時(shí)候一個(gè)復(fù)雜的軟件所完成的工作只需幾個(gè)簡(jiǎn)單的硬件就能完成,我們?cè)诳紤]成本的基礎(chǔ)上最好還是選擇硬件,畢竟現(xiàn)在很多的電子元件都很便宜,因?yàn)閺?fù)雜的軟件會(huì)增加CPU的負(fù)擔(dān)且降低系統(tǒng)工作的穩(wěn)定性。當(dāng)然,反之亦然......
4、關(guān)于DS1302發(fā)熱的問題,可能很多朋友都遇到過DS1302發(fā)熱的問題,首先請(qǐng)查看你的DS1302是不是1108批次的貨(芯片上面有),這個(gè)批次的貨有缺陷,一般情況下?lián)Q幾個(gè)1302會(huì)好的。再有試著將VCC1和VCC2調(diào)換這接一下試試。如果再不行,請(qǐng)檢查程序。
5、由于程序及電路圖這里不好貼出來,需要的愛好者可以自己下載
遙控單片機(jī)數(shù)碼管時(shí)鐘資料來源于網(wǎng)絡(luò),這里得感謝一葉知秋無私提供
源程序:1.頭文件DS18B20_3.H:
sbit DQ = P1^0; // 定義DQ引腳為P2.3
/******************************* 延時(shí)函數(shù) ********************************
* 功能:在11.059MHz的晶振條件下調(diào)用本函數(shù)需要24μs ,然后每次計(jì)數(shù)需16μ
**************************************************************************/
void DS18_delay(int useconds) {
int s;
for (s=0; s<useconds;s++);
}
/******************************* 復(fù)位函數(shù) *******************************
* 功能:完成單總線的復(fù)位操作。
* 復(fù)位時(shí)間為480μs,因此延時(shí)時(shí)間為(480-24)/16 = 28.5,取29μs
* 經(jīng)過70μs之后檢測(cè)存在脈沖,因此延時(shí)時(shí)間為(70-24)/16 = 2.875,取3μs
**************************************************************************/
unsigned char ow_reset(void) {
unsigned char presence;
DQ = 0; // 將 DQ 線拉低
DS18_delay(29); // 保持 480μs
DQ = 1; // DQ返回高電平
DS18_delay(3); // 等待存在脈沖
presence = DQ; // 獲得存在信號(hào)
DS18_delay(25); // 等待時(shí)間隙結(jié)束
return(presence); // 返回存在信號(hào),0 = 器件存在, 1 = 無器件
}
/****************************** 位寫入函數(shù) *******************************
* 功能:向單總線寫入1位值:bitval
*************************************************************************/
void write_bit(char bitval) {
DQ = 0; // 將DQ 拉低開始寫時(shí)間隙
if(bitval==1) DQ =1; // 如果寫1,DQ 返回高電平
DS18_delay(5); // 在時(shí)間隙內(nèi)保持電平值,
DQ = 1; // DS18_delay函數(shù)每次循環(huán)延時(shí)16μs,因此DS18_delay(5) = 104μs
}
/**************************** 字節(jié)寫入函數(shù) *******************************
* 功能:向單總線寫入一個(gè)字節(jié)值:val
*************************************************************************/
void ds18write_byte(char val) {
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) { // 寫入字節(jié), 每次寫入一位
temp = val>>i;
temp &= 0x01;
write_bit(temp);
}
DS18_delay(5);
}
/**************************** 位讀取函數(shù) ********************************
* 功能:從單總線上讀取一位信號(hào),所需延時(shí)時(shí)間為15μs,因此無法調(diào)用前面定義
* 的DS18_delay()函數(shù),而采用一個(gè)for()循環(huán)來實(shí)現(xiàn)延時(shí)。
* ***********************************************************************/
unsigned char read_bit(void) {
unsigned char i;
DQ = 0; //將DQ 拉低開始讀時(shí)間隙
DQ = 1; // then return high
for (i=0; i<3; i++); // 延時(shí)15μs
return(DQ); // 返回 DQ 線上的電平值
}
/**************************** 字節(jié)讀取函數(shù) *******************************
* 功能:從單總線讀取一個(gè)字節(jié)的值
*************************************************************************/
unsigned char DSread_byte(void) {
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++) { // 讀取字節(jié),每次讀取一個(gè)字節(jié)
if(read_bit()) value|=0x01<<i; // 然后將其左移
DS18_delay(6);
}
return(value);
}
/******************************* 讀取溫度函數(shù) *****************************
* 功能:如果單總線節(jié)點(diǎn)上只有一個(gè)器件則可以直接掉用本函數(shù)。如果節(jié)點(diǎn)上有多個(gè)器
* 件,為了避免數(shù)據(jù)沖突,應(yīng)使用Match ROM函數(shù)來選中特定器件。
* 注: 本函數(shù)是根據(jù)DS1820的溫度數(shù)據(jù)格式編寫的,若用于DS18B20,必須根據(jù)
* DS18B20的溫度數(shù)據(jù)格式作適當(dāng)修改。
**************************************************************************/unsigned
int ReadTemperature(void) {
unsigned char get[10];
unsigned char temp_lsb,temp_msb;
unsigned int t;
unsigned char k;
ow_reset();
ds18write_byte(0xCC); // 跳過 ROM
ds18write_byte(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
DS18_delay(5);
ow_reset();
ds18write_byte(0xCC); // 跳過 ROM
ds18write_byte(0xBE); // 讀暫存器
for (k=0;k<2;k++){get[k]=DSread_byte();}
temp_msb = get[1]; // Sign byte + lsbit
temp_lsb = get[0]; // Temp data plus lsb
t=temp_msb*256+temp_lsb;
t=t&0x0ff0;
if(t<0xff&&t>0xf0)
t=(-1)*t;
return t>>4;
//temp_f = (((int)temp_c)* 9)/5 + 32;
// 輸出華氏溫度值
}
復(fù)制代碼
2.主程序:
/**********************************WAYNE*********************************/
#include<reg52.h>
#include<intrins.h>
#include"DS18B20_3.H" //18B20溫度傳感器頭文件,18B20的服務(wù)程序都在這里
#define uchar unsigned char
#define uint unsigned int
unsigned int distemp=8; //紅外接收返回值
unsigned char IRCOM[7];
unsigned char temp;
unsigned char sec, min, hour, day, month, year;
unsigned char aa=0; //遙控器中間變量
unsigned char bb=1; //顯示界面中間變量
unsigned char cc=0; //自動(dòng)切換中間變量
unsigned char dd=0; //掉電模式中間變量
unsigned char ee=0;
unsigned char flag;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管段碼
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit T_CLK = P3^5; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
sbit T_IO = P3^6; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
sbit T_RST = P3^7; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳
sbit Y1=P2^6; //第一位數(shù)碼管共陽極引腳
sbit Y2=P2^3; //第二位數(shù)碼管共陽極引腳
sbit Y3=P2^1; //第三位數(shù)碼管共陽極引腳
sbit Y4=P2^0; //第四位數(shù)碼管共陽極引腳
sbit led=P0^7; //數(shù)碼管小數(shù)點(diǎn)陰極引腳
sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線與單片機(jī)引腳之間的定義
/*********************************延時(shí)函數(shù)**************************************/
void Delay_1ms(uint i) //1ms延時(shí)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void delay1(unsigned char x) //延時(shí)函數(shù)x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/**********************************往DS1302寫入1Byte數(shù)據(jù)*************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
T_RST = 1;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/******************************從DS1302讀取1Byte數(shù)據(jù)*****************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
T_RST = 1;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
T_IO=1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************往DS1302寫入數(shù)據(jù)****************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); // 寫地址
_nop_();
_nop_();
v_RTInputByte(ucDa); // 寫1Byte數(shù)據(jù)
T_CLK = 1;
T_RST = 0;
}
/**********************************讀取DS1302某地址的數(shù)據(jù)*************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); //寫地址,命令
_nop_();
_nop_();
ucDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù)
T_CLK = 1;
T_RST = 0;
return(ucDa);
}
/*********************************DEC碼轉(zhuǎn)換為BCD碼**************************************/
uchar dectobcd(uchar dec)
{
uchar bcd;
bcd = 0;
while(dec >= 10)
{
dec -= 10;
bcd++;
}
bcd <<= 4;
bcd |= dec;
return bcd;
}
/*******************************BCD碼轉(zhuǎn)換為DEC碼****************************************/
uchar bcdtodec(uchar bcd)
{
uchar data1;
data1 = bcd & 0x0f; //取BCD低4位
bcd = bcd & 0x70; //剔除BCD的最高位和低4位。
data1 += bcd >> 1;
data1 += bcd >> 3; //用位移代替乘法運(yùn)算
return data1;
}
/*********************************往DS1302中寫入數(shù)據(jù)**************************************/
void Write_DS1302Init(void)
{
v_W1302(0x8e,0x00); //屏蔽一下語句,則掉電走時(shí)有效;屏蔽則掉電走時(shí)失效,且每次上電后顯示12:00(時(shí))/2012(年)/1(月)1(日)
v_W1302(0x80,0x00); //寫入秒
v_W1302(0x82,0x00); //寫入分
v_W1302(0x84,0x12); //寫入小時(shí)
v_W1302(0x86,0x01); //寫入日
v_W1302(0x88,0x01); //寫入月
v_W1302(0x8a,0x00); //寫入星期
v_W1302(0x8c,0x12); //寫入年
v_W1302(0x8e,0x80);
}
/*********************************數(shù)碼管位選碼**************************************/
void Y_1() //選通第一位數(shù)碼管
{
Y1=0;
Y2=1;
Y3=1;
Y4=1;
}
void Y_2() //選通第二位數(shù)碼管
{
Y1=1;
Y2=0;
Y3=1;
Y4=1;
}
void Y_3() //選通第三位數(shù)碼管
{
Y1=1;
Y2=1;
Y3=0;
Y4=1;
}
void Y_4() //選通第四位數(shù)碼管
{
Y1=1;
Y2=1;
Y3=1;
Y4=0;
}
void Y_5() //切斷所有數(shù)碼管,用于數(shù)碼管消隱
{
Y1=1;
Y2=1;
Y3=1;
Y4=1;
}
/*******************************顯示程序****************************************/
void Run_DS1302(void)
{
v_W1302(0x8f, 0x00);
sec = bcdtodec(uc_R1302(0x81)); //讀出DS1302中的秒
min = bcdtodec(uc_R1302(0x83)); //讀出DS1302中的分
hour = bcdtodec(uc_R1302(0x85)); //讀出DS1302中的小時(shí)
day = bcdtodec(uc_R1302(0x87)); //讀出DS1302中的日
month = bcdtodec(uc_R1302(0x89)); //讀出DS1302中的月
year = bcdtodec(uc_R1302(0x8d)); //讀出DS1302中的年
v_W1302(0x8f,0x80);
if(distemp == 0)
{ distemp = 8;
aa++;
}
if(distemp ==7)
{ distemp = 8;
ee++;
}
if(ee == 2)
ee=0;
if(aa==4) //判斷顯示數(shù)據(jù)
aa=0;
if(aa == 0)
{
bb = 1; //顯示時(shí)間
}
if(aa == 1)
{
bb = 2; //顯示溫度
}
if(aa == 2)
{
bb = 3; //顯示年份
}
if(aa == 3)
{
bb = 4; //顯示日期
}
if(ee == 1)
bb = 5;
if(bb == 1) //時(shí)間顯示界面
{ if(hour / 10 % 10!=0) //十位為0則不顯示
{P1 = ~table[hour / 10 % 10]; //顯示小時(shí)的十位數(shù)據(jù)
led=1;
Y_1(); //選通第一位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
P1 = ~table[hour % 10]; //顯示小時(shí)的個(gè)位數(shù)據(jù)
if(sec%2==0) //判斷是否秒閃爍
led=1;
else led=0;
Y_2(); //選通第二位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~table[min / 10 % 10]; //顯示分鐘的十位數(shù)據(jù)
if(sec%2==0) //判斷是否秒閃爍
led=1;
else led=0;
Y_3(); //選通第三位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~table[min % 10]; //顯示分鐘的個(gè)位數(shù)據(jù)
led=1;
Y_4(); //選通第四位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
if(bb == 2) //溫度顯示界面
{
P1 = ~table[(flag-1) / 10 % 10]; //顯示溫度的十位數(shù)據(jù)
led=1;
Y_2(); //選通第二位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~table[(flag-1) % 10]; //顯示溫度的個(gè)位數(shù)據(jù)
led=1;
Y_3(); //選通第三位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~0x58; //顯示攝氏溫度標(biāo)志
led=0;
Y_4(); //選通第四位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
if(bb == 3) //年份顯示界面
{
P1 = ~0x6e; //顯示年份千位數(shù)據(jù),默認(rèn)為2
led=1;
Y_1(); //選通第一位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~0x77; //顯示年份百位數(shù)據(jù),默認(rèn)為0
led=1;
Y_2(); //選通第二位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~table[year / 10 % 10]; //顯示年份十位數(shù)據(jù)
led=1;
Y_3(); //選通第三位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
P1 = ~table[year % 10]; //顯示年份個(gè)位數(shù)據(jù)
led=1;
Y_4(); //選通第四位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
if(bb == 4) //月日顯示界面
{ if(month / 10 % 10!=0) //十位為0則不顯示
{P1 = ~table[month / 10 % 10]; //顯示月十位數(shù)據(jù)
led=1;
Y_1(); //選通第一位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
P1 = ~table[month % 10]; //顯示月個(gè)位數(shù)據(jù)
led=0;
Y_2(); //選通第二位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
if(day / 10 % 10!=0) //十位為0則不顯示
{P1 = ~table[day / 10 % 10]; //顯示日十位數(shù)據(jù)
led=1;
Y_3(); //選通第三位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
P1 = ~table[day % 10]; //顯示日個(gè)位數(shù)據(jù)
led=1;
Y_4(); //選通第四位數(shù)碼管
Delay_1ms(1); //短暫停留
P1 = 0xff; //數(shù)碼管消隱
led=1;
Y_5(); //切斷所有數(shù)碼管
}
if(bb == 5)
{
P1=0xff;
if(sec%2==0) //判斷是否秒閃爍
led=1;
else led=0;
Y_1(); //選通第四位數(shù)碼管
Delay_1ms(1); //短暫停留
}
}
/**********************************自動(dòng)切換程序*************************************/
void zdqh()
{
if(distemp==6)
{distemp=8;
cc++;
}
if(cc==2) //切換為手動(dòng)顯示
cc=0;
if(cc==1) //切換為自動(dòng)循環(huán)顯示
{
if(sec%10==0) //每10秒內(nèi),前7秒顯示時(shí)間界面
aa = 0;
if(sec==7||sec==37) //7秒和37秒切換為溫度顯示
aa = 1;
if(sec==17||sec==47) //17秒和47秒切換為年份顯示
aa = 2;
if(sec==27||sec==57) //27秒和57秒切換為月日顯示
aa = 3;
}
}
/*********************************調(diào)節(jié)程序**************************************/
void tj()
{
if(distemp == 1) //判斷按下的鍵值
{distemp=8; //返回值回位
if(bb==1) //判斷當(dāng)前顯示界面
{
hour++; //小時(shí)加一調(diào)節(jié)
if(hour==24) //限制小時(shí)數(shù)據(jù)在0~23之間
hour=0;
temp=dectobcd(hour); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x84,temp); //寫入小時(shí)數(shù)據(jù)
v_W1302(0x80,0x00);
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
if(bb==4) //判斷當(dāng)前顯示界面
{
month++; //月加一調(diào)節(jié)
if(month==13) //限制月數(shù)據(jù)在1~12之間
month=1;
temp=dectobcd(month); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x88,temp); //寫入月數(shù)據(jù)
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
}
if(distemp == 2) //判斷按下的鍵值
{distemp=8; //返回值回位
if(bb==1) //判斷當(dāng)前顯示界面
{
min++;//分鐘加一調(diào)節(jié)
if(min==60)//限制分鐘數(shù)據(jù)在0~59之間
min=0;
temp=dectobcd(min);//將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00);//禁止寫保護(hù)
v_W1302(0x82,temp);//寫入分鐘數(shù)據(jù)
v_W1302(0x80,0x00);
v_W1302(0x8e,0x80);//打開寫保護(hù)
}
if(bb==3)//判斷當(dāng)前顯示界面
{
year++;//年份加一調(diào)節(jié)
if(year==100)//限制年份數(shù)據(jù)在0~99之間
year=0;
temp=dectobcd(year);//將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00);//禁止寫保護(hù)
v_W1302(0x8c,temp);//寫入年數(shù)據(jù)
v_W1302(0x8e,0x80);//打開寫保護(hù)
}
if(bb==4)//判斷當(dāng)前顯示界面
{
day++; //日加一調(diào)節(jié)
if(day==32) //限制日數(shù)據(jù)在1~31之間
day=1;
temp=dectobcd(day); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x86,temp); //寫入日數(shù)據(jù)
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
}
if(distemp == 3) //判斷按下的鍵值
{distemp=8; //返回值回位
if(bb==1) //判斷當(dāng)前顯示界面
{
hour--; //小時(shí)減一調(diào)節(jié)
if(hour==-1) //限制小時(shí)數(shù)據(jù)在0~23之間
hour=23;
temp=dectobcd(hour); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x84,temp); //寫入小時(shí)數(shù)據(jù)
v_W1302(0x80,0x00);
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
if(bb==4) //判斷當(dāng)前顯示界面
{
month--; //月減一調(diào)節(jié)
if(month==0) //限制月數(shù)據(jù)在1~12之間
month=12;
temp=dectobcd(month); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x88,temp); //寫入月數(shù)據(jù)
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
}
if(distemp == 4) //判斷按下的鍵值
{distemp=8; //返回值回位
if(bb==1) //判斷當(dāng)前顯示界面
{
min--; //分鐘減一調(diào)節(jié)
if(min==-1) //限制分鐘數(shù)據(jù)在0~59之間
min=59;
temp=dectobcd(min); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x82,temp); //寫入分鐘數(shù)據(jù)
v_W1302(0x80,0x00);
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
if(bb==3) //判斷當(dāng)前顯示界面
{
year--; //年份減一調(diào)節(jié)
if(year==-1) //限制年份數(shù)據(jù)在0~99之間
year=99;
temp=dectobcd(year); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x8c,temp); //寫入年數(shù)據(jù)
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
if(bb==4) //判斷當(dāng)前顯示界面
{
day--; //日減一調(diào)節(jié)
if(day==0) //限制日數(shù)據(jù)在1~31之間
day=31;
temp=dectobcd(day); //將十進(jìn)制數(shù)轉(zhuǎn)換成十六禁止數(shù)
v_W1302(0x8e,0x00); //禁止寫保護(hù)
v_W1302(0x86,temp); //寫入日數(shù)據(jù)
v_W1302(0x8e,0x80); //打開寫保護(hù)
}
}
}
/*******************************掉電模式程序****************************************/
void xmms()
{
if(dd == 1) //單片機(jī)進(jìn)入掉電工作模式,該模式下只有首位數(shù)碼管的小數(shù)點(diǎn)常亮
{
P0=~0xff; //在掉電模式下,只有第一位數(shù)碼管的小數(shù)點(diǎn)亮
led=1;
Y_5();
aa=0;
ee=0;
PCON=0x02; //設(shè)置掉電模式寄存器,這句一定要放在該子程序的最后
}
}
/********************************自動(dòng)校時(shí)***************************************/
void zdjs()
{
if(hour==3&&min==0&&sec==30)
{
v_W1302(0x8e,0x00);
v_W1302(0x80,0x00);
v_W1302(0x8e,0x80);
}
}
/********************************主函數(shù)***************************************/
void Main(void)
{
EA=1; //打開總中斷
EX0=1; //允許外部0中斷
IT0=1; //設(shè)置外部中斷0為邊沿方式觸發(fā)
IRIN=1;
Write_DS1302Init();
while(1) //無限循環(huán)以下子程序
{
Run_DS1302(); //顯示程序
flag=ReadTemperature(); //將18b2頭文件運(yùn)行返回的函數(shù)結(jié)果送到變量flag中,用于顯示
tj(); //調(diào)節(jié)程序
xmms(); //休眠模式
zdqh(); //自動(dòng)切換
zdjs(); //自動(dòng)校時(shí)
}
}
/*********************紅外接收程序**********************/
void IR_IN() interrupt 0 //外部中斷0
{
unsigned char p,q,R=0;
EA = 0;
delay1(15);
if (IRIN==1)
{ EA =1;
return;
}
while (!IRIN)
{delay1(1);}
for (p=0;p<4;p++)
{
for (q=0;q<8;q++)
{
while (IRIN)
{delay1(1);}
while (!IRIN)
{delay1(1);}
while (IRIN)
{
delay1(1);
R++;
if (R>=30)
{ EA=1;
return;}
}
IRCOM[p]=IRCOM[p] >> 1;
if (R>=8) {IRCOM[p] = IRCOM[p] | 0x80;}
R=0;
}
}
if (IRCOM[2]!=~IRCOM[3])
{ EA=1;
return; }
switch(IRCOM[2])
{
case 0x07: //顯示切換鍵
distemp = 0;
break;
case 0x44: //左加一鍵
distemp = 1;
break;
case 0x45: //右加一鍵
distemp = 2;
break;
case 0x46: //左減一鍵
distemp = 3;
break;
case 0x47: //右減一鍵
distemp = 4;
break;
case 0x16: //掉電模式開關(guān)鍵
distemp = 5;
break;
case 0x10: //自動(dòng)切換開關(guān)鍵
distemp = 6;
break;
case 0x1c: //待機(jī)模式開關(guān)鍵
distemp = 7;
break;
}
if(distemp == 5) //開啟、關(guān)閉掉電模式,因掉電模式只能由外部中斷喚醒,所以下面的程序必須放在中斷函數(shù)中
{distemp = 8; //返回值回位
dd++;
}
if(dd == 2)
dd = 0;
if(dd == 0) //退出掉電模式
{PCON=0x00; //設(shè)置掉電模式工作寄存器
}
if(dd == 1) //掉電模式下,其他按鍵無效
distemp = 8; //不返回任何鍵值
if(ee==1)
{if(distemp==0||distemp==1||distemp==2||distemp==3||distemp==4||distemp==6)
distemp = 8;
}
EA = 1; //打開總中斷
}
復(fù)制代碼
作者:
xstao
時(shí)間:
2015-9-25 22:53
很好謝謝樓主分享,有沒有帶鬧鐘版的啊,有的話給我一份吧謝謝了
xstao@qq.com
作者:
sunnny
時(shí)間:
2015-11-12 11:54
感謝樓主!!!!很有用
作者:
海之貝
時(shí)間:
2015-11-16 14:21
感謝樓主分享
作者:
days110001
時(shí)間:
2015-12-10 10:40
感謝樓主分享
作者:
123456love
時(shí)間:
2015-12-21 08:24
很好,正有急用
作者:
wenjun9958
時(shí)間:
2015-12-23 23:09
感謝樓主分享
作者:
nsj21n
時(shí)間:
2016-2-17 13:52
不錯(cuò)哦,我始終沒有搞懂紅外遙控后如何退出
作者:
洮石
時(shí)間:
2016-2-17 22:09
酷!!!謝謝樓主
作者:
彼岸花de淚
時(shí)間:
2016-5-17 17:59
看一下,向大神學(xué)習(xí)
作者:
新手出道
時(shí)間:
2016-6-15 21:34
資料不錯(cuò)值得一看
作者:
tgyh
時(shí)間:
2016-6-15 23:24
謝謝樓主學(xué)習(xí)了
作者:
張偉強(qiáng)
時(shí)間:
2016-6-16 09:11
謝謝樓主
作者:
旺歌
時(shí)間:
2016-11-1 21:07
很好的資料要看看
作者:
居南山
時(shí)間:
2016-11-15 21:40
值得學(xué)習(xí)。謝謝分享
作者:
wangjianb01978
時(shí)間:
2016-11-26 19:57
很好的資料要看看
作者:
wangjianb01978
時(shí)間:
2016-11-27 19:28
v_W1302(0x8e,0x00); //屏蔽一下語句,則掉電走時(shí)有效;屏蔽則掉電走時(shí)失效,且每次上電后顯示12:00(時(shí))/2012(年)/1(月)1(日)
v_W1302(0x80,0x00); //寫入秒
v_W1302(0x82,0x00); //寫入分
v_W1302(0x84,0x12); //寫入小時(shí)
v_W1302(0x86,0x01); //寫入日
v_W1302(0x88,0x01); //寫入月
v_W1302(0x8a,0x00); //寫入星期
v_W1302(0x8c,0x12); //寫入年
v_W1302(0x8e,0x80);
要怎么修改下電后不初使化(每次上電后顯示12:00(時(shí))/2012(年)/1(月)1(日)
)
作者:
hyy196666
時(shí)間:
2016-12-29 18:37
挺好的
作者:
東北那誰
時(shí)間:
2016-12-31 10:47
很好的資料要看看
作者:
jialishoushi
時(shí)間:
2017-6-19 01:55
這個(gè)詳細(xì) 簡(jiǎn)直就是一教程 支持下
作者:
3760609865
時(shí)間:
2017-6-20 23:50
謝謝分享,我下了一個(gè),學(xué)學(xué)分時(shí)顯示。
作者:
54321
時(shí)間:
2018-1-21 10:58
不顯示
作者:
aa1159195980
時(shí)間:
2018-4-24 14:49
我下了一個(gè),學(xué)學(xué)
作者:
ak333
時(shí)間:
2018-5-3 17:32
樓主好,很喜歡這個(gè)程序,選了同樣的MCU晶振等配件,搭起硬件,寫入程序,只顯示兩個(gè)秒點(diǎn)(正常秒閃),數(shù)字不顯示,請(qǐng)教什么原因?
作者:
句點(diǎn)paula
時(shí)間:
2019-3-17 21:58
有沒有圖
作者:
常佳慧
時(shí)間:
2019-4-6 14:17
樓主能不能發(fā)一下原理圖啊!急用啊
作者:
常佳慧
時(shí)間:
2019-4-7 18:52
nsj21n 發(fā)表于 2016-2-17 13:52
不錯(cuò)哦,我始終沒有搞懂紅外遙控后如何退出
求原理圖怎么畫
作者:
lf8013
時(shí)間:
2019-4-8 17:47
資料不錯(cuò),做一回伸手黨了,拿來就用
作者:
lxl246
時(shí)間:
2019-6-12 14:58
程序跟電路板的圖對(duì)不上啊,是P1口還是P0口?
作者:
大電容123
時(shí)間:
2020-7-5 19:14
沒有原理圖,經(jīng)試驗(yàn)程序和電路不符
作者:
rayin
時(shí)間:
2020-11-15 17:31
很詳細(xì)不錯(cuò),值得學(xué)習(xí)。51hei有你更精彩!!
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品国产欧美在线
|
成人在线视频观看
|
色视频免费
|
黄色大片免费看
|
欧美日韩久久久
|
99re视频这里只有精品
|
久久精品99
|
欧美日韩国产一区二区三区
|
亚洲欧美日韩精品久久亚洲区
|
精品欧美乱码久久久久久1区2区
|
中文字字幕在线中文乱码范文
|
91精品国产日韩91久久久久久
|
亚洲精品在线免费观看视频
|
一区二区在线免费观看视频
|
日韩精品久久久
|
天天影视亚洲综合网
|
久久久久久网站
|
久久高清
|
91视频一区二区
|
一区二区三区四区电影
|
久久久久久国产
|
国偷自产av一区二区三区
|
伊人久久综合
|
欧美 日韩 中文
|
一区日韩
|
欧美一级二级视频
|
中文字幕一区二区三区四区五区
|
欧美日韩成人
|
高清国产午夜精品久久久久久
|
国产亚洲黄色片
|
九九综合九九
|
999久久久免费精品国产
|
日韩一区二区三区精品
|
久久综合色综合
|
久在线
|
蜜臀久久99精品久久久久久宅男
|
一级片免费在线观看
|
www.xxxx欧美
|
龙珠z在线观看
|
嫩草最新网址
|
欧美成人第一页
|