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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

1602+1302+18b20+iic結合的程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:156412 發表于 2016-12-20 23:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
能進行溫度測試,當溫度過高或過低時報警,并記錄當前時間,將所有的信息顯示在液晶屏上,當密碼輸入正確可查看并修改當前各個部分的設置
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:155507 發表于 2016-12-21 07:05 | 只看該作者
// 實時時鐘芯片DS1302應用,DS18B20應用實例——可調時鐘,LCD1602顯示:(時間+溫度)

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define     LCDIO      P2

sbit DQ=P1^3;//ds18b20與單片機連接口
sbit rs=P1^0;
sbit rd=P1^1;
sbit lcden=P1^2;
sbit acc0=ACC^0;             //移位時的第0位
sbit acc7=ACC^7;             //移位時用的第7位
uchar second,minute,hour,day,month,year,week,count=0;   
uchar ReadValue,num,time;   
uint tvalue;//溫度值
uchar tflag;
uchar code  table[]={" 2010-11-29 MON"};
uchar code table1[]={" 15:45:00 000.0C"};
uchar code table2[]= "THUFRISATSUNMONTUEWES";
uchar data disdata[5];
sbit DATA=P0^1;   //時鐘數據接口
sbit RST=P0^2;   
sbit SCLK=P0^0;  
sbit menu=P3^5;              //菜單
sbit add=P3^6;               //加一
sbit dec=P3^7;               //減一

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void delay1(uint z)
{
        for(;z>0;z--);
}
void write_com(uchar com)
{
        rs=0;
        rd=0;
        lcden=0;
        P2=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;   
}

void write_date(uchar date)
{
        rs=1;
        rd=0;
        lcden=0;
        P2=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;   
}

void init()
{
        uchar num;
        lcden=0;

        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        delay(5);
        write_com(0x80);
        for(num=0;num<15;num++)
        {
                write_date(table[num]);
                delay(5);
        }
        write_com(0x80+0x40);
        for(num=0;num<15;num++)
        {
                write_date(table1[num]);
                delay(5);
        }      
}

void Write1302(uchar dat)
{
        uchar i;
        SCLK=0;           //拉低SCLK,為脈沖上升沿寫入數據做好準備
        delay1(2);       //稍微等待,使硬件做好準備
        for(i=0;i<8;i++)      //連續寫8個二進制位數據
        {
                DATA=dat&0x01;    //取出dat的第0位數據寫入1302
                delay(2);       //稍微等待,使硬件做好準備
                SCLK=1;           //上升沿寫入數據
                delay1(2);      //稍微等待,使硬件做好準備
                SCLK=0;           //重新拉低SCLK,形成脈沖
                dat>>=1;          //將dat的各數據位右移1位,準備寫入下一個數據位
        }
}

void WriteSet1302(uchar Cmd,uchar dat)
{
        RST=0;           //禁止數據傳遞
        SCLK=0;          //確保寫數居前SCLK被拉低
        RST=1;           //啟動數據傳輸
        delay1(2);     //稍微等待,使硬件做好準備
        Write1302(Cmd);  //寫入命令字
        Write1302(dat);  //寫數據
        SCLK=1;          //將時鐘電平置于已知狀態
        RST=0;           //禁止數據傳遞
}

uchar Read1302(void)
{
        uchar i,dat;
        delay(2);          //稍微等待,使硬件做好準備
        for(i=0;i<8;i++)   //連續讀8個二進制位數據
        {
                dat>>=1;       //將dat的各數據位右移1位,因為先讀出的是字節的最低位
                if(DATA==1)    //如果讀出的數據是1
                dat|=0x80;    //將1取出,寫在dat的最高位
                SCLK=1;       //將SCLK置于高電平,為下降沿讀出
                delay1(2);   //稍微等待
                SCLK=0;       //拉低SCLK,形成脈沖下降沿
                delay1(2);  //稍微等待
        }
        return dat;        //將讀出的數據返回
}

