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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

ATMEGA16與DS18B20數碼管顯示

作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月31日   【字體:


一個誤差值大的DS18B20把我害得不淺,一直以為是程序錯,下狠心換了個,成功了!誤了我三天去查程序
/*本程序為八位共陰極數碼管且有兩個573控制的動態掃描*/
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int
//注code的功能是把后面的數據存在程序存貯器中,不用code就放到了隨機存貯器中.
#pragma data: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);
}

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);
   }
}
 

關閉窗口

相關文章

主站蜘蛛池模板: 久久久久久久久国产精品 | 日韩视频免费大全中文字幕 | 欧美一级淫片bbb一84 | 久久久久九九九 | 男人午夜视频 | 91视频日本 | 国产区在线 | 日韩精品一区二区在线 | 成人免费片 | 国产精品久久久久久中文字 | 日本不卡在线视频 | 综合99 | 国产不卡视频 | 国产一区二区视频在线 | 国产蜜臀av | 免费性视频 | 老女人毛片| 美女免费视频网站 | 91蜜桃视频 | 五月婷婷激情 | 日韩久久综合 | 欧美亚洲一区二区三区 | 99久久久国产精品 | 天天操天天干天天 | 亚洲一区影院 | 午夜免费福利视频 | 久久国产影院 | 波多野结衣在线观看一区二区 | 在线观看av片 | 在线观看免费毛片 | 伊人精品久久 | 国产精品久久久久永久免费看 | 国产午夜精品一区二区三区视频 | 亚洲精品91天天久久人人 | 午夜精品国产精品大乳美女 | 久久精品观看 | www.婷婷.com | 精品国产99久久久久久宅男i | 欧美福利一区二区 | av免费看网站 | 一级大片免费看 |