標(biāo)題: stc15單片機(jī)+LCD1602制作萬年歷 [打印本頁]

作者: 大力做大力愛    時間: 2018-1-5 19:11
標(biāo)題: stc15單片機(jī)+LCD1602制作萬年歷
代碼如下:

此程序在stc15系列單片機(jī)上運(yùn)行無誤  如需換成51單片機(jī)運(yùn)行  只需要更改溫度函數(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"};                        //時間日期顯示
                                //年   月 時 分 秒

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

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

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

uint sec_add;
bit sec_flag;

void int_t0();

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

void DS1302_wuchar(uchar cmd);                                                 //1302寫入一個字節(jié)命令
uchar DS1302_ruchar();                                                                 //1302讀取一個字節(jié)命令
void write_DS1302(uchar cmd,uchar dat);                                //向cmd寄存器寫入一個dat命令
uchar red_DS1302();                                                                        //讀取一個字節(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;                //時
                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;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時器模式
        TL0 = 0xCD;                //設(shè)置定時初值
        TH0 = 0xD4;                //設(shè)置定時初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時器0開始計(jì)時        
        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ù)   根據(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)時間寄存器地址
{
        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();// 延時大于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()                                                 //讀取一個字節(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萬年歷 溫度顯示.rar

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


作者: 大力做大力愛    時間: 2018-1-5 19:12
電路圖在壓縮文件中
作者: 大力做大力愛    時間: 2018-1-5 19:21
還有那個溫度值為85  是因?yàn)橥姇r就是85初始化的數(shù)值 這個具體原因我也不太清楚  希望有高人指點(diǎn)  通電1秒后 會由85跳變成正常溫度  這樣照片是一通電就拍的所以就是85了
作者: sdsslh    時間: 2019-7-15 09:41
謝謝~~~
作者: Jmq1314    時間: 2022-5-25 16:05
麻煩問下這是51還是stc15




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1