單片機源程序如下:
- //////////////////////////////////////////////////////////////////////////////////
- //
- // 文 件 名 : main.c
- // 版 本 號 : v2.0
- // 作 者 : HuangKai
- // 生成日期 : 2014-0101
- // 最近修改 :
- // 功能描述 : OLED 4接口演示例程(51系列)
- // 說明:
- // ----------------------------------------------------------------
- // GND 電源地
- // VCC 接5V或3.3v電源
- // D0 P1^0(SCL)
- // D1 P1^1(SDA)
- // RES 接P12
- // DC 接P13
- // CS 接P14
- // ----------------------------------------------------------------
- //All rights reserved
- //******************************************************************************/
- #include "REG51.h"
- #include "oled.h"
- #include "bmp.h"
- #define uchar unsigned char
- #define uint unsigned int
- //DS1302引腳定義,可根據實際情況自行修改端口定義
- sbit RST=P3^1;
- sbit IO=P3^2;
- sbit SCK=P3^3;
- //DS1302地址定義
- #define ds1302_sec_add 0x80 //秒數據地址
- #define ds1302_min_add 0x82 //分數據地址
- #define ds1302_hr_add 0x84 //時數據地址
- #define ds1302_date_add 0x86 //日數據地址
- #define ds1302_month_add 0x88 //月數據地址
- #define ds1302_day_add 0x8a //星期數據地址
- #define ds1302_year_add 0x8c //年數據地址
- #define ds1302_control_add 0x8e //控制數據地址
- #define ds1302_charger_add 0x90
- #define ds1302_clkburst_add 0xbe
- //初始時間定義
- uchar time_buf[8] = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始時間
- uchar readtime[14];//當前時間
- uchar set[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00};//年月日的每一位
- uchar sec_buf=0; //秒緩存
- uchar sec_flag=0; //秒標志位
- //功能:延時1毫秒
- //入口參數:x
- //出口參數:無
- //說明:晶振為12M
- /***********************按鍵定義*************************************************/
- sbit key1=P2^0;
- sbit key2=P2^1;
- sbit key3=P2^2;
- uchar status=0,sta=0;//按鍵功能選擇定義(年0,月1,日2,時3,分4 )
- /////////////////////////////////////////////
- sbit led = P0^0;
- sbit key_stop = P0^1;
- sbit nao1 = P0^2;
- sbit nao2 = P0^3;
- ////////////////
- void delay(uint t)
- {
- uint b;
- for(;t;t--)
- for(b=0;b<121;b++);
- }
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- //DS1302初始化函數
- void ds1302_init(void)
- {
- RST=0; //RST腳置低
- SCK=0; //SCK腳置低
- }
- //向DS1302寫入一字節數據
- void ds1302_write_byte(uchar addr, uchar d)
- {
- uchar i;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr & 0xFE; //最低位置零,寄存器0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- addr = addr >> 1;
- }
- //寫入數據:d
- for (i = 0; i < 8; i ++) {
- if (d & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- d = d >> 1;
- }
- RST=0; //停止DS1302總線
- }
- //從DS1302讀出一字節數據
- uchar ds1302_read_byte(uchar addr) {
- uchar i,temp;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr | 0x01; //最低位置高,寄存器0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1;
- SCK=0;
- addr = addr >> 1;
- }
- //輸出數據:temp
- for (i = 0; i < 8; i ++) {
- temp = temp >> 1;
- if (IO) {
- temp |= 0x80;
- }
- else {
- temp &= 0x7F;
- }
- SCK=1;
- SCK=0;
- }
- RST=0; //停止DS1302總線
- return temp;
- }
- //向DS302寫入時鐘數據
- void ds1302_write_time(void)
- {
- time_buf[1]=(set[0]<<4)|set[1];
- time_buf[2]=(set[2]<<4)|set[3];
- time_buf[3]=(set[4]<<4)|set[5];
- time_buf[4]=(set[6]<<4)|set[7];
- time_buf[5]=(set[8]<<4)|set[9];
- time_buf[6]=(set[10]<<4)|set[11];
- time_buf[7]=(set[12]<<4)|set[13];
-
- ds1302_write_byte(ds1302_control_add,0x00); //關閉寫保護
- ds1302_write_byte(ds1302_sec_add,0x80); //暫停時鐘
- //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充電
- ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
- ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
- ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
- ds1302_write_byte(ds1302_hr_add,time_buf[4]); //時
- ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
- ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
- ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
- ds1302_write_byte(ds1302_control_add,0x80); //打開寫保護
- }
- //從DS302讀出時鐘數據
- void ds1302_read_time(void)
- {
- time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
- time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
- time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
- time_buf[4]=ds1302_read_byte(ds1302_hr_add); //時
- time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
- time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
- time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
-
- readtime[0]=(time_buf[0]>>4); //分離出年千位
- readtime[1]=(time_buf[0]&0x0F); //分離出年百位
- readtime[2]=(time_buf[1]>>4); //分離出年十位
- readtime[3]=(time_buf[1]&0x0F); //分離出年個位
- readtime[4]=(time_buf[2]>>4); //分離出月十位
- readtime[5]=(time_buf[2]&0x0F); //分離出月個位
- readtime[6]=(time_buf[3]>>4); //分離出日十位
- readtime[7]=(time_buf[3]&0x0F); //分離出日個位
- readtime[8]=(time_buf[4]>>4); //分離出小時十位
- readtime[9]=(time_buf[4]&0x0F); //分離出小時個位
- readtime[10]=(time_buf[5]>>4); //分離出分鐘十位
- readtime[11]=(time_buf[5]&0x0F); //分離出分鐘個位
- readtime[12]=(time_buf[6]>>4); //分離出秒鐘十位
- readtime[13]=(time_buf[6]&0x0F); //分離出秒鐘個位
- }
- /////////////////////////////分離日期函數//////////////////////////
-
- /******************************************************************************/
- /*****************************按鍵功能函數*************************************/
- void key_1() //選擇變量函數
- {
-
- key1=1;
- if(key1==0)
- delay(10);
- {
- if(key1==0)
- {
- if(++status>12)status=0; //1控制年千位的變化,2控制年百位的變化,3控制年十位的變化
- } //4控制年個位的變化,5控制月十位的變化,6月個位,
- while(key1==0);
- }
- }
- /******************************************************************************/
- void key_2() //加函數
- {
-
- key2=1;
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- switch(status)
- {
- case 1:if(++set[0]>9)set[0]=0;break;
- case 2:if(++set[1]>9)set[1]=0;break;
- case 3:if(++set[2]>1)set[2]=0;break;
- case 4:if(++set[3]>9)set[3]=1;break;
- case 5:if(++set[4]>9)set[4]=0;break;
- case 6:if(++set[5]>9)set[5]=0;break;
- case 7:if(++set[6]>9)set[6]=0;break;
- case 8:if(++set[7]>9)set[7]=0;break;
- case 9:if(++set[8]>9)set[8]=0;break;
- case 10:if(++set[9]>9)set[9]=0;break;
- case 11:if(++set[10]>9)set[10]=0;break;
- case 12:if(++set[11]>9)set[11]=0;break;
-
-
- }
- }
- while(key2==0);
- }
- }
- /*****************************************************************************/
- void key_3()//減函數
- {
-
- key3=1;
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- switch(status)
- {
- case 1:if((set[0]--)<=0)set[0]=9;break;
- case 2:if((set[1]--)<=0)set[1]=9;break;
- case 3:if((set[2]--)<=0)set[2]=1;break;
- case 4:if((set[3]--)<1)set[3]=9;break;
- case 5:if((set[4]--)<=0)set[4]=9;break;
- case 6:if((set[5]--)<=0)set[5]=9;break;
- case 7:if((set[6]--)<=0)set[6]=9;break;
- case 8:if((set[7]--)<=0)set[7]=9;break;
- case 9:if((set[8]--)<=0)set[8]=9;break;
- case 10:if((set[9]--)<=0)set[9]=9;break;
- case 11:if((set[10]--)<=0)set[10]=9;break;
- case 12:if((set[11]--)<=0)set[11]=9;break;
- // case 13:if((set[12]--)<=0)set[12]=9;break;
- // case 14:if((set[13]--)<=0)set[13]=9;break;
- // case 15:if((set[14]--)<=0)set[14]=9;break;
- // case 16:if((set[15]--)<=0)set[15]=9;break;
-
-
- }
- }
- while(key3==0);
- }
- }
- /*****************************************************************************/
- void key_time() //按鍵設置時間的處理
- {
- if(status>0)
- {
- ds1302_write_time();
- }
- }
- ///////////////////////////////鬧鐘/////////////////////
- void naozhong() //鬧鐘
- {
- if((readtime[8]==set[12])&&(readtime[9]==set[13])&&(readtime[10]==set[14])&&(readtime[11]==set[15])&&(readtime[12]==0)&&(readtime[13]==0))
- led = 0;
- }
- void stop()
- {
-
- key_stop=1;
- if(key_stop==0)
- delay(10);
- {
- if(key_stop==0)
- {
- led =1;
- }
- while(key_stop==0);
- }
- }
- /////////////////////////////////////
- void nao_key1()
- {
- nao1=1;
- if(nao1==0)
- delay(10);
- {
- if(nao1==0)
- {
- if(++sta>4)sta=0;
- }
- while(nao1==0);
- }
- }
- void nao_key2() //加函數
- {
-
- nao2=1;
- if(nao2==0)
- {
- delay(10);
- if(nao2==0)
- {
- switch(sta)
- {
- case 1:if(++set[12]>9)set[12]=0;break;
- case 2:if(++set[13]>9)set[13]=0;break;
- case 3:if(++set[14]>9)set[14]=0;break;
- case 4:if(++set[15]>9)set[15]=0;break;
- }
- }
- while(nao2==0);
- }
- }
- /////////////////////////////////////////////////////////
- int main(void)
- { u8 t;
- Delay_xms(50);//等待系統穩定
- ds1302_init(); //DS1302初始化
- // Uart_init(0); //波特率初始化為2400
- Delay_xms(10);
- ds1302_write_time(); //寫入初始值
- OLED_Init(); //初始化OLED
- OLED_Clear() ;
-
- t=' ';
- // OLED_ShowCHinese(0,2,0);//中
- // OLED_ShowCHinese(18,2,1);//景
- // OLED_ShowCHinese(36,2,2);//園
- // OLED_ShowCHinese(54,2,3);//電
- // OLED_ShowCHinese(72,2,4);//子
- // OLED_ShowCHinese(90,2,5);//科
- // OLED_ShowCHinese(108,2,6);//技
- led = 1;
- while(1)
- {
- ds1302_read_time(); //讀取時間
-
-
-
-
- // OLED_Clear();
- // if(readtime[13]!=sec_buf)
- // {
- //
- // sec_flag=0;
- // sec_buf=readtime[13];
- OLED_ShowNum(0,0,readtime[0],1,16); //年千位
- OLED_ShowNum(17,0,readtime[1],1,16); //年百位
- OLED_ShowNum(33,0,readtime[2],1,16); //年十位
- OLED_ShowNum(49,0,readtime[3],1,16); //年個位
-
- OLED_ShowNum(33,2,readtime[4],1,16); //月十位
- OLED_ShowNum(49,2,readtime[5],1,16); //月個位
-
- OLED_ShowNum(33,4,readtime[6],1,16); //月十位
- OLED_ShowNum(49,4,readtime[7],1,16); //月個位
-
- OLED_ShowNum(0,6,readtime[8],1,16); //小時十位
- OLED_ShowNum(17,6,readtime[9],1,16); //小時個位
- OLED_ShowString(33,6,":",16);
- OLED_ShowNum(49,6,readtime[10],1,16);//分鐘十位
- OLED_ShowNum(65,6,readtime[11],1,16);//分鐘個位
- OLED_ShowString(81,6,":",16);//冒號
- OLED_ShowNum(97,6,readtime[12],1,16); //秒鐘十位
- OLED_ShowNum(113,6,readtime[13],1,16);//秒鐘個位
-
- // }
- OLED_ShowCHinese(65,0,0);//年
- OLED_ShowCHinese(65,2,1);//月
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
ds1302&&OLED.rar
(98.06 KB, 下載次數: 325)
2019-1-29 19:34 上傳
點擊文件名下載附件
ds1302&&oled12864
|