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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3354|回復: 0
打印 上一主題 下一主題
收起左側

C51實現電子溫度計

[復制鏈接]
跳轉到指定樓層
樓主
ID:99624 發表于 2015-12-27 03:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如圖所示,使用DS18B20數字測溫傳感器,通過LCD1602顯示實時溫度,溫度超出上下限后蜂鳴器響鈴表示警報。
  工程分幾個文件,Main.c是主函數所在的代碼文件,Ctl是溫度控制代碼文件,Disp是液晶顯示代碼文件



SysHeader.h:
#ifndef SYSHEADER_H
#define SYSHEADER_H

#include
#include

#define uchar unsigned char
#define uint unsigned int

#define delayNOP( ) {_nop_();_nop_();_nop_();_nop_();}


#endif

Main.c:
#include"SysHeader.h" //系統頭文件
#include"Disp.h"   //顯示溫度
#include"Ctl.h"  //模擬控制 



void main()
{
   TMOD=0x01; //方式一
   IE=0x82;   //10000010b:允許T0中斷
   TR0=0;     //0定時器停止工作
   //Song_Tone_Pointer=Song1_Tone;//初始化音符序列基址
   //Song_Time_Pointer=Song1_Time;//音樂延時序列基址
  
   InitLCD();
   Read_Temperature( );
   Delay(50000);
   Delay(50000);
   while(1)
   {
     if(Read_Temperature( )) 
{
   Display_Temperature( );
}
DelayXus(100);
   }

Ctl.h
#ifndef CTL_H
#define CTL_H

#include"SysHeader.h"
#include"Disp.h"



//extern sbit DQ;    //控制器輸入
extern char DS18B20_IS_OK; //控制器狀態

//延時2
void Delay(uint x);

//初始化DS18B20
uchar Init_DS18B20( );

//讀一字節
uchar ReadOneByte( );


//寫一字節
void WriteOneByte(uchar dat);


//讀取溫度值
uchar Read_Temperature( );

#endif

Ctl.c
#include"Ctl.h"



sbit DQ =P3^0;   //控制器輸入
char DS18B20_IS_OK=1;//控制器狀態 


//延時2
void Delay(uint x)
{
while(--x);
}

//初始化DS18B20
uchar Init_DS18B20( )
{
uchar status;
DQ=1;
Delay(8);
DQ=0;
Delay(90);
DQ=1;
Delay(8);
status=DQ;
Delay(100);
DQ=1;
return status;
}


//讀一字節
uchar ReadOneByte( )
{
uchar i,dat=0;
DQ=1;_nop_( );
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=1;
_nop_( );
_nop_( );
if(DQ) dat|=0x80;
Delay(30);
DQ=1;
}
return dat;
}

//寫一字節
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
}
}


//讀取溫度值
uchar Read_Temperature( )
{
if(Init_DS18B20( )==1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc); //跳過序列號
WriteOneByte(0x44); //啟動溫度轉換
Init_DS18B20( );
WriteOneByte(0xcc);  //跳過序列號
WriteOneByte(0xbe);  //讀取溫度寄存器
Temp_Value[0]=ReadOneByte( ); //溫度低8位
Temp_Value[1]=ReadOneByte( ); //溫度高8位
DS18B20_IS_OK=1;
}
return DS18B20_IS_OK;
}

Disp.h
#ifndef DISP_H
#define DISP_H

#include"SysHeader.h"


extern uchar Temp_Value[2];

//音符指針,延時指針
extern uchar *Song_Tone_Pointer,*Song_Time_Pointer;
//音樂音符序列
extern uchar code Song1_Tone[];
//音樂延時序列
extern uchar code Song1_Time[];


void InitSong();

//延時1
void DelayXus(int x);


//LCD忙等待
bit LCD_Busy_Check();

//寫指令
void Write_LCD_Command(uchar cmd);

//寫數據
void Write_LCD_Data(uchar dat);

//初始化LCD
void InitLCD();


//在LCD上顯示當前溫度
void Display_Temperature( );

//設置顯示位置
void Set_LCD_POS(uchar pos);

#endif

Disp.c
#include"Disp.h"



sbit BEEP=P3^1;   //報警聲輸出
sbit LCD_RS=P1^0;  
sbit LCD_RW=P1^1;  
sbit LCD_EN=P1^2;


uchar code Temp_Disp_Title[] = ("Safe Temp<=37 C");
uchar Current_Temp_Display_Buffer[] = ("Temp:   ");

