新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATMEGA16與DS18B20數碼管顯示

        ATMEGA16與DS18B20數碼管顯示

        作者: 時間:2016-12-02 來源:網絡 收藏
        一個誤差值大的DS18B20把我害得不淺,一直以為是程序錯,下狠心換了個,成功了!誤了我三天去查程序

        /*本程序為八位共陰極數碼管且有兩個573控制的動態掃描*/
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        //注code的功能是把后面的數據存在程序存貯器中,不用code就放到了隨機存貯器中.
        #pragmadata:code
        const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不帶小數點
        const table2[]={0xbf,0x86,0xdb,0xcf,0xe6,
        0xed,0xfd,0x87,0xff,0xdf};//帶小數點編碼


        /*如果用uchar table[]就放到了數據存貯器中。決不要這樣用,這樣占用空間多。*/
        /*兩個573,段碼PA3,位碼PA4*/
        //把18B20的DQ接到PC2上
        #define DQ_IN DDRC&=~BIT(2)
        //上一句是把DQ設為輸入
        #define DQ_OUT DDRC|=BIT(2)
        //上一句是把DQ設為輸出
        #define DQ_SET PORTC|=BIT(2)
        //上一句是把DQ設為高電平
        #define DQ_CLR PORTC&=~BIT(2)
        //上一句是把DQ設為低電平
        #define DQ_RD PINC&BIT(2)
        //上一句是從PC2中讀出數據
        uchar disdata[4];
        void delay(uint ms)
        {
        uint i,j;
        for(i=ms;i>0;i--)

        for(j=220;j>0;j--);

        }
        void delayus(uint us)
        {
        while(us--);
        }
        void show(uchar j,uchar k)
        {
        DDRA|=BIT(3);
        DDRA|=BIT(4);
        DDRB=0XFF;
        PORTA|=BIT(3);
        PORTB=table[j];
        PORTA&=~BIT(3);

        PORTB=0XFF;
        PORTB&=~BIT(k);
        PORTA|=BIT(4);
        PORTA&=~BIT(4);
        delay(5);
        }

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

        void show_point(uchar j,uchar k)
        {
        DDRA|=BIT(3);
        DDRA|=BIT(4);
        DDRB=0XFF;
        PORTA|=BIT(3);
        PORTB=table2[j];
        PORTA&=~BIT(3);

        PORTB=0XFF;
        PORTB&=~BIT(k);
        PORTA|=BIT(4);
        PORTA&=~BIT(4);
        delay(5);
        }
        rest_18B20()
        {
        uchar i ;
        DQ_OUT;//把DQ設為輸出
        DQ_SET;//拉高DQ
        delayus(5);
        DQ_CLR;//拉低DQ
        delayus(800);
        DQ_SET;//拉高DQ
        //delayus(550);
        DQ_IN;//把DQ設為輸入
        i=DQ_RD;
        delayus(800);
        return i;
        }
        void write_18B20(uchar dat)
        {
        uchar i;
        for(i=0;i<8;i++)
        {
        DQ_OUT;//把DQ設為輸出
        DQ_CLR;//拉低DQ
        delayus(30);
        if(dat&0x01)//判斷當前位是不是高,如果是高就執行下面語句
        {
        DQ_SET;//拉高DQ,讓總線采樣到1
        }
        else
        {
        DQ_CLR;//拉低DQ
        }
        delayus(80);
        DQ_SET;//釋放總線
        dat=dat>>1;
        }
        }
        uchar read_18B20()
        {
        uchar i,value;
        for(i=0;i<8;i++)
        {

        DQ_OUT;//把DQ設為輸出
        DQ_CLR;//拉低DQ
        value=value>>1;
        delayus(10);
        DQ_SET;//釋放總線 等MCU采樣
        DQ_IN;//把DQ設為輸入才能采樣
        if(DQ_RD)
        {
        value|=0x80;
        }

        delayus(100);
        // DQ_SET;//釋放總線
        }
        return value;
        }

        void display(uint tvalue)
        {
        disdata[0]=tvalue/1000;//百位數
        disdata[1]=tvalue%1000/100;//十位數
        disdata[2]=tvalue%100/10;//個位數
        disdata[3]=tvalue%10;//小數位
        show(disdata[0],0);
        delay(2);
        show(disdata[1],1);
        delay(2);
        show_point(disdata[2],2);
        //show(0x80,2);
        show(disdata[3],3);
        //下面這種顯示方式也可以
        /* uint i,temp[4];
        for(i=0;i<4;i++)
        {
        temp[3-i]=dat%10;
        dat=dat/10;
        }

        for(i=0;i<4;i++)
        {
        show(temp[i],i);
        delay(2);*/
        /* // 以下三句為關閉顯示,動態顯示時要用的
        DDRA|=BIT(3);
        DDRA|=BIT(4);
        DDRB=0XFF;
        }*/
        }
        void main()
        {int L,H;
        uint tvalue;
        while(1)
        {
        rest_18B20();
        write_18B20(0xcc);//跳過讀序列號
        write_18B20(0x44);//啟動溫度轉換
        delayus(50);
        //讀之前再復位一次
        rest_18B20();
        write_18B20(0xcc);//跳過讀序列號
        write_18B20(0xbe);//啟動開始采樣,讀暫存器
        delayus(50);
        L=read_18B20();//先讀低八位字節
        H=read_18B20();//后讀高八位
        tvalue=H;
        tvalue<<=8;
        tvalue=tvalue|L;
        tvalue=tvalue*0.625;//擴大10倍
        display(tvalue);
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄯善县| 滨海县| 鲁山县| 攀枝花市| 哈密市| 定陶县| 白水县| 德惠市| 南丰县| 易门县| 宝应县| 金湖县| 通江县| 罗甸县| 静海县| 方山县| 阜平县| 昔阳县| 永济市| 象山县| 山阴县| 连山| 泸州市| 麻城市| 鹰潭市| 怀来县| 永德县| 文成县| 商南县| 商丘市| 综艺| 安仁县| 西城区| 尤溪县| 陇川县| 麻阳| 正蓝旗| 新昌县| 蒙城县| 高陵县| 平顺县|