這個暑假做了基于51單片機實現(xiàn)12864實現(xiàn)DHT11溫濕度傳感器和DS1302實現(xiàn)鬧鐘和溫濕度顯示在同一個界面上,可以通過四個獨立按鍵控制時鐘的暫停,時分秒年月日位置的切換,可以實現(xiàn)時鐘的加法,減法,里面還有許多的小BUG,很是難以調(diào)整,有興趣可以看一下如何進行代碼的優(yōu)化,總而言之,基本的功能是可以實現(xiàn)的了,由于我那單片機多個矩陣按鍵損壞,導致矩陣按鍵的位置有所不同,大家注意一下就好了。
不知道這么附錄代碼,你們下載看一下就好了
//提前透露出一些小BUG,有的受K3按鍵按下去,但是中斷并沒有開啟,時鐘也沒有暫停,
原因不知出現(xiàn)在哪里,總之你們有興趣隨便看一下就行了,寫的是爛了點,望大佬指點以下
單片機源程序如下:
- #include "all.h"
- #include"DHT11.h"
- sbit K1=P3^4;
- sbit K2=P3^5;
- sbit K3=P3^2; //右上角是這個按鍵電燈,觸發(fā)了外部中斷0
- sbit K4=P3^3; //管腳接線
- sbit Beep = P3^1;
- unsigned char Temp[8];
- char val_flag = 0;
- static unsigned char SetState,SetPlace,Place;
- static int k = 1, q = 1,e = 1,r = 1,t = 1;
- static int w = 1;
-
- void tiaojie();
- char Key_Scan();
- void hanshuming();
- void Int0Configuration();
- void Delay10ms();
- char Key_Scan();
- void SCLKTemp();
- void BeepHear();
- /*8421碼轉(zhuǎn)換*/
- unsigned char ChangeTime(unsigned char tim)
- {
- //tim = Time_buf[7]=0x4A,0x0A,10
- unsigned char Time;
- if((tim&0x0F)>9) //如果個位超過9,則十位加一后,個位清零
- {
- tim=((tim+0x10)&0xF0); //0x4A+0x10=0x5A&0xF0=0x50
-
- } //如果沒有則跳過該部分
-
- //Timebuf = 0x50
- Time = (tim>>4)*10+(tim&0x0f); //把8421碼轉(zhuǎn)變成10進制的數(shù)
- //0x50>>4=0x05*10=50,0x50&0x0f=0x00=0 ;50 DS1302_Write_Time(void)
-
- return Time;
-
- }
-
- void DS1302()
- {
-
- uchar tishi1[] ="設置鬧鈴";
-
- unsigned char sec_buf = 0x00; //用來保存上一次的秒數(shù)
- unsigned char i,j;
-
- Init_12684(); //12864初始化
- DS1302_Init(); //DS1302初始化
- DS1302_Write_Time(); //初始化數(shù)據(jù)
-
- for(i = 0; i < 8;i++)
- {
- Temp[i] = Time_buf[i];
- }
- while(1)
- {
- static char k ;
- Rec_DHTI0();
- if(0 == val_flag)
- {
- DS1302_Read_Time();
- }
-
- if(SetState==0)
- {
- DS1302_Read_Time();
- }
-
- else
- {
-
- if(K1==0) //檢測按鍵K1是否按下
- {
-
- Delay10ms(); //消除抖動
- if(K1==0)
- {
- SetPlace++;
-
- for(j = 0; j < SetPlace;j++)//1 2 3 4 5 6 7 //按照的這個結(jié)果是地址成功加到7
- {
- if(SetPlace>=8) //按鍵可以控制分秒年月日的切換 按鍵按到6的時候可以實現(xiàn)年的切換,之后按鍵到7沒有任何顯示 再按一次重新回到秒的切換
- SetPlace=0;
-
- if(SetPlace == 6)
- {
- SetPlace = 7;
- }
-
- xianshi();
- }
- j = 0;
- }
-
- while((i<50)&&(K1==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
-
- if(K2==0) //檢測按鍵K2是否按下
- {
- Delay10ms(); //消除抖動
- if(K2==0)
- {
-
- Time_buf[SetPlace]++;
- if((Time_buf[SetPlace]&0x0f)>9) //換成BCD碼。
- {
- xianshi();
- Time_buf[SetPlace]=Time_buf[SetPlace]+6;
- }
- if((Time_buf[SetPlace]>=0x60)&&(SetPlace<2)) //秒
- {
- Time_buf[SetPlace]=0;
- }
- if((Time_buf[SetPlace]>=0x60)&&(SetPlace==2)) //分鐘
- {
- Time_buf[SetPlace]=0;
- }
- if((Time_buf[SetPlace]>=0x24)&&(SetPlace==3)) // 小時
- {
- Time_buf[SetPlace]=0;
- }
- if((Time_buf[SetPlace]>=0x31)&&(SetPlace==4)) //日 //日期顯示有問題
- {
- Time_buf[SetPlace]=0;
- }
- if((Time_buf[SetPlace]>=0x13)&&(SetPlace==5)) //月
- {
- Time_buf[SetPlace]=1;
- }
- // if(SetPlace==5) //月只能到12
- // {
- // TIME[SetPlace]=;
- // }
- }
-
- while((i<50)&&(K2==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
-
- }
- if(K4==0) //檢測按鍵K2是否按下
- {
- //xianshi();
- Delay10ms(); //消除抖動
- if(K4==0)
- {
-
- Time_buf[SetPlace]--; //減法需要將減到到0的時候置為為 0x59之類的
- if((Time_buf[SetPlace]&0x0f)>9) //換成BCD碼。
- {
- // xianshi();
- Time_buf[SetPlace]=Time_buf[SetPlace]-6;
- }
- if((Time_buf[SetPlace]<= 0x00)&&(SetPlace < 2)) //分鐘
- {
- Time_buf[SetPlace]=0x59;
- }
-
- if((Time_buf[SetPlace]<= 0x00)&&(SetPlace==2)) //分鐘
- {
- Time_buf[SetPlace]=0x59;
- }
- if((Time_buf[SetPlace]<= 0x00)&&(SetPlace==3)) // 小時
- {
- Time_buf[SetPlace]= 0x23;
- }
-
-
- if((Time_buf[SetPlace] <= 0x00)&&(SetPlace==4)) //日
- {
- Time_buf[SetPlace]=0x30;
- }
- if((Time_buf[SetPlace] <= 0x00)&&(SetPlace==5)) //月
- {
- Time_buf[SetPlace]=0x12;
- }
-
- // if(SetPlace==5) //月只能到12
- // {
- // TIME[SetPlace]=;
- // }
- }
-
- while((i<50)&&(K4==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
-
- }
-
-
-
-
- }
-
-
-
- if(Key_Scan() == 8)
- {
-
- write_command(0x01);
-
- print(1,0,tishi1);
- SCLKTemp();
- while(Key_Scan() != 9)
- {
- tiaojie();
- SCLKTemp();
-
- }
- }
-
- else
- {
- Init_12684();
- LCD_Display();
- }
- if(Time_buf[1] == Temp[1] && Time_buf[2] == Temp[2] && Time_buf[3] == Temp[3] ) //鬧鐘蜂鳴器
- {
- BeepHear();
-
- }
-
- }
- }
- void BeepHear()
- {
- int i = 0;
- for(i = 0; i < 200; i++)
- {
- Beep = 0;
- Delay10ms();
- }
- Beep = 1;
- }
- void tiaojie()
- {
- static unsigned char Place = 0;
- uchar i,j;
- if(K1==0) //檢測按鍵K1是否按下
- {
-
- Delay10ms(); //消除抖動
- if(K1==0)
- {
- Place++;
-
- for(j = 0; j < Place;j++)//1 2 3 4 5 6 7 //按照的這個結(jié)果是地址成功加到7
- {
- if(Place>=4) //按鍵可以控制分秒年月日的切換 按鍵按到6的時候可以實現(xiàn)年的切換,之后按鍵到7沒有任何顯示 再按一次重新回到秒的切換
- Place=1;
-
-
-
- xianshi();
- }
- j = 0;
- }
-
- while((i<50)&&(K1==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
-
- if(K2==0) //檢測按鍵K2是否按下
- {
- Delay10ms(); //消除抖動
- if(K2==0)
- {
-
- Temp[Place]++;
- if((Temp[Place]&0x0f)>9) //換成BCD碼。
- {
- xianshi();
- Temp[Place]=Temp[Place]+6;
- }
- if((Temp[Place]>=0x60)&&(Place<2)) //秒
- {
- Temp[Place]=0;
- }
- if((Temp[Place]>=0x60)&&(Place==2)) //分鐘
- {
- Temp[Place]=0;
- }
- if((Temp[Place]>=0x24)&&(Place==3)) // 小時
- {
- Temp[Place]=0;
- }
-
- // if(SetPlace==5) //月只能到12
- // {
- // TIME[SetPlace]=;
- // }
- }
-
- while((i<50)&&(K2==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
- while(!K2);
- }
- if(K4==0) //檢測按鍵K2是否按下
- {
- //xianshi();
- Delay10ms(); //消除抖動
- if(K4==0)
- {
-
- Temp[Place]--; //減法需要將減到到0的時候置為為 0x59之類的
- if((Temp[Place]&0x0f)>9) //換成BCD碼。
- {
- // xianshi();
- Temp[Place]=Temp[Place]-6;
- }
- if((Temp[Place]<= 0x00)&&(Place < 2)) //分鐘
- {
- Temp[Place]=0x59;
- }
-
- if((Temp[Place]<= 0x00)&&(Place==2)) //分鐘
- {
- Temp[Place]=0x59;
- }
- if((Temp[Place]<= 0x00)&&(Place==3)) // 小時
- {
- Temp[Place]= 0x23;
- }
-
- // if(SetPlace==5) //月只能到12
- // {
- // TIME[SetPlace]=;
- // }
- }
-
- while((i<50)&&(K4==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
- while(!K4);
-
- }
-
-
- }
- void main()
- {
-
-
-
- Beep = 1;
- Int0Configuration();
- DS1302();
-
- }
- void Int0Configuration()
- {
- //設置INT0 //設置外部中斷一,方式為下降沿觸發(fā)
- IT0=1;//跳變沿出發(fā)方式(下降沿)
- EX0=1;//打開INT0的中斷允許。
- EA=1;//打開總中斷
- }
- void Int0() interrupt 0
- {
- static val = 0;
- int i = 2;
- if(val == 0)
- {
- val = 1;
- DS1302_Data_Input(DS1302_SEC_ADD,0x80);
- }
- else
- {
- DS1302_Write_Time();
- DS1302_Data_Input(DS1302_SEC_ADD,0x00);
- val = 0;
- }
- val_flag = val;
-
- }
- 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 hanshuming()
- {
- write_command(0x80);
- write_data('2');
- write_data('0');
- write_data('0'+Time_buf[7]/16); //年
- write_data('0'+(Time_buf[7]&0x0f));
- write_data('-');
- write_data('0'+Time_buf[5]/16); //月
- write_data('0'+(Time_buf[5]&0x0f));
- write_data('-');
- write_data('0'+Time_buf[4]/16);
- write_data('0'+(Time_buf[4]&0x0f)); //日
-
- write_command(0x90);
- write_data('0'+Time_buf[3]/16); //時
- write_data('0'+(Time_buf[3]&0x0f));
- write_data('-');
- write_data('0'+Time_buf[2]/16); //分
- write_data('0'+(Time_buf[2]&0x0f));
- write_data('-');
- write_data('0'+Time_buf[1]/16); //秒
- write_data('0'+(Time_buf[1]&0x0f));
-
- }
- void SCLKTemp()
- {
-
- write_command(0x88);
- write_data('0'+Temp[3]/16); //時
- write_data('0'+(Temp[3]&0x0f));
- write_data('-');
- write_data('0'+Temp[2]/16); //分
- write_data('0'+(Temp[2]&0x0f));
- write_data('-');
- write_data('0'+Temp[1]/16); //秒
- write_data('0'+(Temp[1]&0x0f));
- }
- char Key_Scan()
- {
- static char key=16;
- uchar x, y, z;
- P1 = 0x0f; //置數(shù),行掃描
- if(P1 != 0x0f) //判斷按鍵是否按下
- {
- delay(10); //消抖
- if(P1 != 0X00) //確定按鍵已經(jīng)按下
- {
- x = P1&0x0f; //保存按鍵狀態(tài)
- P1 = 0xf0; //列掃描
- y = P1&0xf0; //保存按鍵狀態(tài)
- z = x|y; //取出健值
- switch(z)
- {
- case 0xbd: key=1;break;
- case 0xdd: key=2;break;
- case 0xed: key=3;break;
-
-
- case 0xdb: key=5;break;
- case 0xeb: key=6;break;
-
-
- case 0xb7: key=7;break;
-
- case 0xd7: key=8;break;
- case 0xe7: key=9;break;
-
- default: return 0;
- break;
-
- }
-
- }
- }
- return key;
- }
- /*******************************************************************************
- * 文件名 : DS1302.c
- * 實現(xiàn)功能:DS1302驅(qū)動程序
- * 版本 作者 日期 說明
- * V1.0 HE 2017/02/06 初始版本
- * 描述 : MCU: STC15F2K60S2 晶振:22.1184 MHz
-
- *******************************************************************************/
- #include "DS1302.h"
- void DHT11();
- void Init_12684();
- void xianshi();
- void Rec_DHTI0();
- uchar Read_8bit();
- void LCD_Display();
- uchar k,j;
- unsigned char Time_buf[8]={0x20,0x50,0x59,0x23,0x24,0x08,0x05,0x20};//年,秒,分,時,日,月,星期,年
- // _______________
- // 年 秒 分 十 日 月 星期 年
- /*******************************************************************************
- * 功能描述 : DS1302初始化
- * 函數(shù)屬性 : 外部
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- * 函數(shù)詳解 :上電運行時,在VCC大于或小于2.5V之前,RST必須
- * 保持低電平,只有在SCLK為低電平時,RST才能被置高
- *******************************************************************************/
- void DS1302_Init()
- {
- RST = 0; //片選
- SCLK = 0;
- }
- /*******************************************************************************
- * 功能描述 : 數(shù)據(jù)輸入函數(shù)
- * 函數(shù)屬性 : 外部
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- * 函數(shù)詳解 : 數(shù)據(jù)輸入,一個字節(jié)的輸入將在下8個時鐘周期的上升沿完成,
- * 數(shù)據(jù)傳輸從字節(jié)最低位開始
- *******************************************************************************/
- void DS1302_Data_Input(unsigned char Address,unsigned char Data) //整個函數(shù)是先寫入地址后寫入數(shù)據(jù)
- {
- unsigned char i;
- RST = 1;//啟動DS1302總線
- Address = Address & 0xFE;//最低位置0,寄存器0位時寫,1時讀,這時為寫數(shù)據(jù) 這個時候ADDress的值根本沒有改變
- for(i=0;i<8;i++)
- {
- SCLK = 0;
- if(Address&0x01) //判斷最低位是否為高電平 ,如果為高電平,則傳入1給IO口
- {
- DAT = 1;
- }
- else //判斷最低位的是否為低電平 ,如果為低電平,則傳入0給IO口
- {
- DAT = 0;
- }
- SCLK = 1;//上升沿寫入指令
- Address = Address>>1; //向右移動移位,依次判斷剩下的高位數(shù)據(jù)
- }
- for(i=0;i<8;i++) //寫入數(shù)據(jù)
- {
- SCLK = 0;
- if(Data&0x01)
- {
- DAT = 1;
- }
- else
- {
- DAT = 0;
- }
- SCLK = 1;//上升沿寫入數(shù)據(jù)
- Data = Data>>1;
- }
- SCLK = 0;
- RST = 0;//關(guān)閉DS1302總線
- }
- /*
- */
- /*******************************************************************************
- * 功能描述 : 數(shù)據(jù)輸出函數(shù)
- * 函數(shù)屬性 : 外部
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- * 函數(shù)詳解 : 數(shù)據(jù)輸出,一個字節(jié)的數(shù)據(jù)將在下個8個時鐘周期的下降沿被輸出。注意第一位輸出
- * 是在最后一位控制指令所在的下降沿被輸出,要求RST保持位高電平
- *******************************************************************************/
- unsigned char DS1302_Data_Output(unsigned char Address)
- {
- unsigned char i;
- unsigned char temp;
- RST = 1;
- Address = Address | 0x01;
- for(i=0;i<8;i++)
- {
- SCLK = 0;
- if(Address&0x01)
- {
- DAT = 1;
- }
- else
- {
- DAT = 0;
- }
- SCLK = 1;
- Address = Address>>1;
- }
-
- for(i=0;i<8;i++)
- {
- SCLK=0;
- temp = temp >> 1;
- if (DAT)
- {
- temp |= 0x80;
- }
- else
- {
- temp &= 0x7F;
- }
- SCLK=1;
- }
- SCLK=0;
- RST = 0;
- return temp;
-
- }
- /*******************************************************************************
- * 功能描述 : 初始化時間
- * 函數(shù)屬性 : 外部
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- * 函數(shù)詳解 :
- *******************************************************************************/
- void DS1302_Write_Time(void)
- {
- DS1302_Data_Input(DS1302_CONTROL_ADD,0x00); //關(guān)閉寫保護,允許數(shù)據(jù)寫入寄存器,數(shù)據(jù)內(nèi)容為0(寫入允許)
- DS1302_Data_Input(DS1302_SEC_ADD,0x80); //CH位置高,振蕩器停止,置低,振蕩器工作允許
- DS1302_Data_Input(DS1302_CHARGER_ADD,0xa9);
- //涓流充電,7~4位TCS=1010,使能涓流充電
- //3~2位DS=01,選擇一個二極管,DS=10,選擇兩個二極管,等于其他值,均被禁止充電
- //1~0位RS=00,無電阻,不能充電,RS=01,2k,RS=10,4k,RS=11,8k
-
- /*初始值*/
- DS1302_Data_Input(DS1302_SEC_ADD,Time_buf[1]); //秒寄存器地址 //后面這個數(shù)組好像是設置一個初始值
- DS1302_Data_Input(DS1302_MIN_ADD,Time_buf[2]); //分鐘寄存器
- DS1302_Data_Input(DS1302_HR_ADD,Time_buf[3]); //時
- DS1302_Data_Input(DS1302_DAY_ADD,Time_buf[4]); //日
- DS1302_Data_Input(DS1302_MONTH_ADD,Time_buf[5]); //月
- DS1302_Data_Input(DS1302_WEEK_ADD,Time_buf[6]); //星期
- DS1302_Data_Input(DS1302_YEAR_ADD,Time_buf[7]); //年
-
- DS1302_Data_Input(DS1302_CONTROL_ADD,0x80); //打開寫保護
- }
- /*******************************************************************************
- * 功能描述 : 讀取時間
- * 函數(shù)屬性 : 外部
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- * 函數(shù)詳解 :
- *******************************************************************************/
- void DS1302_Read_Time(void)
- {
- Time_buf[1]=(DS1302_Data_Output(DS1302_SEC_ADD))&0x7f; //秒,屏蔽秒的第7位,避免超出59
- Time_buf[2]=DS1302_Data_Output(DS1302_MIN_ADD); //分
- Time_buf[3]=DS1302_Data_Output(DS1302_HR_ADD)&0x3F; //時 3f -- 0011 1111
- Time_buf[4]=DS1302_Data_Output(DS1302_DAY_ADD); //日
- Time_buf[5]=DS1302_Data_Output(DS1302_MONTH_ADD); //月
- Time_buf[6]=DS1302_Data_Output(DS1302_WEEK_ADD); //星期
- Time_buf[7]=DS1302_Data_Output(DS1302_YEAR_ADD); //年
- }
- sbit led1 = P2^5;
- sbit led2 = P2^6;
- sbit led3 = P2^7;
- sbit DHTI0 = P3^0;
- uchar RL_data, RH_data, TH_data, TL_data, CK_data;
- uchar undata;
- //uchar code lcd[]={"當前的溫濕度"};
- uchar code lcd1[]={"溫度: ℃"};
- uchar code lcd2[]={"濕度: %RH"};
- uchar str1[]={" "};
- uchar str2[]={" "};
- void delay1s()
- {
- int i ,j;
- for(i = 0;i<110; ++i)
- {
- for(j = 0;j<1000;++j)
- {;}
- }
- }
- void Rec_DHTI0()
- {
- //主機信號
- DHTI0 = 1; //拉高
- Delay1000ms(); //延時1s以上 等待狀態(tài)穩(wěn)定
- DHTI0 = 0; //拉低
- Delay18ms(); //主機拉低25Ms
- DHTI0 = 1; //拉高
- Delay40us(); //主機拉高40us
- //從機響應信號
- if(!DHTI0)
- {
- while(!DHTI0); //while(!0)==(1)判斷從機是否發(fā)出80毫秒的低電平響應信號
- while(DHTI0); //判斷從機是否發(fā)出80毫秒的高電平 , 發(fā)出則開始采集數(shù)據(jù)
- RH_data = Read_8bit(); //溫度整數(shù)部分
- RL_data = Read_8bit(); //溫度小數(shù)部分
- TH_data = Read_8bit(); //濕度整數(shù)部分
- TL_data = Read_8bit(); //濕度小數(shù)部分
- CK_data = Read_8bit(); //校驗位
-
- undata = RH_data + RL_data + TH_data + TL_data; //校驗獲取的數(shù)據(jù)
- }
- //濕度整數(shù) (溫濕度傳感器存在疑惑)
- str1[0] = (char)(0x30 + RH_data/10); //0x30將數(shù)字0-9轉(zhuǎn)化為字符0-9
- str1[1] = (char)(0x30 + RH_data%10);
- //溫度整數(shù)
- str2[0] = (char)(0x30 + TH_data/10);
- str2[1] = (char)(0x30 + TH_data%10);
-
- if(TH_data > 30) //溫度報警
- {
- BeepHear();
- }
-
-
- }
- uchar Read_8bit()
- {
- uint i;
- uchar temp = 0;
- uchar dat;
- for(i = 0;i < 8;i++)
- {
- //以下部分判斷數(shù)據(jù)是0或是1
- while(!DHTI0); //等待50毫秒的低電平結(jié)束
- Delay30us();
- temp = 0;
- if(DHTI0 == 1)
- {
- temp = 1;
- }
- while(DHTI0); //等待高電平結(jié)束
- dat<<=1;
- dat = dat|temp;
- }
- return dat;
- }
- void LCD_Display()
- {
-
-
- hanshuming();
- print(3,1,lcd1);
- print(4,1,lcd2);
- // 溫度
- for(j = 0;j < 2;j++)
- {
- //ad_ope(uchar x,uchar y)
- ad_ope(3,j+4); //顯示位置,第3行,j為0或1,j+4為第幾位開始顯示
- write_data(str2[j]); //void write_data(uchar dat)
- }
- // 濕度
- for(k = 0;k < 2;k++)
- {
- ad_ope(4,k+4);
- write_data(str1[k]);
- }
- }
- void xianshi()
- {
- //點亮第一個燈
- led1 = 0;
- led2 = 1;
- led3 = 1;
-
- //延時1s
- delay1s();
- //點亮第二個燈
- led1 = 1;
- led2 = 0;
- led3 = 1;
-
- //延時1s
- delay1s();
-
- //點亮剩余的燈
-
- led1 = 1;
- led2 = 1;
- led3 = 0;
-
- //延時1s
- delay1s();
- led1 = 1;
- led2 = 1;
- led3 = 1;
-
- //延時1s
- delay1s();
- led1 = 1;
- led2 = 1;
- led3 = 1;
- //延時1s
- delay1s();
-
- }
復制代碼
-
- /*******************************************************************************/
- #ifndef __DS1302_H__
- #define __DS1302_H__
- #include "all.h"
- sbit SCLK = P4^4;//串行時鐘輸入端口
- sbit DAT = P4^2;//數(shù)據(jù)IO端口
- sbit RST = P4^1;//復位輸入端
- sbit K1=P3^4;
- sbit K2=P3^5;
- sbit K3=P3^2; //右上角是這個按鍵電燈,觸發(fā)了外部中斷0
- sbit K4=P3^3; //管腳接線
- #define DS1302_SEC_ADD 0x80//秒
- #define DS1302_MIN_ADD 0x82//分
- #define DS1302_HR_ADD 0x84//時
- #define DS1302_DAY_ADD 0x86//日
- #define DS1302_MONTH_ADD 0x88//月
- #define DS1302_WEEK_ADD 0x8A//星期
- #define DS1302_YEAR_ADD 0x8C//年
- #define DS1302_CONTROL_ADD 0x8E//控制
- #define DS1302_CHARGER_ADD 0x90//涓流充電
- #define DS1302_CLKBURST_ADD 0xBE//時鐘多字節(jié)
- extern void DS1302_Init(); //初始化DS1302
- extern void DS1302_Data_Input(unsigned char Address,unsigned char Data); //數(shù)據(jù)輸入
- extern unsigned char DS1302_Data_Output(unsigned char Address); //數(shù)據(jù)輸出
- extern void DS1302_Write_Time(void); //寫入初始化時間
- extern void DS1302_Read_Time(void); //讀取時間
- #endif
復制代碼 下載:
15可以設置鬧鐘時間的加減溫度報警.zip
(152.89 KB, 下載次數(shù): 19)
2020-8-15 11:09 上傳
點擊文件名下載附件
|