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

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

PIC單片機:溫感器ds18B20 C語言代碼

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年10月30日   【字體:
 /*溫感器
此為自已寫的,已修正時序,自測過延時時間
采用天祥溫度轉換模塊算法
程序完整版本的下載地址:
 http://www.zg4o1577.cn/f/ds1820pic.rar  
*/
#include<pic.h>
__CONFIG(0X3B31);
#define uint unsigned int
#define uchar unsigned char
#define DQ RC1
#define DQ_DIR TRISC1
#define DQ_HIGH() TRISC1=1
#define DQ_LOW() DQ=0;TRISC1=0

unsigned char shi;           //整數十位
unsigned char ge;            //整數個位
unsigned char shifen;        //十分位
unsigned char baifen;        //百分位
unsigned char qianfen;       //千分位
unsigned char wanfen;        //萬分位

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示數組0

void delayus(char x,char y) //慧凈提供的us級的延時
{
 char z;     //定義Z
 do {     //先執行一次do
  z=y;    //把Y的值給Z
  do{;}while(--z); //do空語句,等待--z,直到z=0結束,do--while語句,延時在這產生
  }     
 while (--x);   //同理x在--,再產生延時
}

void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
 for(b=110;b>0;b--);
}
void display(char shi,char ge,char shifen,char baifen,char qianfen)
{
PORTD=table[shi];
PORTA=0x02;
delay(2);

PORTD=table[ge]|0x80; //或上0x80顯示出小數點
PORTA=0x04;
delay(2);

PORTD=table[shifen];
PORTA=0x06;
delay(2);

PORTD=table[baifen];
PORTA=0x08;
delay(2);

PORTD=table[qianfen];
PORTA=0x0a;
delay(2);
}

void init(void)
{
TRISA=0;PORTA=0x00;
TRISC=0xf0;PORTC=1;
TRISD=0;
}

void reset(void)
{
char pe=1;
while(pe)
 {
 DQ_LOW();
 delayus(2,81);       //延時502us
 DQ_HIGH();
 delayus(4,4);       //延時71us
 if(DQ==1)pe=1;  //判斷是否響應(響應時拉至低電平),沒響應時置1循環重發
 else pe=0;   //否則就是響應了,置0以退出循環
 delayus(2,81);       //延時502us
 }
}

void write_byte(char val)
{
uchar i,temp;
for(i=8;i>0;i--)     //循環8次構成一個字節
 {
 temp=val&0x01;     //取出,最低位,相與取出1
 DQ_LOW();
 delayus(1,1);       //延時15us
 if(temp==1)DQ_HIGH();   //判斷如果取出的是1時拉至高電平,發出去
 delayus(3,3);       //延時45us,如果取出的是0時,也發送去
 DQ_HIGH();      //拉高至高電平
 NOP();NOP();       //延時2us
 val=val>>1;      //右移一次以便下次取出
 }
}

uchar read_byte(void)
{
uchar i,val=0;
static bit j;   //靜態位變量,一個狀態位,不能是一個字節
for(i=8;i>0;i--)
 {
 val=val>>1;   //先移一個位
 DQ_LOW();   //拉至低電平
 NOP();NOP();NOP();NOP();NOP();NOP(); //延時6us
 DQ_HIGH();   
 NOP();NOP();NOP();NOP();    //延時4us
 j=DQ;    //讀取數據線的狀態以得到一個狀態位,進行數據處理 //所以要定義static bit j;
 if(j==1)val=val|0x80;     //數據處理:如果讀到是1先放在最高位第1位,再利用逐個后移就構與一個字節了
 delayus(1,6);       //延時30us,以重復以上步驟
 }
return(val);   //構成1個字節后返回走
}

void get_temp(void)  //01:40:26 //獲取溫度,器件匹配(多個溫感)
{
 uchar TLV,THV,num;  //tem1/tem2;還有2個字節溫度指令
 float aaa;
 uint temper;
 reset();       //復位
 write_byte(0xCC);   //跳過ROM
 write_byte(0x44);   //溫度轉換,需延時
 for(num=100;num>0;num--) //原本這里是delay(1000)延時1秒的。可效果卻是晃一下就沒了,
  display(shi,ge,shifen,baifen,qianfen); //所以用顯示的來代替延時,顯100次算得差不多就是750ms以上
 reset();     //每次操作RAM之前,需復位下18B20,再匹配下
 write_byte(0xCC);   //跳過ROM
 write_byte(0xBE);   //告訴它,接下來我就要讀你的溫度了,讀暫存器
 TLV=read_byte();   //RAM有9個字節(我們只需要2個字節LSB和MSB這兩個字節),它讀的時候都是從最低位開始讀
 THV=read_byte();   //01:45:10處+銳志在58:52分處
 DQ_HIGH();     //釋放總線
 aaa=(THV*256+TLV)*0.0625*1000; //(16位的溫度數據)*0.0625就是實際的溫度(十進制數)
 temper=(int)aaa;   //因為編譯時警告;有小數點是浮點類到整形轉換;我們用強制轉換成整形     要把小數點的值取出來(小數點不好取,用乘以100來取)
 shi=temper/10000;   //幾十點幾幾分配到五個數碼管上,四個數碼顯示的感覺怪怪的所以用五個數碼管;在1:51:00處講
 ge=temper%10000/1000;  //我是要用五個數碼管來顯示所以就是10000五位數
 shifen=temper%1000/100;  //
 baifen=temper%100/10;  //
 qianfen=temper%10;   // 
}

void main()
{
init ();
while(1)
 {
 get_temp();
 display(shi,ge,shifen,baifen,qianfen);  //沒帶形參編譯器過不了,帶類形的形參也過不了
 }
}
關閉窗口

相關文章

主站蜘蛛池模板: 欧美成人一区二免费视频软件 | 伊人伊人伊人 | 国产激情亚洲 | 亚洲欧美日韩高清 | 国产精品久久久久久模特 | 亚洲午夜小视频 | 99九九视频 | 中文字幕高清 | 欧美乱淫视频 | 久草中文在线观看 | 欧美日韩亚洲国产 | 欧美成ee人免费视频 | www.精品一区| 日本激情视频中文字幕 | 成人福利在线 | 日韩一区二区三区精品 | 国产成人精品免费 | 欧美一区二区免费 | 欧美综合一区二区 | 亚欧洲精品在线视频免费观看 | 欧美一区二区三区在线视频 | 午夜欧美一区二区三区在线播放 | 亚洲一区 | 黄网站涩免费蜜桃网站 | 成人av在线播放 | 天天久久 | 日韩视频在线一区 | 国产精品欧美一区二区三区不卡 | 日韩激情在线 | 一区二区三区国产 | 久久免费看 | 91视频在线 | 亚洲国产小视频 | 亚洲一区视频在线 | 欧美日韩国产一区二区三区 | 国产精品综合一区二区 | 亚洲区一 | 天堂av影院| v亚洲 | 欧美精品福利 | 午夜一区二区三区在线观看 |