uchar  ReadSet1302(uchar Cmd)
{
        uchar dat;
        RST=0;                 //拉低RST
        SCLK=0;                //確保寫數居前SCLK被拉低
        RST=1;                 //啟動數據傳輸
        Write1302(Cmd);       //寫入命令字
        dat=Read1302();       //讀出數據
        SCLK=1;              //將時鐘電平置于已知狀態
        RST=0;               //禁止數據傳遞
        return dat;          //將讀出的數據返回
}
void Init_DS1302(void)
{
        WriteSet1302(0x8E,0x00);                 //根據寫狀態寄存器命令字,寫入不保護指令
        WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根據寫秒寄存器命令字,寫入秒的初始值
        WriteSet1302(0x82,((45/10)<<4|(45%10)));   //根據寫分寄存器命令字,寫入分的初始值
        WriteSet1302(0x84,((15/10)<<4|(15%10))); //根據寫小時寄存器命令字,寫入小時的初始值
        WriteSet1302(0x86,((29/10)<<4|(29%10))); //根據寫日寄存器命令字,寫入日的初始值
        WriteSet1302(0x88,((11/10)<<4|(11%10))); //根據寫月寄存器命令字,寫入月的初始值
        WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //nian
        WriteSet1302(0x8a,((4/10)<<4|(4%10)));
}

void DisplaySecond(uchar x)
{
        uchar i,j;   
        i=x/10;
        j=x%10;
        write_com(0xc7);  
        write_date(0x30+i);  
        write_date(0x30+j);     
}
void DisplayMinute(uchar x)
{
        uchar i,j;   
        i=x/10;
        j=x%10;
        write_com(0xc4);   
        write_date(0x30+i);
        write_date(0x30+j);        
}
void DisplayHour(uchar x)
{
        uchar i,j;  
        i=x/10;
        j=x%10;
        write_com(0xc1);   
        write_date(0x30+i);
        write_date(0x30+j);      
}

void DisplayDay(uchar x)
{
        uchar i,j;  
        i=x/10;
        j=x%10;   
        write_com(0x89);   
        write_date(0x30+i);
        write_date(0x30+j);     
}

void DisplayMonth(uchar x)
{
        uchar i,j;   
        i=x/10;
        j=x%10;
        write_com(0x86);   
        write_date(0x30+i);
        write_date(0x30+j);
}

void DisplayYear(uchar x)
{
        uchar i,j;
        i=x/10;
        j=x%10;
        write_com(0x83);   
        write_date(0x30+i);
        write_date(0x30+j);
}  
void DisplayWeek(uchar x)
{ uchar i;
        x=x*3;
        write_com(0x8c);   
        for(i=0;i<3;i++)
        {
                write_date(table2[x]);
                x++;
        }
}  

void  read_date(void)
{
        ReadValue = ReadSet1302(0x81);  
        second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = ReadSet1302(0x83);
        minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = ReadSet1302(0x85);
        hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = ReadSet1302(0x87);
        day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = ReadSet1302(0x89);
        month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = ReadSet1302(0x8d);
        year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue=ReadSet1302(0x8b);                     //讀星期
        week=ReadValue&0x07;
        DisplaySecond(second);         
        DisplayMinute(minute);      
        DisplayHour(hour);            
        DisplayDay(day);               
        DisplayMonth(month);           
        DisplayYear(year);         
        DisplayWeek(week);
}

void turn_val(char newval,uchar flag,uchar  newaddr,uchar s1num)
{
        newval=ReadSet1302(newaddr);                     //讀取當前時間
        newval=((newval&0x70)>>4)*10+(newval&0x0f);    //將bcd碼轉換成十進制
        if(flag)                  //判斷是加一還是減一
        {
                newval++;
                switch(s1num)
                { case 1: if(newval>99) newval=0;
                        DisplayYear(newval);     
                        break;
                case 2: if(newval>12) newval=1;
                        DisplayMonth(newval);
                        break;
                case 3: if(newval>31) newval=1;
                        DisplayDay(newval);
                        break;
                case 4: if(newval>6) newval=0;
                        DisplayWeek(newval);
                        break;
                case 5: if(newval>23) newval=0;
                        DisplayHour(newval);
                        break;
                case 6: if(newval>59) newval=0;
                        DisplayMinute(newval);
                        break;
                case 7: if(newval>59) newval=0;
                        DisplaySecond(newval);
                        break;
                default:break;
                }
        }  
        else
        {
                newval--;
                switch(s1num)
                { case 1: if(newval==0) newval=99;
                        DisplayYear(newval);
                        break;
                case 2: if(newval==0) newval=12;
                        DisplayMonth(newval);
                        break;
                case 3: if(newval==0) newval=31;
                        DisplayDay(newval);
                        break;
                case 4: if(newval<0) newval=6;
                        DisplayWeek(newval);
                        break;
                case 5: if(newval<0) newval=23;
                        DisplayHour(newval);
                        break;
                case 6: if(newval<0) newval=59;
                        DisplayMinute(newval);
                        break;
                case 7: if(newval<0) newval=59;
                        DisplaySecond(newval);
                        break;
                default:break;
                }
        }
        WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));  //將新數據寫入寄存器
       
}  

