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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2193|回復(fù): 7
收起左側(cè)

程序?qū)雴纹瑱C以后,1602顯示一排黑色格子。

[復(fù)制鏈接]
ID:635528 發(fā)表于 2019-11-13 18:30 | 顯示全部樓層 |閱讀模式
#include<reg52.h>                 //調(diào)用單片機頭文件
#define uchar unsigned char  //無符號字符型宏定義        變量范圍0~255
#define uint unsigned int         //無符號整型宏定義        變量范圍0~65535
#include<intrins.h>
bit flag_300ms ;
uchar menu_1;           //菜單設(shè)計的變量
sbit beep = P3^7;   //蜂鳴器IO口定義
uchar flag_200ms ;
sbit dq   = P3^3;        //18b20IO口的定義
uint temperature ;  //
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0;         //寄存器選擇信號H:數(shù)據(jù)寄存器        L:指令寄存器
sbit rw=P1^1;         //寄存器選擇信號H:數(shù)據(jù)寄存器        L:指令寄存器
sbit e =P1^2;         //片選信號下降沿觸發(fā)
unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};
uchar rate_l=50,rate_h=120;   //心跳報警值
/***********************1ms延時函數(shù)*****************************/
void delay_1ms(uint q)
{
        int i,j;
        for(i=0;i<q;i++)
                for(j=0;j<110;j++);
}
/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}
/********************************************************************
* 名稱 : write_com(ucharcom)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;
}
/********************************************************************
* 名稱 : write_data(uchardat)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=1;
        P0=dat;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;       
}
/********************************************************************
* 名稱 : write_string(ucharhang,ucharadd,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"abcdef" ,調(diào)用該函數(shù)如下
                write_string(1,5,"abcdef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_string(uchar hang, uchar add , uchar *p )
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)
        {
                if(*p == '\0')  break;
                write_data(*p);
                p++;
        }       
}
/*****************控制光標函數(shù)********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{               
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        if(date == 1)
                write_com(0x0f);     //顯示光標并且閃爍       
        else
                write_com(0x0c);   //關(guān)閉光標
}       


/***********************lcd1602上顯示兩位十進制數(shù)************************/
void write_sfm3(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);       
}
/***********************lcd1602初始化設(shè)置************************/
void init_1602()
{
        write_com(0x38);        //
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x00);
        delay_uint(1000);
        write_string(1,0," 000/min00.00   ");       
        write_string(2,0,"  H:000L:000  ");
}

/*************定時器0初始化程序***************/
void time_init()       
{
        EA   = 1;                  //開總中斷
        TMOD = 0X01;          //定時器0、定時器1工作方式1
        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時
}
/***********************lcd1602上顯示兩位十進制數(shù)************************/
void write_sfm3_18B20(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data('.');
        write_data(0x30+date%10);       
}
/***********外部中斷0初始化程序****************/
void init_int0()          //外部中斷0初始化程序
{
        EX0=1;                          //允許外部中斷0中斷
        EA=1;                          //開總中斷
        IT0 = 1;                   //外部中斷0負跳變中斷
}

/********************獨立按鍵程序*****************/
uchar key_can;         //按鍵值
void key()         //獨立按鍵程序
{
        static uchar key_new;

        key_can = 20;                   //按鍵值還原
        P3 |= 0x78;                     //對應(yīng)的按鍵IO口輸出為1
        if((P3 & 0x78) != 0x78)                //按鍵按下
        {
                delay_1ms(1);                //按鍵消抖動
                if(((P3 & 0x78) != 0x78) && (key_new == 1))
                {                                                //確認是按鍵按下
                        key_new = 0;
                        switch(P3 & 0x78)
                        {
                                case 0x68:  key_can = 3;  break;         //得到按鍵值
                                case 0x58:  key_can = 2;  break;         //得到按鍵值
                                case 0x38:  key_can = 1;  break;         //得到按鍵值
                        }
                }                       
        }
        else
                key_new = 1;       
}

