新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 集溫度與時間在液晶上的顯示設計

        集溫度與時間在液晶上的顯示設計

        作者: 時間:2016-11-27 來源:網絡 收藏
        集溫度與時間在液晶上顯示的智能電子體溫計設計是我大二時自學51單片機又看完郭天祥大俠的新概念單片機后自己動手搭板子,自己寫
        程序調試的電路簡單得很,沒有用到74HC573,剛從硬盤里找到了這個設計,幸存已久。今朝終于得見天日,特此紀念一下過往的大學實驗室生活!
        本作品是基于現在的水銀體溫計測溫時間長,難讀或者讀數不精確的現狀下而研發的。我們知道去醫院看病或自己在家中感冒發燒要測體溫來查看。而此款體溫計是數字顯示,只要上過學就能讀體溫,相對于水銀體溫計,不會摔碎也不用擔心如何處理。只要將探測頭放入咯吱窩里,溫度變化,一旦穩定便讀出數值來,當低燒或者高燒出現時便會報警提示。除此之外,還有時間顯示,此功能讓電子體溫計更加人性化。
        此體溫計是基于51單片機+18B20+lcd1602等必要的外圍設備實現。
        電子體溫計體積小,易讀,報警。老少兒童皆能使用。
        本設計軟硬件相結合并不只是用硬件實現。性能更加穩定。傳感器+mcu+輸出顯示+輸入控制+報警的設計。
        并且此設計可以用于“家庭醫生”的系統設計,比如可以加上測脈搏、觀心跳、量血壓等一體的系統設計。方便家人足不出戶便可以知道自己的身體狀況。
        使用時只要將黃豆粒大的探測頭代替水銀體溫計放到胳肢窩。然后觀察示數變化,待穩定不再變化后便是體溫數值。
        本設計軟硬件相結合并不只是用硬件實現。性能更加穩定。傳感器+mcu+輸出顯示+輸入控制+報警的設計。
        此設計可以用于“家庭醫生”的系統設計,比如可以加上測脈搏、觀心跳、量血壓等一體的系統設計。方便家人足不出戶便可以知道自己的身體狀況。
        如果只是單獨測量體溫可以用更小的單片機來替換,小巧靈活,精美。

        此設計完全可以投入市場,效益可觀。

        本文引用地址:http://www.104case.com/article/201611/322302.htm

        直接貼程序

        #include
        #include
        #define uint unsigned int
        #define uchar unsigned char
        uchar code table1[]={"Cur Temp: . "};
        uchar code table2[]={"Cur Tim: :00: "};
        uint temp=0;
        uint a,b;
        uchar miao,shi,fen,s1num;
        float ftemp=0;
        sbit dq=P2^0;
        sbit bee=P2^1;
        sbit k1=P3^3;
        sbit k2=P3^6;
        sbit k3=P3^7;
        sbit rs=P3^4;
        sbit en=P3^5;
        //***********經典的延時程序6us*****************//
        void delay(uint t) //6 us
        {
        while(--t);
        }
        void delays(uint t)
        {
        uchar i;
        while(t--)for(i=110;i>0;i--);
        }
        //關于lcd1602的系列chengxu***********//
        void writecomm(uchar com)
        {
        rs=0;
        P1=com;
        en=0;
        delay(5);
        en=1;
        delay(5);
        en=0;
        }
        void writedat(uchar dat)
        {
        rs=1;
        P1=dat;
        en=0;
        delays(5);
        en=1;
        delays(15);
        en=0;
        }
        void lcd1602init()
        {
        en=0;
        fen=0;
        shi=0; //初始值 在這里設
        miao=0;
        s1num=0;
        P2=0xff;
        writecomm(0x38);
        writecomm(0x0c);
        writecomm(0x06);
        writecomm(0x01);
        }
        ////////*******溫度的系列函數*********8//
        bit ds18inti()
        {
        dq=1;_nop_();_nop_(); //延時2微妙
        dq=0;
        delay(85);//510us
        dq=1;
        delay(6); //15-60us
        if(dq) //沒應答
        {
        return 0;
        }
        while(dq); //等待變0則有應答
        {
        while(!dq); //等待應答信號完畢
        }
        return 1; //完畢?
        }
        void writeonebyte(uchar val)
        {

        uchar i;
        for(i=8;i>0;i--)
        {
        dq=1;_nop_();_nop_(); //從高拉倒低
        dq=0;_nop_();_nop_();_nop_();_nop_(); //5 us
        dq=val&0x01; //最低位移出
        delay(6); //66 us
        val=val/2; //右移1位
        }
        dq=1;
        delay(1);
        }
        //讀數據時,數據以字節的最低有效位先從總線移出
        uchar readonebyte()
        {
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)
        {
        dq=1;_nop_();_nop_();
        value>>=1;
        dq=0;_nop_();_nop_();_nop_();_nop_(); //4 us
        dq=1;_nop_();_nop_();_nop_();_nop_();_nop_(); //4 us
        if(dq)value|=0x80;
        delay(6); //66 us
        }
        dq=1;
        return(value);

        }
        //****************溫度轉換***//
        get_temp(void)
        {
        uchar a=0;
        uchar b=0;
        ds18inti();
        delay(200);
        writeonebyte(0xcc); //跳過讀序列號的操作
        writeonebyte(0x44); //啟動溫度轉換
        delay(220); //出在這 難題
        ds18inti();
        writeonebyte(0xcc); //跳過讀序列號的操作
        writeonebyte(0xbe); //讀取溫度寄存器
        a=readonebyte();//先讀低8位
        b=readonebyte();//在讀高8位
        temp=b*256+a;
        return temp;
        }
        //***********蜂鳴函數***///
        void beep()
        {
        bee=~bee;
        delays(50);
        }
        //*******在液晶上顯示溫度函數***//
        void wendu(uchar add,int dat) //int dat必須為整型 才能保證出現25.5以上的值
        {
        uchar shi,ge,shifen;
        if(dat<0)
        {
        writecomm(0x80+9);
        writedat(-);
        dat=0-dat;
        }
        else
        {
        writecomm(0x80+9);
        writedat(+);
        }
        // bai=(dat>>4)/100+0x30;
        shi=(dat>>4)%100/10;
        ge=(dat>>4)%10;
        shifen=((dat&0x000f)*62.5 )/100+0x30;
        writecomm(0x80+add);
        // writedat(bai+0x30);
        writedat(shi+0x30);
        writedat(ge+0x30);
        writecomm(0x80+13);
        writedat(shifen);


        }
        //*******在液晶上顯示時間函數***//
        void sfm(uchar add,uchar dat) //寫時分秒的子函數
        {
        uchar shi,ge;
        ge=dat%10;
        shi=dat/10;
        writecomm(0x80+0x40+add) ;
        writedat(0x30+shi) ;
        writedat(0x30+ge) ;
        }
        //*******定時器0的初始化***********、//
        void timerinti()
        {
        TMOD=0x01;
        EA=1;
        ET0=1;
        TR0=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        }

        //*********顯示時間和溫度的初始化函數**********8//
        void displaytime()
        {
        uchar num;
        writecomm(0x80);
        for(num=0;num<16;num++)
        {
        writedat(table1[num]);
        delays(5);
        }
        a=get_temp(); //yanhi
        delays(40);
        writecomm(0x80+14);
        writedat(0xdf);
        writecomm(0x80+15);
        writedat(0x43);
        delay(200);

        writecomm(0x80+0x40);
        for(num=0;num<16;num++)
        {
        writedat(table2[num]);
        delays(5);
        }
        }
        //********調用溫度和報警函數************//
        void displaywendu()
        {
        int dat;
        uchar shi,ge;
        delays(200);
        a=get_temp();
        wendu(10,a);
        dat=get_temp();
        shi=(dat>>4)%100/10;
        ge=(dat>>4)%10;
        if((shi<3)|(shi>3))beep();
        }
        //********鍵盤掃描程序***********8//
        void keyscan()
        {
        if(k1==0)
        {
        delays(5);
        if(k1==0)
        {
        s1num+=1;
        while(!k1);
        }
        switch(s1num) //從頭閃到尾 原因何在 只要有數據更新就會閃所以不能把
        { //所有的顯示函數放大循環里
        case 1:TR0=0;writecomm(0x80+0x40+14);writecomm(0x0f);break;
        case 2:writecomm(0x80+0x40+11);break;
        case 3:writecomm(0x80+0x40+8);break;
        case 4:s1num=0;writecomm(0x0c);TR0=1;break;
        default:break;
        }
        }
        //.....*****...........//
        if(s1num==1) //增加程序
        {
        if(k2==0)
        {
        delays(5);
        if(k2==0)
        {
        while(!k2);
        miao++;
        if(miao==60)
        miao=0;
        sfm(14,miao);
        }
        }

        }
        if(s1num==2)
        {
        if(k2==0)
        {
        delays(5);
        if(k2==0)
        {
        while(!k2);
        fen++;
        if(fen==60)
        fen=0;
        sfm(11,fen);
        }
        }
        }
        if(s1num==3)
        {
        if(k2==0)
        {
        delays(5);
        if(k2==0)
        {
        while(!k2);
        shi++;
        if(shi==24)
        shi=0;
        sfm(8,shi);
        }
        }
        }
        //......................//減少程序
        if(s1num==1)
        {
        if(k3==0)
        {
        delays(5);
        if(k3==0)
        {
        while(!k3);
        miao--;
        if(miao==0)
        miao=59;
        sfm(14,miao);
        }
        }

        }
        if(s1num==2)
        {
        if(k3==0)
        {
        delays(5);
        if(k3==0)
        {
        while(!k3);
        fen--;
        if(fen==0)
        fen=59;
        sfm(11,fen);
        }
        }
        }
        if(s1num==3)
        {
        if(k3==0)
        {
        delays(5);
        if(k3==0)
        {
        while(!k2);
        shi--;
        if(shi==0)
        shi=24;
        sfm(8,shi);
        }
        }
        }
        }

        void main()
        {

        lcd1602init();
        ds18inti();
        timerinti();
        displaytime();
        sfm(8,shi); // 初始顯示00:00
        sfm(11,fen);
        sfm(14,miao);
        while(1)
        {
        keyscan();

        displaywendu();
        }
        }
        void timer0() interrupt 1
        {
        uchar count;

        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;

        if(count==17)
        {
        count=0;
        miao++;
        if(miao==60)
        {
        miao=0;
        fen++;
        if(fen==60)
        {
        fen=0;
        shi++;
        if(shi==24)shi=0;
        sfm(8,shi);
        }
        sfm(11,fen);
        }
        sfm(14,miao);
        }

        }



        關鍵詞: 液晶顯示設

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 仙游县| 定日县| 白银市| 介休市| 安新县| 竹北市| 府谷县| 汉中市| 太仆寺旗| 天峨县| 鄱阳县| 嘉义县| 建宁县| 固原市| 新巴尔虎左旗| 蓬莱市| 孟津县| 隆昌县| 海丰县| 卫辉市| 浏阳市| 新干县| 滨海县| 牡丹江市| 建湖县| 东乡| 临漳县| 鲜城| 大竹县| 南川市| 锡林郭勒盟| 上高县| 麻阳| 岳阳县| 崇礼县| 泰宁县| 高台县| 吉水县| 青神县| 涞水县| 新建县|