久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3247|回復: 1
打印 上一主題 下一主題
收起左側

DS3231時鐘芯片驅動資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:268888 發表于 2017-12-29 16:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>
#include <intrins.h>
#include <sys\sys.h>
#include <lcd\lcd.h>
#include <font\font.h>
typedef unsigned char BYTE;
typedef unsigned char uchar;
typedef unsigned int WORD;
#define FOSC 24000000L          //系統頻率
#define BAUD 9600             //串口波特率
#define T1MS (65536-FOSC/1000)      //1T模式
WORD c=0,valv=0,vali=0;
bit flag=0, ack,flag1=0 ;
int HL,TL,dat_v,HLi,TLi,dat_i=1000;
sbit led=P5^4;
sbit SDA=P3^5;
sbit SCL=P3^7;
sbit key=P3^2;
#define DS3231_WriteAddress 0xD0    //器件寫地址
#define DS3231_ReadAddress  0xD1    //器件讀地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
//鬧鈴1            
#define DS3231_SALARM1ECOND 0x07    //秒
#define DS3231_ALARM1MINUTE 0x08    //分
#define DS3231_ALARM1HOUR   0x09    //時
#define DS3231_ALARM1WEEK   0x0A    //星期/日
//鬧鈴2
#define DS3231_ALARM2MINUTE 0x0b    //分
#define DS3231_ALARM2HOUR   0x0c    //時
#define DS3231_ALARM2WEEK   0x0d    //星期/日
#define DS3231_CONTROL      0x0e    //控制寄存器
#define DS3231_STATUS       0x0f    //狀態寄存器
#define BSY                 2       //忙
#define OSF                 7       //振蕩器停止標志
#define DS3231_XTAL         0x10    //晶體老化寄存器
#define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(8位)
#define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(高2位)
uchar data dis_buf[8];
uchar data dis_index;
uchar data dis_digit;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個時鐘
#define ADC_SPEEDL  0x20            //360個時鐘
#define ADC_SPEEDH  0x40            //180個時鐘
#define ADC_SPEEDHH 0x60            //90個時鐘
#define ADC_P10  0x01 //IO引腳 Px.0
#define ADC_P11  0x02 //IO引腳 Px.1
#define ADC_P12  0x04 //IO引腳 Px.2
#define ADC_P13  0x08 //IO引腳 Px.3
#define ADC_P14  0x10 //IO引腳 Px.4
#define ADC_P15  0x20 //IO引腳 Px.5
#define ADC_P16  0x40 //IO引腳 Px.6
#define ADC_P17  0x80 //IO引腳 Px.7
#define ADC_P1_All 0xFF //IO所有引腳
//-----------------------------------------------
void InitADC();
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
BYTE GetADCResult(BYTE ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; //ADC電源,轉換時間,通道,ADC打開
    _nop_();                        //等待4個NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
    return ADC_RES;                 //返回ADC結果
}
void InitADC()
{                    
    P1ASF =0x03;                     //設置P1口為AD口  設置P1.0和P1.1位AD口
    ADC_RES = 0;                        //清除結果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                           //ADC上電并延時                      //ADC power-on and delay
}
void Delay(WORD n)
{
   WORD x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}
uchar BCD2HEX(uchar val)    //BCD???Byte
{
    uchar temp;
    temp=val&0x0f;
    val>>=4;
    val&=0x0f;
    val*=10;
    temp+=val;
   
    return temp;
}
uchar HEX2BCD(uchar val)    //B????BCD?
{
    uchar i,j,k;
    i=val/10;
    j=val%10;
    k=j+(i<<4);
    return k;
}
void delayus(WORD us)
{   
   _nop_();
   _nop_();
    while (us--);
}
void Start_I2C()
{
    SDA=1;                  //???????????
    delayus(3);
    SCL=1;
    delayus(27);             //??????????4.7us,??
   
    SDA=0;                  //??????
    delayus(27);             // ??????????4祍
      
    SCL=0;                  //??I2C??,?????????
    delayus(9);
}
void Stop_I2C()
{
    SDA=0;                  //???????????
    delayus(3);             //???????????
    SCL=1;                  //??????????4us
    delayus(27);
   
    SDA=1;                  //??I2C??????
    delayus(21);
}
void SendByte(uchar c)
{
    uchar BitCnt;
   
    for(BitCnt=0;BitCnt<8;BitCnt++)         //?????????8?
    {
        if((c<<BitCnt)&0x80)
            SDA=1;                          //?????
        else
            SDA=0;               
          delayus(3);
          SCL=1;                            //??????,????????????
          delayus(27);                       //???????????4祍   
          SCL=0;
    }
   
    delayus(9);
    SDA=1;                                  //8??????????,???????
    delayus(9);  
    SCL=1;
    delayus(15);
    if(SDA==1)
        ack=0;   
    else
        ack=1;                              //???????????
    SCL=0;
    delayus(9);
}
uchar RcvByte()
{
   uchar retc;
   uchar BitCnt;

   retc=0;
   SDA=1;                           //?????????
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
        delayus(3);  
        SCL=0;                      //??????,???????
      
        delayus(27);                 //?????????4.7祍
      
        SCL=1;                      //???????????????
        delayus(15);
        retc=retc<<1;
        if(SDA==1)
            retc=retc+1;            //????,????????retc?
        delayus(9);
   }
   SCL=0;
   delayus(9);
   return(retc);
}

