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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機溫控風扇實物無法運行 LCD1602屏只顯示一排格子

[復制鏈接]
跳轉到指定樓層
樓主
做設計選了單片機 做了LCD1602的溫控風扇 焊好了 實物沒法運行 LCD屏只顯示一排格子 幾個調速按鈕按下好像也沒什么反應 是我的焊接圖有問題嗎 焊接圖貼了

原理圖跟程序
#include<reg51.h>
#include<intrins.h>             //包含頭文件
#define LCD1602 P0
#define uchar unsigned char
#define uint unsigned int         //宏定義
////////////////////
sbit dj=P1^0;//電機控制端接口
sbit DQ=P1^6;//溫度傳感器接口
sbit SN=P1^1;//使能繼電器動作
//////////按鍵接口/////////////////////////////////
sbit key1=P3^5;//設置溫度
sbit key2=P3^6;//溫度加
sbit key3=P3^7;//溫度減

//////////////////////////////////////////////////////
sbit RS = P2^7;
sbit EN = P2^6;
uint wen_du;                        //溫度變量  
uint shang,xia; //對比溫度暫存變量
uchar dang;//檔位顯示
uchar Mode=0;
uchar d1,d2,d3;//顯示數據暫存變量
uchar code tab1[]={" P:   T:   .  C "};
uchar code tab2[]={"TH:   C  TL:   C"};
void delay(uint ms)        //延時函數,大約延時
{
    uchar x;
    for(ms;ms>0;ms--)
        for(x=50;x>0;x--);
}
/***********ds18b20延遲子函數(晶振12MHz )*******/
void delay_18B20(uint i)
{
    while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20()
{
     uchar x=0;
     DQ=1;          //DQ復位
     delay_18B20(8);  //稍做延時
     DQ=0;          //單片機將DQ拉低
     delay_18B20(80); //精確延時 大于 480us
     DQ=1;          //拉高總線
     delay_18B20(14);
     x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
     delay_18B20(20);
}
/***********ds18b20讀一個字節**************/  
uchar ReadOneChar()
{
    uchar i=0;
    uchar dat=0;
    for (i=8;i>0;i--)
     {
          DQ=0; // 給脈沖信號
          dat>>=1;
          DQ=1; // 給脈沖信號
          if(DQ)
          dat|=0x80;
          delay_18B20(4);
     }
     return(dat);
}
/*************ds18b20寫一個字節****************/  
void WriteOneChar(uchar dat)
{
     uchar i=0;
     for (i=8;i>0;i--)
     {
          DQ=0;
         DQ=dat&0x01;
        delay_18B20(5);
         DQ=1;
        dat>>=1;
    }
}
/**************讀取ds18b20當前溫度************/
void ReadTemperature()
{
    uchar a=0;
    uchar b=0;
    uint t=0;
    float tt=0;
    Init_DS18B20();
    WriteOneChar(0xCC);        // 跳過讀序號列號的操作
    WriteOneChar(0x44);     // 啟動溫度轉換
    delay_18B20(100);       // this message is wery important
    Init_DS18B20();
    WriteOneChar(0xCC);     //跳過讀序號列號的操作
    WriteOneChar(0xBE);     //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
    delay_18B20(100);
    a=ReadOneChar();        //讀取溫度值低位
    b=ReadOneChar();           //讀取溫度值高位
    t=b;                  //將高8位數據存入t
    t<<=8;              //t左移8位
    t=t|a;              //將t|a得到一個16位的溫度數據
    tt=t*0.0625;          //一個最低位代表0.0625°C,所以要*0.0625得到實際溫度,因為有小數運算,所以定義的tt是float浮點型變量
    wen_du= tt*10+0.5;     //放大10倍輸出并四舍五入(將溫度放大10倍可以得到小數部分)
}

/********液晶寫入指令函數與寫入數據函數,以后可調用**************/

void write_1602com(uchar com)//****液晶寫入指令函數****
{
    RS=0;//數據/指令選擇置為指令
//    rw=0; //讀寫選擇置為寫
    LCD1602=com;//送入數據
//    delay(10);
    EN=1;//拉高使能端,為制造有效的下降沿做準備
    delay(10);
    EN=0;//en由高變低,產生下降沿,液晶執行命令
}


void write_1602dat(uchar dat)//***液晶寫入數據函數****
{
    RS=1;//數據/指令選擇置為數據
//    rw=0; //讀寫選擇置為寫
    LCD1602=dat;//送入數據
//    delay(10);
    EN=1; //en置高電平,為制造下降沿做準備
    delay(10);
    EN=0; //en由高變低,產生下降沿,液晶執行命令
}


void lcd_init()//***液晶初始化函數****
{
    uchar a;
    write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
    write_1602com(0x0c);//開顯示不顯示光標
    write_1602com(0x06);//整屏不移動,光標自動右移
    write_1602com(0x01);//清顯示
//   
    write_1602com(0x80);//日歷顯示固定符號從第一行第1個位置之后開始顯示
    for(a=0;a<16;a++)
    {
        write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分
//        delay(3);
    }
    write_1602com(0x80+0x40);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
    for(a=0;a<16;a++)
    {
        write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
//        delay(3);
    }
}
void display()
{
    if(Mode==0)
    {
        write_1602com(0x80+3);
        write_1602dat(dang+0x30);
        write_1602com(0x80+8);
        write_1602dat(wen_du/1000+0x30);
        write_1602dat(wen_du%1000/100+0x30);
        write_1602dat(wen_du%100/10+0x30);
        write_1602com(0x80+12);
        write_1602dat(wen_du%10+0x30);
        write_1602dat(0xdf);
        write_1602com(0x80+0x40+3);
        write_1602dat(shang/10+0x30);
        write_1602dat(shang%10+0x30);
        write_1602dat(0xdf);
        write_1602com(0x80+0x40+12);
        write_1602dat(xia/10+0x30);
        write_1602dat(xia%10+0x30);
        write_1602dat(0xdf);            
    }                                 
}

void KEY()
{
            //功能鍵
    if(key1==0)
    {
        delay(10);
        if(key1==0)
        {
            Mode++;
            if(Mode==3)
            Mode=0;
        }
        while(key1==0)
        {
            if(Mode==0)
                {
                //    write_1602com(0x80+0x40+6);
                    write_1602com(0x0c);
                }   
            else if(Mode==1)
                {
                    write_1602com(0x80+0x40+4);
                    write_1602com(0x0f);
                }   
            else
                {
                    write_1602com(0x80+0x40+13);
                    write_1602com(0x0f);
                }                           
        }
    }
    //增加
    if(key2==0&&Mode==1)
    {
        delay(10);
        if(key2==0)   
        {
            shang++;
            if(shang>=99)   
            shang=99;
            write_1602com(0x80+0x40+3);
            write_1602dat(shang/10+0x30);
            write_1602dat(shang%10+0x30);
            write_1602com(0x80+0x40+4);   
        }
        while(key2==0);
        
    }
    //減少
    if(key3==0&&Mode==1)
    {
        delay(10);
        if(key3==0)
        {
            shang--;
            if(shang==xia)   
            shang=xia+1;
            write_1602com(0x80+0x40+3);
            write_1602dat(shang/10+0x30);
            write_1602dat(shang%10+0x30);
            write_1602com(0x80+0x40+4);   
        }
        while(key3==0);
    }
    if(key2==0&&Mode==2)
    {
        delay(10);
        if(key2==0)   
        {
            xia++;
            if(xia==shang)   
            xia=shang-1;
            write_1602com(0x80+0x40+12);
            write_1602dat(xia/10+0x30);
            write_1602dat(xia%10+0x30);
            write_1602com(0x80+0x40+13);   
        }
        while(key2==0);
        
    }
    //減少
    if(key3==0&&Mode==2)
    {
        delay(10);
        if(key3==0)
        {
            xia--;
            if(xia<=0)   
            xia=0;
            write_1602com(0x80+0x40+12);
            write_1602dat(xia/10+0x30);
            write_1602dat(xia%10+0x30);
            write_1602com(0x80+0x40+13);   
        }
        while(key3==0);        
    }
}
void zi_dong()//自動溫控模式
{
    if(wen_du<(xia*10)){dj=0;dang=0;SN=0;TR0=0;}//低于下限  檔位為0 電機停止
    if((wen_du>=(xia*10))&&(wen_du<=(shang*10)))//溫度大于下限,小于上限  1擋
    {
        dang=1;
        SN=1;                                            //檔位置1
        TR0=1;        
    }
    if(wen_du>(shang*10)){dj=1;dang=2;SN=1;TR0=0;}//高溫全速
}

void init()
{
    TMOD=0x01;
    TH0=0xec;
    TL0=0x78;
    ET0=1;
    TR0=0;
    EA=1;
}
void main()          //主函數
{
    uchar j;
    dj=0;          //電機
    for(j=0;j<80;j++)      //先讀取溫度值,防止開機顯示85
    ReadTemperature();
    delay(500);
    shang=30;
    xia=20;          //初始上下限值
    ReadTemperature();
    lcd_init();
    init();
    while(1)              //進入while循環
    {   
        ReadTemperature();    //讀取溫度值
        KEY();//按鍵掃描函數
        display();     //調用顯示函數
        zi_dong();
    }
}

void T0_time() interrupt 1
{
    TH0=0xec;
    TL0=0x78;
    dj=!dj;
}


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

使用道具 舉報

沙發
ID:328014 發表于 2021-6-4 22:02 | 只看該作者
來看一下51hei論壇里面解決此問題的痛苦經歷吧:
搜索"1602 方塊"或者"1602 黑塊"或者"1602 白塊"或者"1602 格":

這個是io口設置問題,最終搞定了:http://www.zg4o1577.cn/bbs/dpj-199732-1.html
http://www.zg4o1577.cn/bbs/dpj-168643-1.html

既有可能是軟件問題也有硬件問題
http://www.zg4o1577.cn/bbs/dpj-187378-1.html
http://www.zg4o1577.cn/bbs/dpj-160754-1.html
回復

使用道具 舉報

板凳
ID:141497 發表于 2021-6-4 22:15 | 只看該作者
樓主要學會自己一步一步排查問題,先從硬件開始,然后再軟件,每個硬件可以寫一組測試軟件,所有的硬件單個測試正常再組合到一起就是一個完整的工程。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:88256 發表于 2021-6-4 22:17 | 只看該作者
把R5、R6先拆掉,換上微調電阻調一下試試,并不是所有的液晶對比度都是一樣的

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:922419 發表于 2021-6-4 22:18 | 只看該作者
51jia 發表于 2021-6-4 22:15
樓主要學會自己一步一步排查問題,先從硬件開始,然后再軟件,每個硬件可以寫一組測試軟件,所有的硬件單個 ...

我用萬用表 測過了 各個引腳的連接 都是沒有問題的 就是不出現象 不知道咋辦了
回復

使用道具 舉報

6#
ID:96682 發表于 2021-6-5 02:20 來自觸屏版 | 只看該作者
lithium0 發表于 2021-6-4 22:18
我用萬用表 測過了 各個引腳的連接 都是沒有問題的 就是不出現象 不知道咋辦了

圖片中好像看排阻有搭焊的現象還是拍攝角度的問題實際沒搭焊呢?
回復

使用道具 舉報

7#
ID:155507 發表于 2021-6-5 06:56 | 只看該作者
可能的原因:
LCD1602顯示問題一般是
1:V0沒接電位器,導致背光  V0引腳 這個引腳必須不能懸空啊 要連接一個滑動變阻器來調節的
2:RS,RW,EN接線問題
3:程序指令問題。
4:如果是自己制作最小系統需要注意排阻的方向,排阻有一個公共端,正對排阻上的標號(一般是A103j)最左邊有個方塊標記那個就是公共端。  我知道的LCD1602有兩種,一個是VO腳接18歐的下拉電阻接地,一個是接1k歐的電阻接地,當然,也可以接個滑動變阻器更好 V0口所接的3296 10k電位器一邊接GND,中間接V0,另一邊要接VCC

5. 芯片一樣嗎?IO口不一致而程序未作修改?晶振未起振?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区视频 | 午夜爽爽男女免费观看hd | 涩在线| 在线播放国产一区二区三区 | 欧美性受xxx | 91在线视频观看免费 | www.久久久久久久久久久 | 在线观看中文字幕亚洲 | 久久精品免费看 | 中国黄色毛片视频 | 做a的各种视频 | 久久精品亚洲精品国产欧美 | 日韩欧美成人一区二区三区 | 岛国av免费观看 | 亚欧精品一区 | 亚州一区二区三区 | 天天视频一区二区三区 | 亚洲一区二区在线视频 | 免费一区二区 | 999热在线视频 | 日韩精品一区二区三区免费视频 | 日韩精品一区二区三区在线播放 | 国产黄色小视频在线观看 | 国产精品一区二区福利视频 | 日本精品一区二区三区视频 | 91在线电影 | 日日人人 | 亚洲成人免费视频在线观看 | 97超碰在线免费 | av午夜电影| 久久久黑人 | 午夜精品一区二区三区在线播放 | 中文字幕精品一区 | 国产精品海角社区在线观看 | 精品视频在线观看 | 日韩一区在线播放 | 中文字幕第二区 | av大片在线观看 | 国产一区不卡 | 99热热| 中国一级大毛片 |