//鍵盤掃描程序
//*******************************************
void key_scan(void)
{   uchar miao,s1num=0;

        if(menu==0)
        {
                delay(5);
                if(menu==0)
                {
                        while(!menu);   
                        s1num++;
                        while(1)
                        {
                               
                                if(menu==0)
                                {
                                        delay(5);
                                        if(menu==0)
                                        {
                                                while(!menu);
                                                s1num++;
                                        }
                                }

                                rd=0;
                                miao=ReadSet1302(0x81);
                                second=miao;
                                WriteSet1302(0x80,miao|0x80);
                                write_com(0x0f);//光標閃射
                               
                                if(s1num==1)
                                {   year=ReadSet1302(0x8d);   
                                        write_com(0x80+4);  //年光標

                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                { while(!add);
                                                        turn_val(year,1,0x8d,1);        
                                                       
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                {  while(!dec);
                                                        turn_val(year,0,0x8d,1);                  
                                                }
                                        }
                                }
                                if(s1num==2)
                                {
                                        month=ReadSet1302(0x89);
                                        write_com(0x80+7);  //月光標
                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                {  while(!add);
                                                        turn_val(month,1,0x89,2);
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                {  while(!dec);
                                                        turn_val(month,0,0x89,2);
                                                }
                                        }
                                }
                                if(s1num==3)
                                {   day=ReadSet1302(0x87);
                                        write_com(0x80+10);//日光標
                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                { while(!add);
                                                        turn_val(day,1,0x87,3);
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                { while(!dec);
                                                        turn_val(day,0,0x87,3);                //寫入日寄存器
                                                }
                                        }
                                }
                                if(s1num==4)
                                {  week=ReadSet1302(0x8b);
                                        write_com(0x80+14); //星期光標
                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                { while(!add);
                                                        turn_val(week,1,0x8b,4);
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                { while(!dec);
                                                        turn_val(week,0,0x8b,4);
                                                }
                                        }
                                }
                                if(s1num==5)
                                {   hour=ReadSet1302(0x85);
                                        write_com(0x80+0x40+2); //時光標
                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                { while(!add);
                                                        turn_val(hour,1,0x85,5);
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                { while(!dec);
                                                        turn_val(hour,0,0x85,5);
                                                }
                                        }
                                }
                                if(s1num==6)//調時間分
                                {  minute=ReadSet1302(0x83);
                                        write_com(0x80+0x40+5);
                                        if(add==0)
                                        {
                                                delay(5);
                                                if(add==0)
                                                { while(!add);
                                                        turn_val(minute,1,0x83,6);             //寫入分寄存器  
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                { while(!dec);
                                                        turn_val(minute,0,0x83,6);             //寫入分寄存器
                                                }
                                        }
                                }
                                if(s1num==7)//調時間秒
                                {   second=ReadSet1302(0x81);
                                        write_com(0x80+0x40+8);//秒光標
                                        if(add==0)
                                        {
                                                delay(3);
                                                if(add==0)
                                                { while(!add);
                                                        if(second==0x60)
                                                        second=0x00;
                                                        turn_val(second,1,0x81,7);
                                                }
                                        }
                                        if(dec==0)
                                        {
                                                delay(3);
                                                if(dec==0)
                                                { while(!dec);
                                                        turn_val(second,0,0x81,7);            
                                                }
                                        }
                                }
                               

                                if(s1num==8)
                                {   miao=ReadSet1302(0x81);
                                        second=miao;
                                        WriteSet1302(0x80,second&0x7f);
                                        s1num=0;//s1num清零//
                                        write_com(0x0c);//光標不閃爍//
                                        break;
                                }
                        }
                }
        }
}

void delay_18B20(unsigned int i)//延時1微秒
{
        while(i--);
}

void ds1820rst()/*ds1820復位*/
{  unsigned char x=0;
        DQ = 1;          //DQ復位
        delay_18B20(4);  //延時
        DQ = 0;          //DQ拉低
        delay_18B20(100); //精確延時大于480us
        DQ = 1;          //拉高
        delay_18B20(40);  
}

uchar ds1820rd()/*讀數據*/
{ unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {   DQ = 0; //給脈沖信號
                dat>>=1;
                DQ = 1; //給脈沖信號
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
        }
        return(dat);
}

void ds1820wr(uchar wdata)/*寫數據*/
{unsigned char i=0;
        for (i=8; i>0; i--)
        { DQ = 0;
                DQ = wdata&0x01;
                delay_18B20(10);
                DQ = 1;
                wdata>>=1;
        }
}
read_temp()/*讀取溫度值并轉換*/
{uchar a,b;
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號*/
        ds1820wr(0x44);//*啟動溫度轉換*/
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號*/
        ds1820wr(0xbe);//*讀取溫度*/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
        if(tvalue<0x0fff)
        tflag=0;
        else
        {tvalue=~tvalue+1;
                tflag=1;
        }
        tvalue=tvalue*(0.425);//溫度值擴大10倍,精確到1位小數
        return(tvalue);
}
void ds1820disp()//溫度值顯示
{ uchar flagdat;
        disdata[0]=tvalue/1000+0x30;//百位數
        disdata[1]=tvalue%1000/100+0x30;//十位數
        disdata[2]=tvalue%100/10+0x30;//個位數
        disdata[3]=tvalue%10+0x30;//小數位

        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號
        else
        flagdat=0x2d;//負溫度顯示負號:-

        if(disdata[0]==0x30)
        {disdata[0]=0x20;//如果百位為0,不顯示
                if(disdata[1]==0x30)
                {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
                }
        }

        write_com(0xc9);
        write_date(flagdat);//顯示符號位
        write_com(0xca);
        write_date(disdata[0]);//顯示百位
        write_com(0xcb);
        write_date(disdata[1]);//顯示十位   
        write_com(0xcc);
        write_date(disdata[2]);//顯示個位   
        write_com(0xcd);
        write_date(0x2e);//顯示小數點   
        write_com(0xce);
        write_date(disdata[3]);//顯示小數位
        write_com(0xcf);
        write_date('C');
}
void main()
{  
        init();
        Init_DS1302();       //將1302初始化
        read_temp();//讀取溫度
        ds1820disp();//顯示
        while(1)
        {
                read_date();
                key_scan();
                read_temp();//讀取溫度
                ds1820disp();//顯示

        }

}

回復

使用道具 舉報

板凳
ID:156548 發表于 2016-12-21 14:25 | 只看該作者
學習一下!!
回復

使用道具 舉報

地板
ID:156580 發表于 2016-12-21 15:12 | 只看該作者
樓主果然好資料,謝謝
回復

使用道具 舉報

5#
ID:156590 發表于 2016-12-21 15:55 | 只看該作者
嗯,很棒
回復

使用道具 舉報

6#
ID:21545 發表于 2020-3-28 14:19 | 只看該作者
嗯嗯嗯,好長,學習了!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97成人免费 | 一区二区视频在线 | 日本精品久久久久 | 色综合视频 | 日韩有码一区 | hsck成人网 | 91影视| 国产一区二区免费在线 | 日本手机在线 | 亚洲欧美国产一区二区三区 | 国产精品一区二区不卡 | 免费网站国产 | 日韩一区二区三区四区五区六区 | 91精品国产自产在线老师啪 | 天天综合成人网 | 久久国产精品久久久久久 | 青青草社区 | 国产黄色在线观看 | 97福利在线| 国产高清视频一区 | 国产区精品 | 天天综合久久 | 精品一区二区三区在线观看国产 | 日韩成人精品一区 | 精品国产第一区二区三区 | 欧美精品在线一区 | 国产小u女发育末成年 | 九九久久国产 | 久久久女女女女999久久 | 超碰电影| 国产精品美女 | 又爽又黄axxx片免费观看 | 一区视频| 一区二区三区免费 | 中国一级特黄真人毛片 | 久久这里有精品 | 中文字幕日韩一区 | 免费在线成人 | 一区二区三区在线看 | 国产精品久久久久久久久久 | 欧美一级二级视频 |