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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機ds3231+ds18b20+lcd12864

[復制鏈接]
跳轉到指定樓層
樓主
ID:456780 發表于 2019-3-18 15:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 qkl189 于 2019-3-18 19:36 編輯


用的IIC通信,寫的一個ds3231時鐘模塊的程序,可更改時間,下面是.h文件里面的部分代碼

#ifndef __ds3231_h
#define __ds3231_h_
#include <reg51.h>
#define uchar   unsigned char  
#define uint    unsigned int
extern uchar day2,Htemp2,Mtemp2,Stemp2;         //星期,時分秒
extern ucharYtemp2,Mtemp2,Dtemp2,Ttemp2,Ttemp4; //年月日,溫度的數據,需要先調用處理函數
void delayus(uint us);      
void Start_I2C();
void Stop_I2C();
void SendByte(uchar c);
void Ack_I2C(bit a);
void ModifyTime(uchar yea,uchar mon,uchar da,uchar day,uchar hou,uchar min,uchar sec); //修改年月日星期時分秒
void get_show_day(void);    //星期
void get_show_time(void);   //時分秒
void get_show_date(void);   //年月日
void get_show_Temperature(void);  //溫度

#endif

這是.c文件里面的程序
#include <reg51.h>
#include <intrins.h>
#include "ds3231.h"

sbit SDA=P0^3;     //模擬I2C數據傳送位SDA        
sbit SCL=P0^1;     //模擬I2C時鐘控制位SCL     
sbit RESET=P0^2;
uchar day2,Htemp2,Mtemp2,Stemp2,Ytemp2,Mtemp2,Dtemp2,Ttemp2,Ttemp4;
bit  ack;          //應答標志位

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(uint us)
{
  while(us--);
}

void Start_I2C()
{
        SDA=1;                  //發送起始條件的數據信號
        delayus(1);
        SCL=1;
        delayus(5);             //起始條件建立時間大于4.7us,延時
        SDA=0;                  //發送起始信號
        delayus(5);             // 起始條件鎖定時間大于4μs      
        SCL=0;                  //鉗住I2C總線,準備發送或接收數據
        delayus(2);
}


void Stop_I2C()
{
        SDA=0;                  //發送結束條件的數據信號
        delayus(1);             //發送結束條件的時鐘信號
        SCL=1;                  //結束條件建立時間大于4us
        delayus(5);   
        SDA=1;                  //發送I2C總線結束信號
        delayus(4);
}

void SendByte1(uchar c)
{
        uchar BitCnt;
        for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數據長度為8位
        {
                if((c<<BitCnt)&0x80)
                        SDA=1;                          //判斷發送位
                else
                        SDA=0;               
                delayus(1);
                SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
                delayus(5);                       //保證時鐘高電平周期大于4μs   
                SCL=0;
        }
        delayus(2);
        SDA=1;                                  //8位發送完后釋放數據線,準備接收應答位
        delayus(2);  
        SCL=1;
        delayus(3);
        if(SDA==1)
                ack=0;   
        else
                ack=1;                              //判斷是否接收到應答信號
        SCL=0;
        delayus(2);
}

uchar RcvByte()
{
        uchar retc;
        uchar BitCnt;
        retc=0;
        SDA=1;                           //置數據線為輸入方式
        for(BitCnt=0;BitCnt<8;BitCnt++)
        {
                delayus(1);  
                SCL=0;                      //置時鐘線為低,準備接收數據位      
                delayus(5);                 //時鐘低電平周期大于4.7μs      
                SCL=1;                      //置時鐘線為高使數據線上數據有效
                delayus(3);
                retc=retc<<1;
                if(SDA==1)
                                retc=retc+1;            //讀數據位,接收的數據位放入retc中
                delayus(2);
        }
        SCL=0;
        delayus(2);
        return(retc);
}

void Ack_I2C(bit a)
{
        if(a==0)
                SDA=0;              //在此發出應答或非應答信號
        else
                SDA=1;
        delayus(3);     
        SCL=1;  
        delayus(5);             //時鐘低電平周期大于4μs   
        SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
        delayus(2);   
}

uchar write_byte(uchar addr, uchar write_data)
{
        Start_I2C();
        SendByte1(0xd0);
        if (ack == 0)
                return 0;   
        SendByte1(addr);   
        if (ack == 0)
                return 0;   
        SendByte1(write_data);
        if (ack == 0)
                return 0;   
        Stop_I2C();
        delayus(10);      
        return 1;
}

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

