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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6309|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

stc15單片機(jī)+LCD1602制作萬(wàn)年歷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
代碼如下:

此程序在stc15系列單片機(jī)上運(yùn)行無(wú)誤  如需換成51單片機(jī)運(yùn)行  只需要更改溫度函數(shù)中的延時(shí)函數(shù)即可,應(yīng)為15系列單片機(jī)的運(yùn)行速度為51的10倍左右




此為效果圖






此為電路圖


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

sfr AUXR=0x8e;

sbit rw=P2^1;
sbit rs=P2^0;
sbit en=P1^2;

sbit CE=P1^3;
sbit SCL=P1^7;
sbit io=P2^3;

sbit DQ=P1^4;

uchar hang1[17]={"temperature=    "};                        //溫度顯示
uchar hang2[17]={"2000-00-00-00-00"};                        //時(shí)間日期顯示
                                //年   月 時(shí) 分 秒

uchar hang3[17]={"Happy New Year!"};

uchar int_ds[]={50,59,23,31,12,7,17};                         //初始化時(shí)間
                        //  秒分 時(shí) 日 月 周 年
uchar cmd_ds[7];                                                                //存放讀取的時(shí)間

uchar new_char[]={0x04,0x0e,0x15,0x04,0x04,0x04,0x04,0x00};         //一個(gè)新的字符

uint sec_add;
bit sec_flag;

void int_t0();

void w_cmd(uchar cmd);                                                                 //1602寫一個(gè)命令
void w_dat(uchar dat);                                                                 //1602寫一個(gè)數(shù)據(jù)
void int_1602();                                                                         //初始化1602
void w_zfc(uchar x,uchar y,uchar *p);                                 //寫入一個(gè)字符串
void delay_ms(uint time);                                                         //毫秒延時(shí)
void add_char(uchar cmd,uchar *p);                                         //新增一個(gè)自定義字符   cmd為字符地址  *p為字符點(diǎn)陣函數(shù)

void DS1302_wuchar(uchar cmd);                                                 //1302寫入一個(gè)字節(jié)命令
uchar DS1302_ruchar();                                                                 //1302讀取一個(gè)字節(jié)命令
void write_DS1302(uchar cmd,uchar dat);                                //向cmd寄存器寫入一個(gè)dat命令
uchar red_DS1302();                                                                        //讀取一個(gè)字節(jié)函數(shù)
void red_ds();                                                                                //
void int_DS1302();                                                                        

uchar red_temp();                                                        //溫度傳感器函數(shù)
void DS_int();
void write_DS(uchar cmd);
uchar red_DS_1820();
void Delay500us();
void Delay100us();

void main()
{
        uchar temp;
        int_1602();
        int_t0();
        int_DS1302();        
        add_char(0,new_char);
        w_zfc(0,0,hang1);
        w_zfc(0,1,hang2);
        while(1)
        {
                red_ds();

                if(sec_flag)
                {
                        temp=red_temp();
                        sec_flag=0;
                }
                hang1[12]=temp/10+0x30;
                hang1[13]=temp%10+0x30;

                hang2[14]=cmd_ds[0]/10+0x30;        //秒
                hang2[15]=cmd_ds[0]%10+0x30;

                hang2[11]=cmd_ds[1]/10+0x30;        //分
                hang2[12]=cmd_ds[1]%10+0x30;

                hang2[8]=cmd_ds[2]/10+0x30;                //時(shí)
                hang2[9]=cmd_ds[2]%10+0x30;

                hang2[2]=cmd_ds[6]/10+0x30;        //年
                hang2[3]=cmd_ds[6]%10+0x30;

                hang2[5]=cmd_ds[4]/10+0x30;        //月
                hang2[6]=cmd_ds[4]%10+0x30;


                w_zfc(0,0,hang1);
                w_zfc(0,1,hang2);
        }
}