/**********************設(shè)置函數(shù)************************/
void key_with()
{
        if(key_can == 1)        //設(shè)置鍵
        {
                menu_1++;
                if(menu_1 > 2)    //回到正常顯示
                {
                        menu_1 = 0;
                        write_guanbiao(1,2,0);         //關(guān)閉光標
                        init_1602();      //初始化液晶顯示               
                }
        }
/***************設(shè)置*********************/
        if(menu_1 != 0)
        {
                if(menu_1 == 1)                  //設(shè)置上限報警
                {
                        if(key_can == 2)        //加
                        {
                            rate_h ++;
                                if(rate_h>= 255)
                                        rate_h = 0;
                        }               
                        if(key_can == 3)        //減       
                        {
                                rate_h -- ;
                                if(rate_h<= rate_l)
                                        rate_h = rate_l + 1;
                        }       
                }
                if(menu_1 == 2)                  //設(shè)置下限報警
                {
                        if(key_can == 2)        //加
                        {
                            rate_l ++;
                                if(rate_l>= rate_h)
                                        rate_l = rate_h - 1;
                        }       
                        if(key_can == 3)        //減       
                        {
                                if(rate_l == 0x00)
                                        rate_l = 1;
                                rate_l -- ;                       
                        }
                }
                write_sfm3(2,4,rate_h);           //
                write_sfm3(2,11,rate_l);           //
                switch(menu_1)           // 光標顯示
                {
                        case 1:  write_guanbiao(2,4,1);  break;
                        case 2:  write_guanbiao(2,11,1);  break;
                }       
        }
}

/****************報警函數(shù)***************/
void clock_h_l()
{
        static uchar value;
        if(rate != 0)
        {
                if((rate<= rate_l) || (rate>= rate_h))
                {
                        value ++;  //消除實際距離在設(shè)定距離左右變化時的干擾
                        if(value>= 2)
                        {
                                beep = ~beep;           //蜂鳴器報警                       
                        }       
                }
                else
                {
                        beep = 1;        //取消報警
                }
        }else
        {
                beep = 1;   //取消報警       
        }
                       
}
/***********************18b20初始化函數(shù)*****************************/
void init_18b20()
{
        bit q;
        dq = 1;                                //把總線拿高
        delay_uint(1);            //15us
        dq = 0;                                //給復(fù)位脈沖
        delay_uint(80);                //750us
        dq = 1;                                //把總線拿高等待
        delay_uint(10);                //110us
        q = dq;                                //讀取18b20初始化信號
        delay_uint(20);                //200us
        dq = 1;                                //把總線拿高釋放總線
}
/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         //寫數(shù)據(jù)是低位開始
                dq = 0;                         //把總線拿低寫時間隙開始
                dq = dat&0x01; //向18b20總線寫數(shù)據(jù)了
                delay_uint(5);         // 60us
                dq = 1;                         //釋放總線
                dat >>= 1;
        }       
}
/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把總線拿低讀時間隙開始
                value>>= 1;         //讀數(shù)據(jù)是低位開始
                dq = 1;                         //釋放總線
                if(dq == 1)                 //開始讀寫數(shù)據(jù)
                        value |= 0x80;
                delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
        }
        return value;                 //返回數(shù)據(jù)
}

/*************讀取溫度的值讀出來的是小數(shù)***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
        delay_uint(50);                   //500us
        init_18b20();                   //初始化18b20
        EA = 0;
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發(fā)出讀取暫存器命令
        EA = 1;
        low = read_18b20();           //讀溫度低字節(jié)
        value = read_18b20();  //讀溫度高字節(jié)
        value<<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.625;               //轉(zhuǎn)換到溫度值小數(shù)
        return value;                   //返回讀出的溫度帶小數(shù)
}
/****************主函數(shù)***************/
void main()
{       
        init_1602();                    //1602初始化
        time_init();                    //初始化定時器
        init_int0();          //外部中斷0初始化程序
        while(1)
        {                       
                key();                                         //按鍵函數(shù)
                if(key_can<10)
                {
                        key_with();                         //按鍵處理函數(shù)
                }
                if(displayOK==0)//如果顯示關(guān)
                {
                        rate = 0;
                }
                else//如果顯示開
                {
        rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
                }
                write_sfm3(2,5,rate);
                flag_200ms ++;
                if(flag_200ms>= 200)        //200ms
                {
                        flag_200ms = 0;
                        write_sfm3(1,5,rate);
                        clock_h_l();    //報警函數(shù)
                        temperature = read_temp();        //先讀出溫度的值
                        write_sfm3_18B20(1,10,temperature);
                }
                delay_1ms(1);
        }
}

