欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
自己看書寫的一個DS18B20溫度傳感器溫度報警器單片機程序
[打印本頁]
作者:
a358828564
時間:
2019-9-9 11:44
標題:
自己看書寫的一個DS18B20溫度傳感器溫度報警器單片機程序
這個是我的課件做的,所以電路圖不知道怎么畫 就用畫圖程序畫了一個,將就看吧,功能很簡單就是檢測溫度的高低,高于某個值就報警,蜂鳴器響,同理低于某個值也響,最高值和最低值可以通過修改源碼初始化值重新編譯下載到單片機里,當然,我也設置了功能按鍵,可以通過diy板上的鍵設置這兩個值,區別在于每次斷電后這兩個值會恢復到源碼里面設置那個值,好了上圖上源碼
圖片2.png
(472.79 KB, 下載次數: 45)
下載附件
diy成品演示
2019-9-9 11:41 上傳
圖片1.png
(29.67 KB, 下載次數: 57)
下載附件
diy板接線電路圖
2019-9-9 11:41 上傳
單片機源程序如下:
//采用共陰極數碼管
//P0接數碼管段選 可加一個排阻
//P2接數碼管位選
//P1^1接溫度傳感器
//P1^0接蜂鳴器(需要一個三極管放大來驅動蜂鳴器,通常是8550)
//僅供參考(八哥)
/*****************************************************************************/
//程序部分開始//
/****************************************************************************/
//頭文件
#include <reg51.h>
/*****************************************************************************/
//數碼管的段碼編碼
unsigned char code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的數組可以顯示數值外,還可以顯示數碼管的點
unsigned char code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
unsigned char code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned int sec = 0,item_h=300,item_l=100;
bit w = 0;
bit v = 1;
/*****************************************************************************/
sbit KEY_1 = P1^4;
sbit KEY_2 = P1^5;
sbit KEY_3 = P1^6;
sbit KEY_4 = P1^7;
sbit led_r = P1^3;
sbit led_g = P1^2;
sbit DQ = P1^1;//ds18B20
sbit beep = P1^0;//蜂鳴器
/******************************************************************************/
//DS18B20溫度傳感器驅動(顯示0至60度)
/******************************************************************************/
void Delay(int num){//延時函數
while(num--) ;
}
/****************************************************************************/
void Delay_1ms(unsigned int a){//延時函數 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
/****************************************************************************/
/******************************************************************************/
void Init_DS18B20(void){//初始化ds1820
unsigned char x=0;
DQ = 1; //DQ復位
Delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
Delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
Delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void){//讀一個字節
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat){//寫一個字節
unsigned char i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void){//讀取溫度
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍輸出并四舍五入
return(t);
}
/*****************************************************************************/
void Display(unsigned int i)
{
unsigned char a=0,b=0,c=0;
a=i/100;
b=(i/10)%10;
c=i%10;
P0 = 0;
P2 = LED_W[3];
P0 = table[12]; //顯示C
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[2];
P0 = table[c]; //顯示小數位溫度
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[1];
P0 = table_d[b]; //顯示個位溫度,帶點顯示
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[0];
P0 = table[a]; //顯示十位溫度
Delay_1ms(7.5);
}
/*****************************************************************************/
void Beep_key(void){//-揚聲器--按鍵音
if (v == 1)
{
unsigned char a;//定義變量用于發聲的長度設置
for(a=100;a>0;a--){//聲音的長度
beep = ~beep;
Delay(50);//音調設置延時
}
beep = 1;//音樂結束后揚聲器拉高關閉
}
}
/*****************************************************************************/
void set_t(unsigned char sel)
{
if (sel==0)
{
Display(item_h);
led_r = 1;
led_g = 0;
}
if (sel==1)
{
Display(item_l);
led_r = 0;
led_g = 1;
}
if (KEY_1 == 0)
{
if (KEY_1 == 0 && sel == 0) item_h--;
if (KEY_1 == 0 && sel == 1) item_l--;
//if (KEY_1 == 0 && sel == 2) v = 1;
}
if (KEY_2 == 0)
{
if (KEY_2 == 0 && sel == 0) item_h++;
if (KEY_2 == 0 && sel == 1) item_l++;
//if (KEY_1 == 0 && sel == 2) v = 0;
}
}
/*****************************************************************************/
void main(void)
{
unsigned char e=0;
beep = 1;
while(1)
{
if(w == 0)
{
sec=ReadTemperature();//讀溫度并送顯
Display(sec);
if (sec > item_h || sec < item_l)beep = 0; //蜂鳴器響
else beep = 1;
}
else
{
if(e==0)Display(item_h);
if(e==1)Display(item_l);
}
/*******************************************************/
if (KEY_1 == 0) //減調整
{
Delay_1ms(15);
if (KEY_1 == 0 && w == 1)//調溫狀態減調整
{
Beep_key();
set_t(e);
}
}
/*******************************************************/
if (KEY_2 == 0) //加調整
{
Delay_1ms(15);
if (KEY_2 == 0 && w == 1)//調溫狀態加調整
{
Beep_key();//按鍵音
set_t(e);
}
}
/*******************************************************/
if (KEY_3 == 0) //模式調節
{
Delay_1ms(15);
if (KEY_3 == 0 && w == 0) //正常顯示狀態進入調溫狀態
{
Beep_key();
w = 1;
}
if (KEY_3 == 0 && w == 1) //調溫狀態選擇上下限調節
{
e++;
if (e>1) e = 0;
set_t(e);
}
}
/*******************************************************/
if (KEY_4 == 0) //調溫狀時退出調溫
{
Delay_1ms(15);
if (KEY_4 == 0 && w == 1)
{
Beep_key();
w = 0;
}
}
}
}
復制代碼
作者:
bhjyqjs
時間:
2019-9-10 09:06
佩服這位仁兄,用畫圖軟件畫出這么漂亮的圖
作者:
Toxic_pill
時間:
2019-9-10 10:51
兄嘚 有PCB嗎
作者:
ping264888
時間:
2019-9-10 11:26
不過晶振那裡要修改一下, 是通過電容接地, 不是直接接地.
作者:
skyline@
時間:
2021-4-20 20:53
請問一下v和w是什么,是LED燈嗎?一開始v=1,w=0,然而我的燈一開始仿真兩個LED燈都是亮的而且蜂鳴器一直響,這是為什么,大佬們幫幫忙
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1