void t0() interrupt 1
{
         sec_add++;
         if(sec_add==1000)
         {
                 sec_add=0;
                sec_flag=1;
         }
}

void int_t0()
{
        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xCD;                //設(shè)置定時(shí)初值
        TH0 = 0xD4;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)        
        EA=1;
        ET0=1;
}

void w_cmd(uchar cmd)
{
        rs=0;
        rw=0;
        en=0;
        P0=cmd;
        delay_ms(1);
        en=1;
        delay_ms(1);
        en=0;
}

void w_dat(uchar dat)
{
        rs=1;
        rw=0;
        en=0;
        P0=dat;
        delay_ms(1);
        en=1;
        delay_ms(1);
        en=0;
}

void int_1602()
{
        w_cmd(0x38);
        w_cmd(0x08);
        w_cmd(0x01);
        w_cmd(0x06);
        w_cmd(0x0c);
}

void add_char(uchar cmd,uchar *p)
{
        uchar i;
        cmd<<=4;
        for(i=0;i<8;i++)
        {
                w_cmd(0x40|cmd+i);
                w_dat(*p);
                p++;
        }
}

void w_zfc(uchar x,uchar y,uchar *p)
{
        if(y==0)
        w_cmd(0x80+x);
        else
        w_cmd(0xc0+x);

        while(*p!='\0')
        {
                w_dat(*p);
                p++;
        }
}

void delay_ms(uint time)                                         //毫秒延時(shí)函數(shù)   根據(jù)單片機(jī)速度不同更改  此處為15系列單片機(jī)速度  51應(yīng)i應(yīng)改成120左右
{
        uint i;
        while(time--)
        {
                for(i=0;i<800;i++);
        }
}




void int_DS1302()          //初始化DS1302,把int_ds[]數(shù)組里的數(shù)寫入相應(yīng)時(shí)間寄存器地址
{
        write_DS1302(0x8e,0x00);
        write_DS1302(0x80,int_ds[0]);                //miao
        write_DS1302(0x82,int_ds[1]);                //fen
        write_DS1302(0x84,int_ds[2]);                //shi
    write_DS1302(0x86,int_ds[3]);           //ri
        write_DS1302(0x88,int_ds[4]);           //yue
        write_DS1302(0x8a,int_ds[5]);           //zhou
        write_DS1302(0x8c,int_ds[6]);           //nian
        write_DS1302(0x8e,0x80);
}

void DS1302_wuchar(uchar cmd)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                SCL=0;
                io=cmd&0x01;
                SCL=1;
                cmd>>=1;
        }
}

uchar DS1302_ruchar()
{
        uchar dat,i;
        for(i=0;i<8;i++)
        {
                SCL=0;
                dat>>=1;
                if(io)
                dat|=0x80;        
                SCL=1;
        }
        return dat;        
}

void write_DS1302(uchar cmd,uchar dat)
{
        uchar x;
        CE=0;
        SCL=0;
        CE=1;
        DS1302_wuchar(cmd);        
        x=(dat/10<<4)|(dat%10);//十進(jìn)制轉(zhuǎn)換十六進(jìn)制
        DS1302_wuchar(x);
        CE=0;        
}

uchar red_DS1302(uchar cmd)
{
        uchar dat;
        uchar dat1,dat2;
        CE=0;
        SCL=0;
        CE=1;
        DS1302_wuchar(cmd);
        dat=DS1302_ruchar();
        dat1=dat/16;                         //十六進(jìn)制轉(zhuǎn)十進(jìn)制
        dat2=dat%16;
        dat=dat1*10+dat2;
        io=0;
        CE=0;
        return dat;
}
void red_ds()
{
        write_DS1302(0x8e,0x00);
        cmd_ds[0]=red_DS1302(0x81);        
        cmd_ds[1]=red_DS1302(0x83);        
        cmd_ds[2]=red_DS1302(0x85);
        cmd_ds[3]=red_DS1302(0x87);         //
        cmd_ds[4]=red_DS1302(0x89);         //
        cmd_ds[5]=red_DS1302(0x8b);         //
        cmd_ds[6]=red_DS1302(0x8d);         //
        write_DS1302(0x8e,0x80);        
}