void Ack_I2C(bit a)
{

    if(a==0)
        SDA=0;              //????????????
    else
        SDA=1;
    delayus(15);     
    SCL=1;
   
    delayus(27);             //?????????4祍
   
    SCL=0;                  //????,??I2C????????
    delayus(9);   
}

uchar write_byte(uchar addr, uchar write_data)
{
    Start_I2C();
    SendByte(DS3231_WriteAddress);
    if (ack == 0)
        return 0;
   
    SendByte(addr);   
    if (ack == 0)
        return 0;
   
    SendByte(write_data);
    if (ack == 0)
        return 0;
   
    Stop_I2C();
    delayus(57);      
    return 1;
}

uchar read_current()
{
    uchar read_data;
    Start_I2C();
    SendByte(DS3231_ReadAddress);
    if(ack==0)
        return(0);
   
    read_data = RcvByte();
    Ack_I2C(1);
    Stop_I2C();
    return read_data;
}

uchar read_random(uchar random_addr)
{
    Start_I2C();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);
   
    SendByte(random_addr);
    if(ack==0)
        return(0);
   
    return(read_current());
}

void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
{
    uchar temp=0;
   
    temp=HEX2BCD(yea);
    write_byte(DS3231_YEAR,temp);   //???
   
    temp=HEX2BCD(mon);
    write_byte(DS3231_MONTH,temp);  //???
   
    temp=HEX2BCD(da);
    write_byte(DS3231_DAY,temp);    //???
   
    temp=HEX2BCD(hou);
    write_byte(DS3231_HOUR,temp);   //???
   
    temp=HEX2BCD(min);
    write_byte(DS3231_MINUTE,temp); //???
   
    temp=HEX2BCD(sec);
    write_byte(DS3231_SECOND,temp); //???
}


void get_show_time(void)                 //顯示時間
{
    uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

    Htemp1=read_random(DS3231_HOUR);    //? 24???
    Htemp1&=0x3f;                  
    Htemp2=BCD2HEX(Htemp1);
   
    Mtemp1=read_random(DS3231_MINUTE);  //?
    Mtemp2=BCD2HEX(Mtemp1);
   
    Stemp1=read_random(DS3231_SECOND);  //?
    Stemp2=BCD2HEX(Stemp1);

      
        LCD_Show2Num(0,96,Htemp2,2);
       LCD_Show2Num(32,96,Mtemp2,2);
       LCD_Show2Num(64,96,Stemp2,2);
}

void get_show_date(void)                //顯示年月日
{
    uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
   
    Ytemp1=read_random(DS3231_YEAR);        //?
    Ytemp2=BCD2HEX(Ytemp1);
   
    Mtemp1=read_random(DS3231_MONTH);       //?
    Mtemp2=BCD2HEX(Mtemp1);
   
    Dtemp1=read_random(DS3231_DAY);         //?
    Dtemp2=BCD2HEX(Dtemp1);

       LCD_Show2Num(16,114,Ytemp2,2);
      
       LCD_Show2Num(48,114,Mtemp2,2);
        
       LCD_Show2Num(80,114,Dtemp2,2);
        
}


