|
RE: 用DS18B20溫度傳感器設(shè)計溫控系統(tǒng)。 始終有”16-1.C(154): error C193:
////////////////和/******************符號部分有錯誤
#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;
uint warn_12 = 250;
uint warn_h1 = 300;
uint warn_h2 = 320;
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,//帶小數(shù)點的0~9編碼
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};//不帶小數(shù)點的0~9編碼
/*------延時函數(shù)------*/
void delay(uint z)
{
uint x,y;
for(x = z;x>0;x--)
for(y = 110;y>0;y--);
}
/*DS18B20復(fù)位,初始化函數(shù)----*/
void dsreset(void)
{
uint i;
ds = 0;
i = 103;
while(i>0)i--;
ds = 1;
i = 4;
while(i>0)i--;
}
/*-----讀一位數(shù)據(jù)函數(shù)------*/
bit tempreadbit(void)
{
uint i;
bit dat;
ds = 0;i++;//“i++”起延時作用
ds = 1;i++;i++;
dat = ds;
i = 8;while(i>0)i--;
return(dat);
}
/*-----讀一個字節(jié)數(shù)據(jù)函數(shù)------*/
uchar tempread(void)
{
uchar i,j,dat;
dat = 0;
for(i = 1;i<8;i++)
{
j = tempreadbit();
dat = (j<<7)|(dat>>1);//讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在dat里面
}
return (dat);
}
/*-----向DS18B20向?qū)懸粋字節(jié)數(shù)據(jù)函數(shù)------*/
void tempwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j = 1;j<8;j++)
{
testb = dat&0x01;
dat = dat>>1;
if(testb)
{
ds = 0;
i++;i++; //“i++”起延時作用
ds = 1;
i = 8;while(i>0)i--;
}
else
{
ds = 0;//寫0
i = 8;while(i>0)i--;
ds = 1;
i++;i++ ;
}
}
}
/*-----DS18B20開始獲取溫度并轉(zhuǎn)換------*/
void tempchange(void)
{
dsreset();
delay(1);
tempwritebyte(0xcc);//寫跳過讀ROM指令
tempwritebyte(0x44);//寫溫度轉(zhuǎn)換指令
}
/*-----讀取寄存器中儲存的溫度數(shù)據(jù)------*/
////////////////////////////////////////////////////////////////////////////////////
void get_temp()/*********后面帶返回值,此處也應(yīng)該有返回值void應(yīng)該是uchar***********/
////////////////////////////////////////////////////////////////////////////////////
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a = tempread();//讀低8位
b = tempread();//讀高8位
temp = b;
temp<<= 8;//兩字節(jié)組合為一個字
////////////////////////////////////////////////////
temp = templa; /*********templa沒有定義***********/
////////////////////////////////////////////////////
f_temp = temp*0.0625;//溫度在寄存器中為12位,分辨率為0.0625°
temp = f_temp*10+0.5;//乘以10表示小數(shù)點后面只取一位,加0.5是四舍五入
f_temp = temp+0.05;
return temp;//temp是整型
}
/*-----數(shù)據(jù)顯示程序------*/
void display(uchar num,uchar dat)
{
uchar i;
dula = 0;
P0 = table[dat];//編碼賦給P0口
dula = 1;
wela = 0;
i = 0xFF;
i = i&(~(0X01)<<(num));//用i來存儲位選數(shù)據(jù),只有一位為0
P0 = i;
wela = 1;
wela = 0;
delay(1);
}
/*-----顯示溫度數(shù)值函數(shù)t傳遞的是整型的溫度值------*/
void dis_temp(uint t)
{
uchar i;
i = t/100; //除以100得到商,為溫度的十位
display(0,i); //在第一個數(shù)碼管上顯示
i = t%100/10; //100取余數(shù)再除以10得到商,為溫度的個位
display(1,i+100); //在第二個數(shù)碼管上顯示
i = t%100%10; //100取余數(shù)再用10取余,為溫度的小數(shù)位
display(2,i); //在第三個數(shù)碼管上顯示
}
/*-----蜂鳴器報警,燈閃爍------*/
void warn(uint s,uchar led)
{
uchar i;i = s;
beep = 0;///蜂鳴器響
P1 = ~(led);
while(i--)
{
dis_temp(get_temp());//用溫度顯示函數(shù)起到延時作用
}
beep = 1;//蜂鳴器不響
P1 = 0XFF;//控制相應(yīng)的燈滅
i = s;
while(i--)
{
dis_temp(get_temp());//用溫度顯示函數(shù)起到延時作用
}
}
/*-----溫度處理函數(shù)-------*/
void deal(uint t)
{
uchar i;
if((t>warn_12)&&(t<=warn_11))//大于25度小于27度
{
warn(40,0x01);//第一個燈亮,蜂鳴器發(fā)出“滴”聲
}
else if(t<warn_12)//小于25度
{
warn(10,0x03);//第一個和第二個燈亮,蜂鳴器發(fā)出“滴”聲
}
else if((t<warn_h2)&&(t<=warn_h1))//小于32度和大于30度
{
warn(40,0x04);//第三個燈亮,蜂鳴器發(fā)出“滴”聲
}
else if(t>warn_h2)//大于32度
{
warn(10,0x0c);//第三個和第四個燈亮,蜂鳴器發(fā)出“滴”聲
}
else //在27度到30度之間時只是調(diào)用顯示函數(shù)延時
{
i = 40;
while(i--);
{
dis_temp(get_temp());
}
}
}
/*------------串口初始化函數(shù)-----------*/
void init_com(void)
{
TMOD = 0x20;
PCON = 0X00;
SCON = 0X50;
TH1 = 0XFd;
TL1 = 0XFd;//baud9600
TR1 = 1;
}
/*------------串口數(shù)據(jù)發(fā)送函數(shù)-----------*/
void comm(char *parr)
{
do
{
SBUF = *parr++;//發(fā)送數(shù)據(jù)
while(!TI);//等待發(fā)送完成標志為1
TI = 0;//標志清零
}while(*parr);//保持循環(huán)直到字符為'\0'
}
/*-----------主函數(shù)-------------------*/
void main()
{
uchar buff[4],i;
dula = 0;
wela = 0;
init_com();
while(1)
{
tempchange();//溫度轉(zhuǎn)換器
for(i = 10;i>0;i--)
{
dis_temp(get_temp());//獲取溫度并顯示
}
deal(temp);//進行溫度處理
/////////////////////////////////////////////////////////////////////
springtf(buff,"%f",f_temp);/*******springtf來歷不明,缺少原型*******///將浮點型溫度格式化為字符型
///////////////////////////////////////////////////////////////////////
for(i = 10;i>0;i--)
{
dis_temp(get_temp());//溫度并顯示
}
comm(buff);//串口發(fā)送數(shù)據(jù)
for(i = 10;i>0;i--)
{
dis_temp(get_temp());//獲取溫度并顯示
}
}
} |
|