uchar read_random(uchar random_addr)
{
        Start_I2C();
        SendByte1(0xd0);
        if(ack==0)
                return(0);  
        SendByte1(random_addr);
        if(ack==0)
                return(0);   
        return(read_current());
}

void ModifyTime(uchar yea,uchar mon,uchar da,uchar day,uchar hou,uchar min,uchar sec)
{
        uchar temp=0;
        temp=HEX2BCD(yea);
        write_byte(0x06,temp);   //修改年  
        temp=HEX2BCD(mon);
        write_byte(0x05,temp);  //修改月
        temp=HEX2BCD(da);
        write_byte(0x04,temp);    //修改日
        temp=HEX2BCD(day);
        write_byte(0x03,temp);
        temp=HEX2BCD(hou);
        write_byte(0x02,temp);   //修改時
        temp=HEX2BCD(min);
        write_byte(0x01,temp); //修改分  
        temp=HEX2BCD(sec);
        write_byte(0x00,temp); //修改秒
}

void get_show_day(void)
{
        uchar day1;
        day1=read_random(0x03);        //星期
        day2=BCD2HEX(day1);
}

void get_show_time(void)
{
        uchar Htemp1,Mtemp1,Stemp1;
        Htemp1=read_random(0x02);    //時 24小時制
        Htemp1&=0x3f;
        Htemp2=BCD2HEX(Htemp1);  
        Mtemp1=read_random(0x01);  //分
        Mtemp2=BCD2HEX(Mtemp1);
        Stemp1=read_random(0x00);  //秒
        Stemp2=BCD2HEX(Stemp1);
}

void get_show_date(void)
{
        uchar Ytemp1,Mtemp1,Dtemp1;   
        Ytemp1=read_random(0x06);        //年
        Ytemp2=BCD2HEX(Ytemp1);   
        Mtemp1=read_random(0x05);       //月
        Mtemp2=BCD2HEX(Mtemp1);   
        Dtemp1=read_random(0x04);         //日
        Dtemp2=BCD2HEX(Dtemp1);
}

void get_show_Temperature(void)
{
        uchar Ttemp1,Ttemp3;   
        Ttemp1=read_random(0x11);    //溫度高字節
        Ttemp2=BCD2HEX(Ttemp1);
        Ttemp3=read_random(0x12);    //溫度低字節
        Ttemp4=BCD2HEX(Ttemp3);
        
}
可以讀取溫度數據。做了兩天寫出來的,如果有什么不足的還請多多指教。該程序通過單片機模擬串口進行讀取ds3231時鐘芯片的數據,然后通過LCD12864液晶顯示屏進行顯示,同時還添加了溫度傳感器


時鐘顯示.rar

73.62 KB, 下載次數: 93, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:456780 發表于 2019-3-18 15:57 | 只看該作者
如果有什么不足的還希望各位大神指出
回復

使用道具 舉報

板凳
ID:1 發表于 2019-3-18 18:22 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

地板
ID:96881 發表于 2020-3-19 22:42 | 只看該作者
先謝謝您分享,我先下載來試著畫原理圖并洞洞板試驗一下,然后再來補充原理圖,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合九九 | 亚洲三级免费看 | 国产一区久久 | 六月色婷| 操人网站 | 国产精品99一区二区 | 欧美三区| 久久婷婷av| 午夜一区| 午夜极品| 亚洲性视频在线 | 午夜免费看视频 | 国产精品mv在线观看 | 国产成人99久久亚洲综合精品 | 九九热在线免费视频 | 成人中文网 | 成人久久久久久久久 | 欧美成视频 | 9久久婷婷国产综合精品性色 | 亚洲综合色网站 | 国内自拍偷拍一区 | 亚洲精品电影在线观看 | www.久久.com| 伊人网综合在线观看 | 高清一区二区视频 | 免费三级黄| 性生活毛片 | 精品国产综合 | 95国产精品 | 午夜影视网 | 最新中文字幕第一页视频 | 国产91精品久久久久久久网曝门 | 天堂网av在线 | 国产亚洲精品久久19p | 亚洲九九 | 婷婷激情综合 | 午夜免费视频 | www亚洲免费国内精品 | 成人免费视频网站在线观看 | 亚洲一二三在线观看 | 免费一级片 |