//溫度字符
uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
//溫度小數位對照表
uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT = 0;                 //當前讀取的溫度整數部分
uchar Temp_Value[2] = {0x00,0x00}; //DS18B20讀取的溫度值
uchar Display_Digit[] = {0,0,0,0}; //待顯示的各溫度數位


//聲響延時
uint code ToneDelay=65000;



//延時
void DelayMS(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}

//T0定時器控制播放
void Timer0_Play_Music( ) interrupt 1
{
TH0=ToneDelay/256;
TL0=ToneDelay%6;
BEEP=!BEEP;
}

void PlaySound()
{
  int i;
  for(i=0;i<10;i++)
  {
//Tone_Index=Song_Tone_Pointer[i];
TR0=1;//啟動定時器0
DelayMS(15);
TR0=0;//關閉定時器0
  }
}



//延時1
void DelayXus(int x)
{
uchar i;
while(x--) 
for(i=0;i<200;i++);
}


//LCD忙等待
bit LCD_Busy_Check()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P2&0x80);
LCD_EN=0;
return result;


//寫指令
void Write_LCD_Command(uchar cmd)
{
    while(LCD_Busy_Check( ));
    LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_( );
_nop_( );
    P2=cmd;
delayNOP();
    LCD_EN=1;
delayNOP();
LCD_EN=0;
}

//寫數據
void Write_LCD_Data(uchar dat)
{
     while(LCD_Busy_Check( ));
     LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
     P2=dat;
delayNOP();
     LCD_EN=1;
delayNOP();
LCD_EN=0;
}


//初始化LCD
void InitLCD()
{
     Write_LCD_Command(0x01);
DelayXus(5);
     Write_LCD_Command(0x38);
DelayXus(5);
     Write_LCD_Command(0x0c);
DelayXus(5);
     Write_LCD_Command(0x06);
DelayXus(5);
}

//在LCD上顯示當前溫度
void Display_Temperature( )
{
uchar i;

//延時值與負號標識
uchar t=150,ng=0;

//高5位全為1(0xF8)則為負數,為負數時取反加1,并設置負數標識
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++;
ng=1;//負號標識置1
}

//查表得到溫度小數部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];

//獲取溫度整數部分(高字節中的低3位與低字節中的高4位,無符號)
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);

//將整數部分分解為3位待顯示數字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT0/10;
Display_Digit[1]=CurrentT;

//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[ 9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[ 8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[ 7]=Display_Digit[3]+'0';

//高位為0時不顯示
if(Display_Digit[3]==0) 
Current_Temp_Display_Buffer[7]=' ';

//高位為0且次高位為0時,次高位不顯示
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';

//負號顯示在恰當位置
if(ng)
{
if(Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}

//在第一行顯示標題
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}

//在第二行顯示當前溫度
Set_LCD_POS(0x40);
for(i=0;i<12;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
 
//顯示溫度符號
Set_LCD_POS(0x4e);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4c);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4d);
Write_LCD_Data('C');

//超過預設溫度,報警
if(CurrentT>37)
{
  PlaySound();
}
}



//設置顯示位置
void Set_LCD_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一区二区三区在线观看 | 91久久国产综合久久91精品网站 | 久久久国产精品视频 | 婷婷二区 | 91精品国产综合久久久久蜜臀 | 日韩一区二区三区精品 | 国产亚洲精品久久久久久牛牛 | 一a级片 | 日韩欧美三区 | 色www精品视频在线观看 | 美女视频网站久久 | 成人国产在线视频 | 亚洲精品一区在线观看 | 日本不卡一区二区 | 精品粉嫩aⅴ一区二区三区四区 | 澳门永久av免费网站 | 三级视频在线观看电影 | 高清视频一区 | 国产一区二区不卡 | 九九久久精品 | 999www视频免费观看 | 国产精品18hdxxxⅹ在线 | 91精品国产高清一区二区三区 | 国产精品视频在线播放 | 视频二区国产 | 在线中文字幕国产 | a在线免费观看视频 | 97伦理电影 | 精品日韩一区二区三区av动图 | 久久久久亚洲精品 | 亚洲第1页| 中文字幕视频网 | 午夜看电影在线观看 | 草草视频在线免费观看 | 在线午夜| 日本特黄a级高清免费大片 国产精品久久性 | 精品九九九 | 精品二区| 亚洲午夜电影 | 在线免费观看日本 | 九九亚洲|