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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2365|回復: 7
收起左側

程序導入單片機以后,1602顯示一排黑色格子。

[復制鏈接]
ID:635528 發表于 2019-11-13 18:30 | 顯示全部樓層 |閱讀模式
#include<reg52.h>                 //調用單片機頭文件
#define uchar unsigned char  //無符號字符型宏定義        變量范圍0~255
#define uint unsigned int         //無符號整型宏定義        變量范圍0~65535
#include<intrins.h>
bit flag_300ms ;
uchar menu_1;           //菜單設計的變量
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:數據寄存器        L:指令寄存器
sbit rw=P1^1;         //寄存器選擇信號H:數據寄存器        L:指令寄存器
sbit e =P1^2;         //片選信號下降沿觸發
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延時函數*****************************/
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命令函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
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寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
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" ,調用該函數如下
                write_string(1,5,"abcdef;")
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
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++;
        }       
}
/*****************控制光標函數********************/
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);   //關閉光標
}       


/***********************lcd1602上顯示兩位十進制數************************/
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初始化設置************************/
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上顯示兩位十進制數************************/
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;                     //對應的按鍵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;       
}

/**********************設置函數************************/
void key_with()
{
        if(key_can == 1)        //設置鍵
        {
                menu_1++;
                if(menu_1 > 2)    //回到正常顯示
                {
                        menu_1 = 0;
                        write_guanbiao(1,2,0);         //關閉光標
                        init_1602();      //初始化液晶顯示               
                }
        }
/***************設置*********************/
        if(menu_1 != 0)
        {
                if(menu_1 == 1)                  //設置上限報警
                {
                        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)                  //設置下限報警
                {
                        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;
                }       
        }
}

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

/*************讀取溫度的值讀出來的是小數***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉換命令
        delay_uint(50);                   //500us
        init_18b20();                   //初始化18b20
        EA = 0;
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發出讀取暫存器命令
        EA = 1;
        low = read_18b20();           //讀溫度低字節
        value = read_18b20();  //讀溫度高字節
        value<<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.625;               //轉換到溫度值小數
        return value;                   //返回讀出的溫度帶小數
}
/****************主函數***************/
void main()
{       
        init_1602();                    //1602初始化
        time_init();                    //初始化定時器
        init_int0();          //外部中斷0初始化程序
        while(1)
        {                       
                key();                                         //按鍵函數
                if(key_can<10)
                {
                        key_with();                         //按鍵處理函數
                }
                if(displayOK==0)//如果顯示關
                {
                        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();    //報警函數
                        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中斷服務程序***************/
void time0_int() interrupt 1
{       
        TH0 = 0x3c;
        TL0 = 0xb0;     //
        timecount++;//
        if(timecount>6)     //
        {
                        i=0;//
                        timecount=0;//計數清零
                        displayOK=0;//顯示關
                        TR0=0;//定時器關
        }
}

回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

ID:93224 發表于 2019-11-17 15:45 | 顯示全部樓層
調節下電位器,調整亮度,然后檢查下程序和電路
回復

使用道具 舉報

ID:213173 發表于 2019-11-17 21:39 | 顯示全部樓層
/********************************************************************
* 名稱 : write_data(uchardat)
* 功能 : 1602寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
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;        
}
回復

使用道具 舉報

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

顯示了 謝謝大家的幫助
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合影院 | 亚洲精品欧美 | 免费视频一区二区 | 国产精品乱码一区二三区小蝌蚪 | 久色网| h视频在线免费观看 | 91麻豆产精品久久久久久夏晴子 | 日韩综合 | 欧美成人a∨高清免费观看 色999日韩 | 久久久www成人免费无遮挡大片 | 国内自拍视频在线观看 | 国产精品视频导航 | 成人性生交大片免费看r链接 | 色婷婷久久 | 亚洲国产精品一区二区久久 | 视频一区二区在线观看 | 九九99久久 | 激情一区二区三区 | 午夜精品一区二区三区免费视频 | 一级黄色夫妻生活 | 99re视频精品 | 一区日韩 | 精品三区 | 成人av看片| a级毛片免费高清视频 | 97免费视频在线观看 | 日韩成人免费 | 国产日韩精品久久 | 在线免费看黄 | av免费观看在线 | 请别相信他免费喜剧电影在线观看 | 亚洲视频欧美视频 | 久久国产区| 天天干天天操天天射 | 精品人伦一区二区三区蜜桃网站 | 日韩在线视频网址 | 国产精品久久国产精品久久 | 国产一区二区免费 | 欧美一区在线视频 | 亚洲综合大片69999 | 精品99在线 |