1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      采用mega8 和18b20的溫度采集程序

      更新時間: 2006-03-06 16:15:54來源: 粵嵌教育瀏覽量:2993

      本程序為采用mega8 和18b20的溫度采集程序
      選用mega8內部8M RC震蕩,18b20 數據線接pd6,數據線和vcc間接一4.7k上拉電阻
      感謝dfgeoff 嗜血蝸牛提供的資料*/

      #include <iom8v.h> //和單片機類型相對應的頭文件,選擇Atmega8做實驗;
      #include <macros.h>
      #define uchar unsigned char
      #define uint unsigned int
      void init_1820();
      write_1820(uchar x);
      uchar read_1820();
      void send_byte(uchar x);
      void delay(uint x);
      void disp_led(uchar buffer,uchar control);
      uchar disp_table[16] = {
      0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
      uchar dp;
      long count;
      void main(void) //主函數
      {
      disp_led(0,0);
      delay(2000);
      OSCCAL=0X9d;//系統時鐘校準,不同的芯片和不同的頻率,
      DDRC=0xff;
      DDRD=0XFF;
      PORTD=0XFF;
      WDR(); //看門狗計數清零
      WDTCR=0x0F;
      PORTC=0xff;
      while(1)
      {
      uchar i,temh,teml;
      init_1820(); //復位18b20
      write_1820(0xcc); // 發出轉換命令
      write_1820(0x44);
      delay(400);
      init_1820();
      WDR();
      write_1820(0xcc); //發出讀命令
      write_1820(0xbe);
      teml=read_1820(); //讀數據
      temh=read_1820();
      //for(i=0;i<7;i++) //測試用
      //{
      //send_byte(0x40);
      //send_byte(disp_table[0&0x0f]);
      //}
      //send_byte(disp_table[temh>>4]);
      //send_byte(disp_table[temh&0x0f]);
      //send_byte(disp_table[teml>>4]);
      //send_byte(disp_table[teml&0x0f]);
      count=(temh*256+teml)*6.25; //計算具體溫度
      WDR();
      disp_led(0,1); //顯示溫度
      for(i=0;i<100;i++) //每次轉換需要延時200ms以上
      delay(1000);
      }
      }
      void delay(uint x) //1.5us左右
      {
      while(x)
      {
      x--;
      }
      }
      void init_1820()
      {
      PORTD|=(1<<6);
      PORTD&=~(1<<6);
      delay(3000); //480us以上
      PORTD|=(1<<6);
      DDRD&=~(1<<6);
      delay(40); //15~60us
      while(PIND&(1<<6))
      {
      // disp_led(3,0);
      // for(;;)
      //{}
      }
      DDRD|=(1<<6);
      PORTD|=(1<<6);
      delay(150); //60~240us
      }
      write_1820(uchar x)
      {
      uchar m;
      for(m=0;m<8;m++)
      {
      PORTD&=~(1<<6);
      if(x&(1<<m)) //寫數據,從低位開始
      PORTD|=(1<<6);
      else
      PORTD&=~(1<<6);
      delay(40); //15~60us
      PORTD|=(1<<6);
      }
      PORTD|=(1<<6);
      }


      uchar read_1820()
      {
      uchar temp,k,n;
      temp=0;
      for(n=0;n<8;n++)
      {
      PORTD&=~(1<<6);
      //delay(2);
      PORTD|=(1<<6);
      //delay(3);
      DDRD&=~(1<<6);
      k=(PIND&(1<<6)); //讀數據,從低位開始
      if(k)
      temp|=(1<<n);
      else
      temp&=~(1<<n);
      delay(50); //60~120us
      DDRD|=(1<<6);
      }
      return (temp);
      }

      void send_byte(uchar x) //以下為顯示程序
      {
      uchar i;
      for(i=0;i<8;i++)
      {
      PORTC&=~(1<<5); // PC5為底 為164提供時鐘信號
      if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判斷每位數據的電平,及小數點判斷
      PORTC|=(1<<4); //若為高著PC4輸出高電平
      else
      PORTC&=~(1<<4); //若為低著輸出低電平
      PORTC|=(1<<5); //PC5 提供始終信號
      }
      //PORTC|=((1<<0)|(1<<1)|(1<<2));
      }
      //顯示程序 CONTROL為控制顯示 BUFFER為顯示數據
      void disp_led(uchar buffer,uchar control)
      {
      uchar i,temp[6];
      uint tempcount;
      dp=0;
      switch(control)
      {
      case 0: //CONTROL為零全部數碼管顯示buffer
      {
      for(i=0;i<11;i++)
      send_byte(disp_table[buffer%10]);//顯示數字
      break;
      }
      case 1: //control為1,顯示count中的數據為6位
      {
      tempcount=count;
      for(i=0;i<6;i++) //取出每位中的數據
      {
      temp[i]=tempcount%10;
      tempcount/=10;
      }
      send_byte(disp_table[buffer/10]); //開始顯示buffer數據
      send_byte(disp_table[buffer%10]);
      send_byte(0x00);
      send_byte(0x00);
      send_byte(0x00);
      for(i=0;i<6;i++)
      {
      if(i==3)
      dp=1; //小數點控制位
      send_byte(disp_table[temp[5-i]]);
      dp=0;
      }
      break;
      }
      }
      PORTC|=(1<<4);
      }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕在线观看久热 | 在线精品亚洲一区二区三区动态图 | 日本性视频高清天天摸天 | 亚洲日韩国产另类 | 一本大道香蕉在线精品亚洲 | 亚洲午夜精品国产自 |