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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc15單片機+LCD1602制作萬年歷

[復制鏈接]
跳轉到指定樓層
樓主
代碼如下:

此程序在stc15系列單片機上運行無誤  如需換成51單片機運行  只需要更改溫度函數中的延時函數即可,應為15系列單片機的運行速度為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寫一個數據
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為字符點陣函數

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

uchar red_temp();                                                        //溫度傳感器函數
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;                //設置定時器模式
        TL0 = 0xCD;                //設置定時初值
        TH0 = 0xD4;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時        
        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)                                         //毫秒延時函數   根據單片機速度不同更改  此處為15系列單片機速度  51應i應改成120左右
{
        uint i;
        while(time--)
        {
                for(i=0;i<800;i++);
        }
}




void int_DS1302()          //初始化DS1302,把int_ds[]數組里的數寫入相應時間寄存器地址
{
        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);//十進制轉換十六進制
        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;                         //十六進制轉十進制
        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()                                                 //讀取一個字節溫度  
{
        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, 下載次數: 80, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:272080 發表于 2018-1-5 19:21 | 只看該作者
還有那個溫度值為85  是因為通電時就是85初始化的數值 這個具體原因我也不太清楚  希望有高人指點  通電1秒后 會由85跳變成正常溫度  這樣照片是一通電就拍的所以就是85了
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:1029123 發表于 2022-5-25 16:05 來自手機 | 只看該作者
麻煩問下這是51還是stc15
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久综合亚洲鲁鲁五月天 | 青娱乐自拍| 国产精品爱久久久久久久 | 国产精品久久久久久久久久 | 国产精品一二区 | 欧美激情亚洲天堂 | 人人干人人看 | 国内91在线 | 久久精品中文 | 精品视频久久久久久 | 伊人伊人 | 国产精品日韩欧美一区二区 | 日本精品免费在线观看 | 91社区在线观看 | 成人免费片| 成人av大全| 中文字幕国产一区 | aaa在线 | 国产精品久久久一区二区三区 | 在线成人免费av | 极品国产视频 | 丁香五月网久久综合 | 农村真人裸体丰满少妇毛片 | 国产精品免费看 | 日本高清中文字幕 | 精品久久久久久久久久 | 欧美国产一区二区 | 欧美精品一二三区 | 色综合av| 亚洲国产成人精品女人久久久 | 亚洲精品日韩欧美 | 久久久久久久一区 | 午夜欧美| 亚洲日本欧美日韩高观看 | 亚洲欧美一区二区三区1000 | 国产xxxx搡xxxxx搡麻豆 | 精品欧美一区二区精品久久久 | 午夜精品视频在线观看 | 精品国产一区二区久久 | 欧美日韩精品一区二区三区四区 | 亚洲国产成人久久综合一区,久久久国产99 |