void int0() interrupt 0
{
        if(timecount<6)   //
        {
                        TR0=1;//開定時器
        }
        else
        {
                time[i]=timecount*50+TH0+TL0;//
                timecount=0;//100ms
                i++;
                if(i==6)//記
                {
                        i=1;//
                        displayOK=1;    //
                }                                                               
        }
}
/*************定時器1中斷服務(wù)程序***************/
void time0_int() interrupt 1
{       
        TH0 = 0x3c;
        TL0 = 0xb0;     //
        timecount++;//
        if(timecount>6)     //
        {
                        i=0;//
                        timecount=0;//計數(shù)清零
                        displayOK=0;//顯示關(guān)
                        TR0=0;//定時器關(guān)
        }
}

回復(fù)

使用道具 舉報

ID:25310 發(fā)表于 2019-11-14 05:55 | 顯示全部樓層
檢查硬件連接,上圖看看。一般問題都出之細節(jié)。
回復(fù)

使用道具 舉報

ID:635528 發(fā)表于 2019-11-14 19:05 | 顯示全部樓層
pcbboy 發(fā)表于 2019-11-14 05:55
檢查硬件連接,上圖看看。一般問題都出之細節(jié)。

今天重新下載了以下程序之后,不顯示黑色格子了。但是就變成了一片白
IMG_20191114_185619.jpg
回復(fù)

使用道具 舉報

ID:524818 發(fā)表于 2019-11-15 08:45 | 顯示全部樓層
這個程序是自己對照硬件接線順序自己寫的嗎?看看程序中指定的I/O口和硬件連接相符嗎?如果對就調(diào)調(diào)對比度電位器試試
回復(fù)

使用道具 舉報

ID:635528 發(fā)表于 2019-11-17 13:55 | 顯示全部樓層
cphnkj188 發(fā)表于 2019-11-15 08:45
這個程序是自己對照硬件接線順序自己寫的嗎?看看程序中指定的I/O口和硬件連接相符嗎?如果對就調(diào)調(diào)對比度 ...

是的 現(xiàn)在還沒有連溫度監(jiān)測 和紅外線檢測的硬件 就是單單連接了1602. 1602的rs rw e 分別是2.7、2.6、2.5
下完程序之后是兩行黑色格子
回復(fù)

使用道具 舉報

ID:93224 發(fā)表于 2019-11-17 15:45 | 顯示全部樓層
調(diào)節(jié)下電位器,調(diào)整亮度,然后檢查下程序和電路
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-11-17 21:39 | 顯示全部樓層
/********************************************************************
* 名稱 : write_data(uchardat)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=1;//這里錯........rw=0;
        P0=dat;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;        
}
回復(fù)

使用道具 舉報

ID:635528 發(fā)表于 2019-11-20 18:46 | 顯示全部樓層
wulin 發(fā)表于 2019-11-17 21:39
/********************************************************************
* 名稱 : write_data(uchardat) ...

顯示了 謝謝大家的幫助
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 超碰在线影院 | 亚洲韩国精品 | 欧美福利影院 | 一区二区国产在线 | 国产精品成人在线播放 | 国产免费一区二区 | 国产午夜视频 | 久久国产一区二区三区 | 日本国产高清 | 欧美日韩电影一区 | 91久久国产综合久久 | 国产亚洲欧美另类一区二区三区 | 日韩在线h| 91精品国产综合久久久久久丝袜 | 久久久女女女女999久久 | 欧美在线成人影院 | 午夜在线视频一区二区三区 | 欧美视频精品 | 欧美视频一区二区三区 | 国产美女视频一区 | heyzo在线| 狠狠干五月天 | 国产精品久久九九 | 国产精品综合视频 | 欧美高清成人 | 亚洲高清在线观看 | 69性欧美高清影院 | 蜜桃视频一区二区三区 | 羞羞视频在线观看网站 | 欧美日韩一区二区三区在线观看 | 一a一片一级一片啪啪 | 麻豆av电影网 | 精品久久久久久久久久 | 天天插天天干 | 中文字幕在线中文 | 亚洲国产成人精品女人久久久野战 | 免费视频一区二区 | 久久久蜜臀国产一区二区 | 免费xxxx大片国产在线 | www.日本在线观看 | 一呦二呦三呦国产精品 |