欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機+TLC2543+熱敏電阻溫度檢測源程序加電路原理圖
[打印本頁]
作者:
滴滴答答穿秋褲
時間:
2020-3-18 09:44
標題:
51單片機+TLC2543+熱敏電阻溫度檢測源程序加電路原理圖
經典溫度檢測程序,親測可用
電路原理圖如下:
0.jpg
(254.83 KB, 下載次數: 63)
下載附件
2020-3-18 19:15 上傳
元件清單
1) 萬用板
2) 單片機
3) 40腳IC座
4) LCD1602液晶
5) 16P排母座
6) 16P排針
7) TLC2543
8) 20腳ic座
9) 熱敏電阻
10) 2p排座
11) 1K電阻*2
12) 2K電阻
13) 10k電阻*2
14) 104電容
15) 10uf電容
16) 30pf電容*2
17) 12M晶振
18) 輕觸按鍵*4
19) 8550三極管
20) 蜂鳴器
21) 5mm LED燈(紅色)
22) 5mm LED燈(綠色)
23) 103電位器
24) 自鎖開關
25) DC電源插口
26) 焊錫若干
27) 導線若干
28) USB電源線或電池盒
單片機源程序如下:
#include<reg52.h> //頭文件
#include<intrins.h>
#include"eeprom.h" //調用STC89C52單片機的EEPROM控制程序
#include "math.h"
#define uchar unsigned char //宏定義
#define uint unsigned int //宏定義
#define ulong unsigned long //宏定義
#define LCD1602_dat P0 //LCD1602的數據傳輸IO口
sbit LCD1602_rs = P2^5; //LCD1602命令數據控制IO
sbit LCD1602_rw = P2^6; //LCD1602讀寫IO控制
sbit LCD1602_e = P2^7; //數據脈沖輸入
sbit beep=P2^4; //蜂鳴器IO
sbit led_1=P2^1; //超上限指示燈
sbit led_2=P2^0; //超下限指示燈
sbit key_1=P3^2;//設置按鍵
sbit key_2=P3^3;//加按鍵
sbit key_3=P3^4;//減按鍵
sbit TCL2543_EOC = P1^0; //轉換結束標志IO口
sbit TCL2543_CLK = P1^1; //I/O時鐘輸入
sbit TCL2543_ADIN = P1^2; //串行數據輸入端
sbit TCL2543_DOUT = P1^3; //串行數據輸出端
sbit TCL2543_CS = P1^4; //片選腳IO
float zhi; //暫存讀取的輸入變量
int temp; //讀取DS18B20的溫度數據
char temp_h,temp_l; //溫度上下限制存儲變量
uchar state,ms; //系統設置項變量、50ms定時變量
bit s1,beep1; //設置閃爍標志位、報警標志位
ulong AD,AD_Data=0;
uint num;
void delay(uint T) //系統延時程序
{
while(T--);
}
/******************把數據保存到單片機內部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000); //清空
byte_write(0x2000,temp_h);
byte_write(0x2001,temp_l);
byte_write(0x2060,a_a);
}
/******************把數據從單片機內部eeprom中讀出來*****************/
void read_eeprom()
{
temp_h=byte_read(0x2000);
temp_l=byte_read(0x2001);
a_a = byte_read(0x2060);
}
/**************開機自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom();
if(a_a != 1||key_2==0) //新的單片機初始單片機內問eeprom
{
temp_h=35;
temp_l=15;
a_a = 1;
write_eeprom(); //保存數據
}
}
// 其中 port 為通道: 通道0:port = 0x01 通道1:port = 0x02 通道2:port = 0x04 ...
// 片子操作文本地址 http://wenku.baidu.com/link?url=WTp8rj93fYDbqM6kYbynkqTrI5MGQFQGtgk6aDrMMdfcB0K2Q9HIrVOs-SSSCLUMOKLOS31ENJAadBSdrVMHg_YxXPYcXWC7T0rb-rINptW
uint read2543(unsigned char port) //讀取TCL2543對應模擬輸入口的AD數據,并返回數據
{
unsigned int i; //上電時,EOC=“1”,CS=“1”
uint ad_value=0;
TCL2543_CLK=0;
TCL2543_CS=0; //使能TCL2543片選
TCL2543_EOC=1;
port<<=4;
for(i=0;i<12;i++) //讀取12位的模擬量的數字數據
{
if(TCL2543_DOUT) ad_value|=0x01; //前次轉換結果的MSB即A11位數據輸出到Dout供讀數
TCL2543_ADIN=(bit)(port&0x80);
TCL2543_CLK=1; //
_nop_();
_nop_();
_nop_();
TCL2543_CLK=0;
_nop_();
_nop_();
_nop_();
port=port<<1;
ad_value=ad_value<<1;
}
TCL2543_CS=1; //鎖定片子
ad_value=ad_value>>1;
return ad_value; //返回讀取的AD值
}
/********************************************************************
* 名稱 : LCD1602_write(uchar order,dat)
* 功能 : 1602寫如數據函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void LCD1602_write(uchar order,dat) //1602 一個字節 處理
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
/********************************************************************
* 名稱 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602寫入數據函數 指針式
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void LCD1602_writebyte(uchar *prointer) //1602 字符串 處理
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
/********************************************************************
* 名稱 : LCD1602_cls()
* 功能 : 初始化1602液晶
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void LCD1602_cls() //1602 初始化
{
LCD1602_write(0,0x01); //1602 清屏 指令
delay(1500);
LCD1602_write(0,0x38); // 功能設置 8位、5*7點陣
delay(1500);
LCD1602_write(0,0x0c); //設置 光標 不顯示開關、不顯示光標、字符不閃爍
LCD1602_write(0,0x06);
LCD1602_write(0,0xd0);
delay(1500);
}
/********************************************************************
* 名稱 : show()
* 功能 : LCD1602液晶顯示程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void show() //顯示數據
{
LCD1602_write(0,0x80); //顯示位置設定
LCD1602_writebyte("Temp:"); //顯示當前溫度值
if(temp>=0) //顯示溫度整數部分
{
if(temp>999)LCD1602_write(1,0x30+temp/1000%10);
else LCD1602_writebyte(" ");
if(temp>99)LCD1602_write(1,0x30+temp/100%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+temp/10%10);
LCD1602_writebyte(".");
LCD1602_write(1,0x30+temp%10);
}else
{
LCD1602_writebyte("-"); //顯示溫度負數部分
if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+(temp*-1)%10);
LCD1602_writebyte(".");
LCD1602_write(1,0x30+temp%10);
}
LCD1602_write(1,0xdf);
LCD1602_writebyte("C ");
LCD1602_write(0,0xC0); //第二行顯示溫度上下限值
LCD1602_writebyte("H:");
if(state==1&&s1==1) //對應設置項設置時閃爍控制 //上限
{
LCD1602_writebyte(" ");
}else //顯示上限值
{
if(temp_h>=0)
{
if(temp_h>99)LCD1602_write(1,0x30+temp_h/100%10);
else LCD1602_writebyte(" ");
if(temp_h>9)LCD1602_write(1,0x30+temp_h/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+temp_h%10);
}else
{
LCD1602_writebyte("-");
if(temp_h*-1>9)LCD1602_write(1,0x30+(temp_h*-1)/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+(temp_h*-1)%10);
}
}
LCD1602_write(1,0xdf);
LCD1602_writebyte("C L:");
if(state==2&&s1==1) //對應設置項設置時閃爍控制 //下限
{
LCD1602_writebyte(" ");
}else
{
if(temp_l>=0) //顯示下限值
{
if(temp_l>99)LCD1602_write(1,0x30+temp_l/100%10);
else LCD1602_writebyte(" ");
if(temp_l>9)LCD1602_write(1,0x30+temp_l/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+temp_l%10);
}else
{
LCD1602_writebyte("-");
if(temp_l*-1>9)LCD1602_write(1,0x30+(temp_l*-1)/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(1,0x30+(temp_l*-1)%10);
}
}
LCD1602_write(1,0xdf);
LCD1602_writebyte("C");
}
/********************************************************************
* 名稱 : proc()
* 功能 : 系統指示燈與報警處理
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void proc()
{
if(temp>temp_h*10) //如果當前溫度高于上限溫度
{
led_1=0; //對應指示燈點亮
}else //否則 熄滅
{
led_1=1;
}
if(temp<temp_l*10) //如果當前溫度低于下限溫度
{
led_2=0; //對應指示燈點亮
}else //否則 熄滅
{
led_2=1;
}
if(temp>temp_h*10||temp<temp_l*10) //如果當前溫度 值不處于 上下限溫度之間 這報警標志位值1 反之 置0
{
beep1=1; //開始報警
}else
{
beep1=0; //停止報警
}
}
/********************************************************************
* 名稱 : key()
* 功能 : 系統控制按鍵控制檢測程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void key()
{
if(!key_1) //判斷按鍵是否按下
{
delay(888); //延時去抖
if(!key_1) //再次判斷按鍵是否按下
{
state=(state+1)%3; //切換設置項
while(!key_1); //按鍵判斷釋放
}
}
if(state!=0) //如果系統非設置狀態 則
{
if(!key_2) //判斷按鍵是否按下//如果加按鍵按下
{
delay(888); //延時去抖
if(!key_2) //再次判斷按鍵是否按下
{
while(!key_2) show(); //按鍵判斷釋放
switch(state) //判斷當前設置項
{
case 1: //如果是上限設置
if(temp_h<99)temp_h++;
break;
case 2: //如果是下限設置
if(temp_h>temp_l+1)temp_l++;
break;
}
write_eeprom();
}
}
if(!key_3) //判斷按鍵是否按下 如果減按鍵按下
{
delay(888); //延時去抖
if(!key_3) //再次判斷按鍵是否按下
{
while(!key_3) show(); //按鍵判斷釋放
switch(state) //判斷當前設置項
{
case 1: //如果是上限設置
if(temp_h>temp_l+1)temp_h--;
break;
case 2: //如果是下限設置
if(temp_l>-40)temp_l--;
break;
}
write_eeprom();
}
}
}
}
/********************************************************************
* 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
* 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值 并返回浮點型的溫度值
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
float TempCalculate(float Rx,float B,float Revise,float BasicRx){
/*
Rx: 熱敏電阻當前阻值
B: 熱敏電阻參數B值
Revise: 校正溫度
BasicRx: 熱敏電阻25度時電阻(標稱電阻數值)
返回: 攝氏度
*/
Rx = Rx / BasicRx;
Rx = log(Rx);
Rx = (Rx) / B;
Rx = Rx + 0.003356;
Rx = 1 / Rx;
Rx = Rx - 273.13;
Rx = Rx + Revise;
return Rx;
}
/********************************************************************
* 名稱 : void main()
* 功能 : 系統主程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
float Rad; //生成運算暫存變量
LCD1602_cls();//LCD1602初始化程序調用
TMOD=0x01; //定時器0初始化配置
TH0=0x4c;
TL0=0x00; //定時初值賦值
ET0=1; //定時器0中斷打開
TR0=1; //打開定時器0
EA=1; //打開總中斷
init_eeprom();
while(1)
{
num++;
AD=read2543(0);
AD_Data=AD_Data+AD;
if(num>=30)
{
num=0;
AD_Data=AD_Data/30;
zhi=(float)AD_Data/819.0; //計算電壓值
// zhi=(float)read2543(0)/819.0; //計算電壓值
Rad=zhi/((5.0-zhi)/10000.0); //計算熱敏電阻當前阻值
//temp=(int)((temp * 0.2) +(TempCalculate(Rad,600.0,0,630) * 0.5)*10);//求出當前系統的當前溫度
temp=(int)((0.19*Rad-86)*10);//求出當前系統的當前溫度
// temp=Rad;
AD_Data=0;
}
show(); //顯示函數
key(); //按鍵處理程序
proc(); //超限處理程序
}
}
/********************************************************************
* 名稱 : void UART_1() interrupt 1
* 功能 : 定時器0中斷服務程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void UART_1() interrupt 1
{
TH0=0x4c; //重新賦值
TL0=0x00;
ms++; //50ms定時變量計時
if(ms%5==0) //區分250ms定時
{
s1=!s1; //閃爍標志位切換
if(beep1==1) beep=!beep; //判斷報警標志位是否報警
else beep=1;
}
if(ms>19) //1s定時
{
ms=0;
}
}
復制代碼
所有資料51hei提供下載:
溫度檢測資料.7z
(46.05 KB, 下載次數: 104)
2020-3-18 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
jiangyufang
時間:
2021-11-22 18:52
想問問求出當前溫度那個公式哪來的
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1