欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于單片機的溫度傳感器程序有問題
[打印本頁]
作者:
小小周周
時間:
2019-11-20 18:04
標題:
基于單片機的溫度傳感器程序有問題
基于單片機的溫度傳感器怎么使蜂鳴器報警??在線等解釋。這是我在網上找的程序,可是單片機溫度顯示到了32度了也不報警。
單片機源程序如下:
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;//溫度傳感器信號線
sbit dula=P2^6;//數碼管段選線
sbit wela=P2^7;//數碼管位選線
sbit beep=P2^3;//蜂鳴器
uint temp;//定義整型的溫度數據
float f_temp;//定義浮點型的溫度數據
uint warn_11=270;//定義溫度下限值 是溫度值乘以10后的結果
uint warn_12=250;//定義溫度下限值
uint warn_h1=300;//定義溫度上線值
uint warn_h2=320;//定義溫度上線值
sbit led0=P1^0;//控制發光二極管
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,//帶小數點的0~9編碼
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xff,0xef};//不帶小數點的0~0編碼
void delay(uint z)//延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void)//DS1820復位,初始化函數
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//讀1位數據函數
{
uint i;
bit dat;
ds=0;i++;//i++起延時作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)//讀1個字節數據函數
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在dat里
}
return(dat);
}
void tempwritebyte(uchar dat)//想DS18B20寫一個字節數據函數
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//寫1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void)//DS18B20開始獲取溫度并轉換
{
dsreset();
delay(1);
tempwritebyte(0xcc);//寫跳過讀ROM指令
tempwritebyte(0x44);//寫溫度轉換指令
}
uint get_temp()//讀取寄存器中存儲的溫度數據
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//讀低8位
b=tempread();//讀高8位?
temp=b;
temp<<=8;//兩個字節組合為1個字
temp=temp|a;
f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨率為0.0625度
temp=f_temp*10+0.5;//乘以10表示小數點后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp;//temp是整型
}
void display(uchar num,uchar dat)//數據顯示程序
{ //num是第幾個數碼管,dat是要顯示的數字
uchar i;
dula=0;
P0=table[dat];//編碼賦給P0口
dula=1;
dula=0;
wela=0;
i=0xff;
i=i&(~((0x01)<<(num)));//用i來存儲位選數據,只有一位為0
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t)//顯示溫度數值函數t傳遞的是整型的溫度值
{
uchar i;
i=t/100;//除以100得到商,為溫度的十位
display(0,i);//在第1個數碼管上顯示
i=t%100/10;//100取余再除以10得到商,為溫度的個位
display(1,i+10);//在第2個數碼管上顯示
i=t%100%10;//100取余再用10取余,為溫度的小數位
display(2,i);//在第3個數碼管上顯示
}
void warn(uint s,uchar led)//蜂鳴器報警,燈閃爍
{//s控制音調,led控制燈
uchar i;i=s;
beep=0;//蜂鳴器響
P1=~(led);//控制相應的燈亮
while(i--)
{
dis_temp(get_temp());//用溫度顯示函數起到延時作用
}
beep=1;//蜂鳴器不響
P1=0xff;//控制相應的燈滅
i=s;
while(i--)
{
dis_temp(get_temp());//用溫度顯示函數起到延時作用
}
}
void deal(uint t)//溫度處理函數
{
uchar i;
if((t>warn_12)&&(t<=warn_11))//大于25度小于27度
{
warn(40,0x01);//第1個燈亮,蜂鳴器發出滴?
}
else if(t<=warn_12)//小于25度
{
warn(10,0x03);//第1個和第2個燈亮,蜂鳴器發出滴
}
else if((t<warn_h2)&&(t>=warn_h1))//小于32度大于30度
{
warn(40,0x04);//第3個燈亮,蜂鳴器發出滴
}
else if(t>warn_h2)//大于32度
{
warn(10,0x0c);//第3,4個燈亮,蜂鳴器發出滴
}
else //在27度和30度之間時只是調用顯示函數延時
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void init_com(void)//串口初始化函數
{
TMOD=0X20;
PCON=0X00;
SCON=0X50;
TH1=0XFD;//波特率9600
TL1=0XFD;
TR1=1;
}
void comm(char*parr)//串口數據發送函數
{
do
{
SBUF=*parr++;//發送數據
while(!TI);//等待發送完成標志為1
TI=0;//標志清零
}while(*parr);//保持循環直到字符為'\0'
}
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
init_com();
while(1)
{
tempchange();//溫度轉換函數
for(i=10;i>0;i--)
{
dis_temp(get_temp());//獲取溫度并顯示
}
deal(temp);//進行溫度處理
sprintf(buff,"%f",f_temp);//將浮點型溫度格式轉化為字符型
for(i=10;i>0;i--)
{
dis_temp(get_temp());//溫度顯示
}
comm(buff);//串口發送數據
for(i=10;i>0;i--)
{
dis_temp(get_temp());//溫度顯示
}
}
}
復制代碼
作者:
166864646883
時間:
2019-11-21 09:43
先檢查蜂鳴器部分電路是否有問題,然后再檢查程序是否有錯
作者:
wulin
時間:
2019-11-21 13:31
程序沒有問題,是你的硬件電路與程序不符導致異常。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1