void get_show_Temperature(void)             //溫度數據
{
    uchar Ttemp1,Ttemp_L,Ttemp3,Ttemp_H;
   
    Ttemp1=read_random(DS3231_TEMPERATUREH);    //溫度高位
    Ttemp_H=Ttemp1;
   
    Ttemp3=read_random(DS3231_TEMPERATUREL);    //溫度地位
    Ttemp_L=(Ttemp3>>6)*25;
if(Ttemp_H&0x80)
{
  flag1=1;
  Ttemp_H=Ttemp_H||0x7f;
}
else
  flag1=0;


        if(flag1==1)
        LCD_ShowString(40,130,"-") ;
     else
     LCD_ShowString(40,130," ") ;
   
     LCD_Show2Num(48,130,Ttemp_H,2);
        LCD_ShowString(64,130,".") ;
   
     LCD_Show2Num(72,130,Ttemp_L,2);
     
}
void init()       //串口以及定時器初始化程序
{
    SCON = 0x50;                    //8位可變波特率
    T2L = (65536 - (FOSC/4/BAUD));  //設置波特率重裝值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                    //T2為1T模式, 并啟動定時器2
// AUXR |= 0x01;                   //選擇定時器2為串口1的波特率發生器
AUXR |= 0x81;                   //定時器0為1T模式
//  AUXR &= 0x7f;                   //定時器0為12T模式
    TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = T1MS;                     //初始化計時值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    ES = 1;                         //使能串口1中斷 剛開機的時候關閉串口中斷防止串口有數據喚醒單片機           
    EA = 1;
}
void tm0_isr() interrupt 1 using 1    //1MS中斷程序
{
c++;
if(c==10)
{
flag=1;
c=0;
}
}
void dat_bat()        //溫濕度以及PM2.5程序處理程序
{
HL=GetADCResult(0);
TL=ADC_LOW2;
HL<<=2;
dat_v=HL|TL;
HLi=GetADCResult(1);
TLi=ADC_LOW2;
HLi<<=2;
dat_i=HLi|TLi;
vali=dat_i*5*4.65/1.024;
valv=dat_v*5*0.755/1.024;
}
void lcd_aux_init()
{
     showhanzi16(0,16,0);    //
      showhanzi16(16,16,1);    //
   LCD_ShowString(32,16,":") ;
   /////////////////////////
   LCD_ShowString(96,16,"mV") ;
   showhanzi16(0,32,0);    //
      showhanzi16(16,32,10);    //
   LCD_ShowString(32,32,":") ;
   //////////////////////////
   LCD_ShowString(80,32,"mA") ;
   LCD_ShowString(0,64,"DC SOURCE ") ;
   LCD_ShowString(0,80,"1-12V 0-3A") ;

      LCD_Show2Num(0,114,20,2);//   年月日
       showhanzi16(32,114,24);
       showhanzi16(64,114,25);
       showhanzi16(96,114,26);

      showhanzi16(0,130,20);    //溫度參數
       showhanzi16(16,130,21);
       LCD_ShowString(32,130,":") ;
   
    LCD_ShowString(16,96,":") ;    //時間參數
      LCD_ShowString(48,96,":") ;
}
void show_time()
{
   LCD_Show2Num(48,16,vali,5);
   LCD_Show2Num(48,32,valv,4);
}
main()
{
char ii=3;
Lcd_Init();   //tft初始化
init();
LCD_Clear(WHITE); //清屏
InitADC();
  BACK_COLOR=WHITE ;
POINT_COLOR=BLACK ;
lcd_aux_init();
while(1)
{
if(flag==1)       //50ms更新一次數據
{
dat_bat();
flag=0;
  get_show_date();              //????
  get_show_Temperature();       //????
  get_show_time();   
}
  show_time();
if(key==0)
ModifyTime(17,3,23,14,05,00);
while(!key);

  led=~led;
  }

}

做了一個DC電源,加上這個時鐘芯片驅動

12V3ADC-DC DS3231.rar

159.99 KB, 下載次數: 23, 下載積分: 黑幣 -5

LCD加上時鐘芯片驅動

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:371527 發表于 2018-12-26 07:08 | 只看該作者
名稱該是采集顯示時間溫度程序PM2,5時間溫度采用DS3231
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线不卡 | 91视频一88av | 婷婷综合久久 | 91国产精品 | 久久久久国 | 国产福利在线 | 国产成人免费在线 | 久久精品国产99国产精品 | 国产成人艳妇aa视频在线 | 天堂一区二区三区 | 欧美在线成人影院 | 中文字幕在线观看视频一区 | 特黄色一级毛片 | 国产高清在线精品 | 欧美日韩综合一区 | 一区二区免费看 | 久久精品在线播放 | 久久不卡 | a级片在线| 久久精品国产亚洲 | 中国黄色毛片视频 | 国产精品久久久久久一级毛片 | 日韩中文电影 | 午夜免费电影院 | 淫片专区| 中文成人在线 | 亚洲成av片人久久久 | a在线观看 | 国产三级一区二区三区 | 在线超碰| 亚洲精品久久久久国产 | 午夜国产羞羞视频免费网站 | 亚洲成年人免费网站 | 91欧美激情一区二区三区成人 | 毛片免费视频 | 中文字幕一区二区三 | 日韩欧美一级精品久久 | 欧美日韩不卡在线 | 久久久精品国产 | 久久精品欧美一区二区三区不卡 | 成人精品鲁一区一区二区 |