void DS_int()                                  //總線初始化
{
          DQ = 0;
          Delay500us();// 延時(shí)大于480us
          DQ = 1;
    Delay500us();
}

void write_DS(uchar cmd)                 //寫命令到DS18B20
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DQ=0;
                DQ=cmd&0x01;
                Delay100us();
                DQ=1;
                cmd>>=1;
        }
}

void Delay500us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 6;
        j = 93;
        do
        {
                while (--j);
        } while (--i);
}

void Delay100us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 2;
        j = 15;
        do
        {
                while (--j);
        } while (--i);
}

uchar red_DS_1820()                                                 //讀取一個(gè)字節(jié)溫度  
{
        uchar temp,i;
         for(i=0;i<8;i++)
         {
                 DQ=0;
                 temp>>=1;
                 DQ=1;
                 if(DQ)
                 {
                          temp=temp|0x80;
                 }
                 Delay100us();
         }
         return temp;
}

uchar red_temp()
{
        uchar low,high,temp;
        DS_int();
        write_DS(0xcc);
        write_DS(0x44);
               
           DS_int();
        write_DS(0xcc);
        write_DS(0xbe);
        low=red_DS_1820();
        high=red_DS_1820();

        temp=high<<4;
        temp=temp|(low>>4);
        return temp;
}



1602萬(wàn)年歷 溫度顯示.rar

396.87 KB, 下載次數(shù): 80, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:272080 發(fā)表于 2018-1-5 19:12 | 只看該作者
電路圖在壓縮文件中
回復(fù)

使用道具 舉報(bào)

板凳
ID:272080 發(fā)表于 2018-1-5 19:21 | 只看該作者
還有那個(gè)溫度值為85  是因?yàn)橥姇r(shí)就是85初始化的數(shù)值 這個(gè)具體原因我也不太清楚  希望有高人指點(diǎn)  通電1秒后 會(huì)由85跳變成正常溫度  這樣照片是一通電就拍的所以就是85了
回復(fù)

使用道具 舉報(bào)

地板
ID:496214 發(fā)表于 2019-7-15 09:41 | 只看該作者
謝謝~~~
回復(fù)

使用道具 舉報(bào)

5#
ID:1029123 發(fā)表于 2022-5-25 16:05 來(lái)自手機(jī) | 只看該作者
麻煩問(wèn)下這是51還是stc15
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂av网 | 欧美精品福利 | 怡红院怡春院一级毛片 | 国产精品一区一区 | 午夜激情一区 | 日韩三级视频 | 国产免费人成xvideos视频 | 日韩一区二区在线观看 | 日韩在线免费视频 | 国产精品99久久久久久宅男 | 精品一区二区电影 | 日本啊v在线 | 久久视频精品 | 亚洲欧美精品 | 人人爽人人草 | 久久成人一区 | 久久国产精品一区 | 欧美一区二区三区 | 草草草网站 | 精品视频在线播放 | 精品日韩在线 | 欧美亚洲国语精品一区二区 | 亚洲色图综合 | 久久天堂| 成人av一区二区亚洲精 | 国色天香成人网 | 日韩www | 黄网站在线播放 | 国产精品久久久久婷婷二区次 | 亚洲人成在线观看 | 中文字幕一区二区在线观看 | 亚洲欧美一区二区三区1000 | 黄色毛片免费看 | 婷婷午夜天 | 久久躁日日躁aaaaxxxx | 亚洲 成人 在线 | 精品国产91乱码一区二区三区 | 精品视频www| 国产综合久久 | 中文字幕日韩欧美一区二区三区 | 欧美一区二区三区的 |