欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

51單片機18B20溫度與串口實驗

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年10月25日   【字體:

有圖有真相





溫度顯示在串口調速器上,此軟件可到 http://www.raoushi.com/mcudown/ 單片機開發實用工具軟件這一欄下載
下面單片機部分的源代碼:
 

//11.0592晶振
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
code uchar seg[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};   //數碼管碼表
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};   //數碼管位選

//sbit k8=P1^7;   //按鍵發送溫度值
sbit dec=P0^5;   //小數點顯示位
static uint count;     //延時發送溫度值變量
void delay(uint k)
{
 while(k--);
}
void show_temp(uint k)    //顯示溫度值函數
{
 P0=seg[k/100];
 P2=tab[2];
 delay(30);
 P0=0xff;
 P2=0xff;
 P0=seg[k%100/10];
 dec=0;       //顯示小數點
 P2=tab[1];
 delay(30);
 P0=0xff;
 P2=0xff;
 P0=seg[k%10];
 P2=tab[0];
 delay(30);
 P0=0xff;
 P2=0xff;
}
#include "18B20.h"        //18B20庫函數
 
uchar suf;      //存放串口收到的數據
uint temp;    //輸出溫度值
 
void serial_init()   //串口初始化
{
   TMOD|=0x20;   //定時器設定自動重撞在模式
   TH1=TL1=0xfd;  //9600波特率
   SM2=0;       //無多機處理位
   SM1=1;     // 8位可變波特率模式
   SM0=0;
   TR1=1;         //  定時器1打開
   REN=1;         //串口接收使能
}
void send_byte(uchar u)   //發送一個字節函數
{
   bit es;    //保存先前ES狀態變量,這樣可以不干擾其他用戶用它是現在的狀態
   es=ES;
   ES=0;     //暫時關閉串口中斷
   SBUF=u;    //數據放入SBUF緩沖器等待發送完成
   while(TI==0);   //等待發送完成
   TI=0;
   ES=es;     //恢復先前狀態
}
void send_str(uchar *p) //發送一串字符函數
{
   while(*p)
   {
 send_byte(*p);
 p++;
   }
}
void str_init()   //串口中斷初始化
{
 EA=1;
 ES=1;
}
void serial_event() interrupt 4   //串口中斷函數
{
   if(RI==1)   //在中斷里盡量只做需要的事情
   {
    suf=SBUF;
 RI=0;
   }
   else
   {
 ;
 }
}
void send_number(uchar *p,uint k)    //通過串口發送溫度值函數
{
 while(*p)
 {
  send_byte(*p);
  p++;
 }
 send_byte(' ');
 send_byte(' ');
 send_byte(k/100+48);
 send_byte(k%100/10+48);
 send_byte('.');
 send_byte(k%10+48);
 send_byte('\r');
 send_byte('\n');
}
/*
void key8()             //按鍵發送函數
{
  static uchar i,j;
  if(k8==0)
  {
 if(i==0)
 {
  j++;
  if(j>3)
  {
   i=1;j=0;
   send_number("the temperature is  ",temp);
  }
 }
  }
  else
  {
   i=0;
   j=0;
  }
}
*/
void main()
{
   serial_init();       //串口初始化
   send_byte(12);  //超級終端清屏
   send_str("serial_init is ok \r\n");    //初始化好壞標示字符串
   str_init();           //串口中斷初始化
   send_str("str_init is ok \r\n");
 while(1)               
 {
   count++;  
   temp=read_18b20();
   show_temp(temp);
   if(count>500)     //約沒3秒發送一次溫度值給串口
   {
   send_number("The temperature is ",temp);
   count=0;
   }
   else
   {
   }
 }
}
 
//-----------------------18B20----庫函數----------------
sbit dq=P3^4;   //18B20數據口
void send_1()  //發送1位1函數
{
  dq=0;
  dq=0;
  dq=0;
  dq=1;
  delay(2);
}
void send_0() //發送1位0函數
{
  dq=0; 
  delay(2);
  dq=1;
}
void Tsend_byte(uchar dat)
{
 uchar i;
 for(i=0;i<8;i++)
 {
  if(dat&0x01)send_1();
  else send_0();
  dat>>=1;
 }
}
uchar read_byte()   //18B20讀取數據函數
{
  uchar i,byte;
  for(i=0;i<8;i++)
  {
    dq=0;
 dq=0;
 dq=1;
 dq=1;
 byte>>=1;
 if(dq==1)
 {
  byte=byte+0x80;  //如果采樣為1則最高位為1
 }
 delay(3);
  }
  return byte;
}
uchar start_18b20() //啟動18b20實質上判斷有誤應答信號
{
  static uint cnt;
  dq=0;
  delay(62);
  dq=1;
  while(dq==1)  //等待拉低
  {
 cnt++;
 if(cnt>50000)
 {
 cnt=0;
 return 1;  //等待超時判斷說明器件壞了
 }
  }
   while(dq==0)             
   {
 cnt++;
 if(cnt>50000)
 {
  cnt=0;
  return 1;
 }
   }
   return 0;       //正常啟動返回0值
}
uint read_18b20()  //讀取溫度值函數
{
  uchar TH,TL;
  uint temp;
  start_18b20();
  Tsend_byte(0xcc);
  Tsend_byte(0x44);
  ;;
  start_18b20();
  Tsend_byte(0xcc);
  Tsend_byte(0xbe);
   TL=read_byte();
   TH=read_byte();
   temp=TH;
   temp<<=8;
   temp=temp+TL;
   /*if(temp&0xf800)   //如果最高位為1則是溫度為負值   .可以設置溫度負值符號
   {
 temp=~temp+1;
   }
   */
   temp=temp*0.0625*10;   //顯示小數部分
   return temp;
}
關閉窗口

相關文章