新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 電子溫度計1602液晶顯示或數碼管顯示

        電子溫度計1602液晶顯示或數碼管顯示

        作者: 時間:2016-11-28 來源:網絡 收藏
        #include
        #define uchar unsigned char
        #defineuint unsigned int
        sbit DS=P2^2; //define interface
        uint temp; // variable of temperature
        uchar flag1; // sign of the result positive or negative
        sbit dula=P2^6;
        sbit wela=P2^7;
        sbit beep=P2^3;
        //unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
        // 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
        //unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
        // 0x87,0xff,0xef};
        sbit lcden=P3^4;//液晶en端口
        sbit lcdrs=P3^5;//液晶rs端口
        void delay(uint count) //delay
        {
        uint i;
        while(count)
        {
        i=200;
        while(i>0)
        i--;
        count--;
        }
        }
        void dsreset() //DS18B20復位
        {
        uint i;
        DS=0;
        i=103;
        while(i>0)i--;
        DS=1;
        i=4;
        while(i>0)i--;
        }
        bit tmpreadbit() //DS18B20復讀取一位
        {
        uint i;
        bit dat;
        DS=0;i++; //i++ 用于延時
        DS=1;i++;i++;
        dat=DS;
        i=8;while(i>0)i--;
        return (dat);
        }
        uchar tmpread() //DS18B20復讀取一字節
        {
        uchar i,j,dat;
        dat=0;
        for(i=1;i<=8;i++)
        {
        j=tmpreadbit();
        dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里
        }
        return(dat);
        }
        void tmpwritebyte(uchar dat) //DS18B20寫一字節到單片機
        {
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb) //寫1
        {
        DS=0;
        i++;i++;
        DS=1;
        i=8;while(i>0)i--;
        }
        else
        {
        DS=0; //寫0
        i=8;while(i>0)i--;
        DS=1;
        i++;i++;
        }
        }
        }
        void tmpchange() //DS18B20數據轉換
        {
        dsreset();//復位
        delay(1);
        tmpwritebyte(0xcc);
        tmpwritebyte(0x44); // 啟動溫度轉換指令
        }
        uint tmp() //獲取溫度值
        {
        float tt;
        uchar a,b;
        dsreset();
        delay(1);
        tmpwritebyte(0xcc);
        tmpwritebyte(0xbe);
        a=tmpread();
        b=tmpread();
        temp=b;
        temp<<=8; //兩個8位的字節合并為一個16位的整型數據
        temp=temp|a;
        tt=temp*0.0625;
        temp=tt*10+0.5;
        return temp;
        }
        void write_com(uchar com)//帶個參數子函數,此段為寫指令子函數
        {
        lcdrs=0;//rs=1的時候寫數據,rs=0的時候寫指令
        P0=com;//送指令
        delay(5);//在EN=1送高脈沖的時候要在指令和rs之后延時TSP1時間(液晶見芯片時序圖)
        lcden=1;//EN高脈沖,開始送數據
        delay(5);//高電平持續TPW時間
        lcden=0;//持續后拉低電平
        }
        void write_data(uchar date)//帶個參數子函數,此段為寫數據子函數
        {
        lcdrs=1;//rs=1的時候寫數據,rs=0的時候寫指令
        P0=date;//送指令
        delay(5);//在EN=1送高脈沖的時候要在指令和rs之后延時TSP1時間(液晶見芯片時序圖)
        lcden=1;//EN高脈沖,開始送數據
        delay(5);//高電平持續TPW時間
        lcden=0;//持續后拉低電平
        }
        void write_1602(uchar add,uchar dat)//將寫指令,寫數據兩個子函數放在一個總的1602函數中,調用起來方便
        {
        write_com(0x80+0x40+add);//寫指令,也就是寫一個要寫數據的地址,指明寫數據的地址
        write_data(dat);//寫數據,寫進去要寫的東西
        }
        void init()//初始化函數
        {
        dula=0;
        wela=0;
        lcden=0;//因為EN高脈沖時才讀寫數據,所以初始化EN=0
        write_com(0x38);
        write_com(0x0c);//液晶初始化顯示模式設置,調用子函數,寫進去初始化指令碼設置其功能
        write_com(0x06);//寫完一個字符后光標地址加1
        write_com(0x80);//地址指針指向第一行第一個位置
        write_com(0x01);//初始化清除屏幕
        }
        void display(uint temp) //顯示程序
        {
        uchar A1,A2,A2t,A3;
        A1=temp/100;
        A2t=temp0;
        A2=A2t/10;
        A3=A2t;
        write_1602(1,A1+0x30);
        write_1602(2,A2+0x30);
        write_1602(3,0x2e);
        write_1602(4,A3+0x30);
        write_1602(6,C);
        }
        void main()
        {
        uchar a;
        init();
        while(1)
        {
        tmpchange();
        for(a=10;a>0;a--)
        {
        display(tmp());
        }
        if(temp>=310) //當溫度超過31度(僅作試驗用,實際可設為其他更高的值),蜂鳴器便會報警。
        {
        P1=0x00;
        beep=0;
        }
        else
        {
        beep=1;
        P1=0xff;
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 延边| 封开县| 宁德市| 梅州市| 抚州市| 荥经县| 绵阳市| 福清市| 潼关县| 邵武市| 宝坻区| 卫辉市| 甘德县| 吕梁市| 建昌县| 绩溪县| 金山区| 兖州市| 米易县| 三原县| 岢岚县| 阜宁县| 宿州市| 惠州市| 高平市| 门头沟区| 嘉荫县| 龙海市| 柯坪县| 城口县| 林口县| 隆子县| 瓮安县| 库伦旗| 兴文县| 延寿县| 南充市| 孝义市| 龙陵县| 凉城县| 邵武市|