求基于52或51单片机数显温度计C程序...附上原理图,要求能测0-100度就好,精确到0.1 来个完整的C程序
51\u7cfb\u5217\u5355\u7247\u673a\u300a\u7535\u5b50\u6e29\u5ea6\u8ba1\u53f0\u5386\u300b\uff0c\u8981\u6709\u539f\u7406\u56fe\u8ddfC\u8bed\u8a00\u7a0b\u5e8f\uff5e\u6211\u8fd9\u6709\u4ee5\u524d\u505a\u597d\u7684\u6e29\u5ea6\u6d4b\u91cf\u90e8\u5206\u7684\u7a0b\u5e8f\uff0c\u5148\u7ed9\u4f60\u5427\uff0c\u5982\u679c\u6709\u5176\u4ed6\u66f4\u597d\u7684\u7b54\u6848\u7684\u8bdd\u4f60\u4e5f\u53ef\u4ee5\u91c7\u7eb3\uff0c\u6ca1\u6709\u7684\u8bdd\u6211\u8fd9\u4e5f\u53ef\u4ee5\u7ed9\u4f60\u505a\u4e2a\u53c2\u8003\uff0c\u7528\u7684\u662fDS18B20\u6e29\u5ea6\u4f20\u611f\u5668\u3002
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit ds=P1^0;
bit flag;
uchar count_t0;
float f_temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
void init() // \u4e32\u53e3\u521d\u59cb\u5316
{
TMOD=0x21;
SCON=0x50;
TH0=0x4c;
TL0=0x00;
TH1=0xf3;
TL1=0xf3;
EA=1;
ET0=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
if(++count_t0>=20)
{
count_t0=0;
flag=1;
}
}
void dsreset()
{
uint i;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bit read_bit()
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;
while(i>0)
i--;
return dat;
}
uchar read_byte()
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=read_bit();
dat=(j>1);
}
return dat;
}
void write_byte(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++;
ds=1;
i=8;
while(i>0)
i--;
}
else
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;i++;
}
}
}
void begin_change()
{
dsreset();
delay(1);
write_byte(0xcc);
write_byte(0x44);
}
float get_temp()
{
uchar a,b;
uint temp;
float f_temp;
dsreset();
delay(1);
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return f_temp;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
flag=0;
begin_change();
TI=1;
printf("The tempeature is %f\n",get_temp());
while(!TI);
TI=0;
}
}
}
\u4e0d\u77e5\u8fd9\u4e2a\u5408\u4e0d\u5408\u7528(\u5b9e\u9a8c\u677f\u5e26\u7684):
#include
code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90}; //\u663e\u793a\u6bb5\u7801
sbit TMDAT =P3^3; //DS18B20 \u7684\u6570\u636e\u8f93\u5165/\u8f93\u51fa\u811aDQ,\u6839\u636e\u60c5\u51b5\u8bbe\u5b9a
unsigned int sdata;//\u6d4b\u91cf\u5230\u7684\u6e29\u5ea6\u7684\u6574\u6570\u90e8\u5206
unsigned char xiaoshu1;//\u5c0f\u6570\u7b2c\u4e00\u4f4d
unsigned char xiaoshu2;//\u5c0f\u6570\u7b2c\u4e8c\u4f4d
unsigned char xiaoshu;//\u4e24\u4f4d\u5c0f\u6570
bit fg=1; //\u6e29\u5ea6\u6b63\u8d1f\u6807\u5fd7
//////////*\u663e\u793a\u5ef6\u65f6\u7a0b\u5e8f*///////////////
void Delay(unsigned int tc)
{while( tc != 0 )
{unsigned int i;
for(i=0; i<80; i++);
tc--;}
}
////////////\u5ef6\u65f6\u90e8\u5206///////////////
void dmsec (unsigned int count)
{
unsigned char i;
while(count--)
{for(i=0;i<115;i++);}
}
/////////////\u53d1\u9001\u590d\u4f4d///////////////
void tmreset (void)
{
unsigned char i;
TMDAT=0; for(i=0;i<103;i++);
TMDAT = 1; for(i=0;i<4;i++);
}
bit tmrbit (void) //\u8bfb\u4e00\u4f4d//
{
unsigned int i;
bit dat;
TMDAT = 0;
i++;
TMDAT = 1;
i++; i++; //\u5fae\u91cf\u5ef6\u65f6 //
dat = TMDAT;
for(i=0;i<8;i++);
return (dat);
}
unsigned char tmrbyte (void) //\u8bfb\u4e00\u4e2a\u5b57\u8282
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{ j = tmrbit(); dat = (j > 1); }
return (dat);
}
void tmwbyte (unsigned char dat) //\u5199\u4e00\u4e2a\u5b57\u8282
{
unsigned char j,i;
bit testb;
for (j=1;j<=8;j++)
{ testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{ TMDAT = 0; //\u51990
i++; i++;
TMDAT = 1;
for(i=0;i<8;i++); }
else
{ TMDAT = 0; //\u51990
for(i=0;i<8;i++);
TMDAT = 1;
i++; i++;}
}
}
void tmstart (void) //\u53d1\u9001ds1820 \u5f00\u59cb\u8f6c\u6362
{
tmreset(); //\u590d\u4f4d
dmsec(1); //\u5ef6\u65f6
tmwbyte(0xcc); //\u8df3\u8fc7\u5e8f\u5217\u53f7\u547d\u4ee4
tmwbyte(0x44); //\u53d1\u8f6c\u6362\u547d\u4ee4 44H,
}
void tmrtemp (void) //\u8bfb\u53d6\u6e29\u5ea6
{
unsigned char a,b;
tmreset (); //\u590d\u4f4d
dmsec (1); //\u5ef6\u65f6
tmwbyte (0xcc); //\u8df3\u8fc7\u5e8f\u5217\u53f7\u547d\u4ee4
tmwbyte (0xbe); //\u53d1\u9001\u8bfb\u53d6\u547d\u4ee4
a = tmrbyte (); //\u8bfb\u53d6\u4f4e\u4f4d\u6e29\u5ea6
b = tmrbyte (); //\u8bfb\u53d6\u9ad8\u4f4d\u6e29\u5ea6
if(b>0x7f) //\u6700\u9ad8\u4f4d\u4e3a1 \u65f6\u6e29\u5ea6\u662f\u8d1f
{a=~a; b=~b+1; //\u8865\u7801\u8f6c\u6362\uff0c\u53d6\u53cd\u52a0\u4e00
fg=0; //\u8bfb\u53d6\u6e29\u5ea6\u4e3a\u8d1f\u65f6fg=0
}
sdata = a/16+b*16; //\u6574\u6570\u90e8\u5206
xiaoshu1 = (a&0x0f)*10/16; //\u5c0f\u6570\u7b2c\u4e00\u4f4d
xiaoshu2 = (a&0x0f)*100/16%10;//\u5c0f\u6570
xiaoshu=xiaoshu1*10+xiaoshu2; //\u5c0f\u6570
}
void DS18B20PRO(void)
{
tmstart();
//dmsec(5); //\u5982\u679c\u662f\u4e0d\u65ad\u5730\u8bfb\u53d6\u7684\u8bdd\u53ef\u4ee5\u4e0d\u5ef6
tmrtemp(); //\u8bfb\u53d6\u6e29\u5ea6,\u6267\u884c\u5b8c\u6bd5\u6e29\u5ea6\u5c06\u5b58\u4e8e
}
void Led()
{
P0=0x7f;
P1=0xdf;
Delay(4);
P1=P1|0xf0;
if(fg==1) //\u6e29\u5ea6\u4e3a\u6b63\u65f6\u663e\u793a\u7684\u6570\u636e
{
P1=P1&0xef;
P0=seg7code[sdata/10]; //\u8f93
Delay(8); P1=P1|0xf0; P1=P1&0xdf;
P0=seg7code[sdata%10]|0x80; //\u8f93\u51fa\u4e2a
Delay(8); P1=P1|0xf0; P1=P1&0xbf;
P0=seg7code[xiaoshu1]; //\u8f93\u51fa\u5c0f\u6570\u70b9
Delay(8); P1=P1|0xf0; P1=P1&0x7f;
P0=seg7code[xiaoshu2]; //\u8f93\u51fa\u5c0f
Delay(8); P1=P1|0xf0;
Delay(4);
//P1=P1|0x0f; //\u9500\u9690
// Delay(8);
}
}
main()
{fg=1;
while(1)
{
DS18B20PRO();
Led();
}
}
code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff}; //不带小数点的共阳数码管段码
code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,
0x02,0x78,0x00,0x10,0xff}; //带小数点的共阳数码管段码
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带小数点的共阳数码管段码
unsigned char code fseg1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的共阳数码管段码
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char disbuf[8]={0,0,0,0,0,0,0,0};
/* 函数申明 -----------------------------------------------*/
void delay(unsigned char i);
void delay1ms(unsigned char i);
void ReadTemperature(void);
void Init_DS18B20(void);
ReadOneChar();
void WriteOneChar(unsigned char dat);
void out(void);
void sdata(void);
/* 变量定义 -----------------------------------------------*/
sbit DQ=P3^6; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int sdate;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
bit fg=1; //温度正负标志
sbit MOSIO=P2^2;
sbit R_CLKa=P2^3;
sbit S_CLKa=P2^4;
unsigned char m;
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main(void)
{
while(1)
{
ReadTemperature();
sdata();
out();
}
}
/*
********************************************************************************
** 函数名称 : delay(unsigned char i)
** 函数功能 : 延时函数这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时
********************************************************************************
*/
void delay(unsigned char i)
{
while(i--);
}
/*
********************************************************************************
** 函数名称 : delay1ms(unsigned char i)
** 函数功能 : 延时函数
********************************************************************************
*/
void delay1ms(unsigned char i)
{
for(i=124;i>0;i--); //延时124*8+10=1002us
}
/*
********************************************************************************
** 函数名称 : Init_DS18B20(void)
** 函数功能 : 初始化
********************************************************************************
*/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
/*
********************************************************************************
** 函数名称 : ReadOneChar()
** 函数功能 : 读一个字节
********************************************************************************
*/
ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*
********************************************************************************
** 函数名称 : WriteOneChar(unsigned char dat)
** 函数功能 : 写一个字节
********************************************************************************
*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
/*
********************************************************************************
** 函数名称 : ReadTemperature(void)
** 函数功能 : 读温度值(低位放tempL;高位放tempH;)
********************************************************************************
*/
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1;
fg=0; //读取温度为负时fg=0
}
sdate = tempL/16+tempH*16; //整数部分
xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
disbuf[3] = sdate/10;
disbuf[2] = sdate%10;
disbuf[1] = xiaoshu1;
disbuf[0] = xiaoshu2;
}
/*
********************************************************************************
** 函数名称 : sdata(void)
** 函数功能 : 数据传输
********************************************************************************
*/
void sdata(void)
{
unsigned char b,c,num;
if(b==0)
{
b++;
num=segbit[m];
for(c=0;c<8;c++)
{
S_CLKa=0;
MOSIO=num&0x80;
num<<=1;
S_CLKa=1;
}
}
if(b==1)
{
b--;
if(m==2)
{num=fseg1[disbuf[m]];}
else
{num=fseg[disbuf[m]];}
for(c=0;c<8;c++)
{ S_CLKa=0;
MOSIO=num&0x80;
num<<=1;
S_CLKa=1;
}
}
m++;
if(m==4)
{m=0;
}
}
/*
********************************************************************************
** 函数名称 : out(void)
** 函数功能 : 数据输出
********************************************************************************
*/
void out(void)
{
R_CLKa=0;
delay(1);
R_CLKa=1;
}
可以用DS18b20温度传感器不?我这里有一些资料,需要可以来找我,在线,等待回复。
绛旓細鏈娴嬬郴缁熺‖浠惰璁′互AT89C51鍗曠墖鏈轰负鏍稿績,鐢娓╁害浼犳劅鍣―S18B20瀹炵幇娓╁害鎺у埗,鐢ㄦ暟鐮佺鏄剧ず瀹為檯娓╁害鍜岄璁炬俯搴,鍒朵綔鏁板瓧娓╁害璁,骞跺彲浠ュ疄鐜版俯搴﹂璀︽帶鍒躲 鍗曠墖鏈虹郴缁熺殑杞欢缂栫▼閲囩敤鍗曠墖鏈烘眹缂栬繘琛岀紪绋嬨傚簲鐢ㄨ蒋浠堕噰鐢↘EIL鍜孭ROTEUS浠跨湡杞欢妯℃嫙瀹炵幇鎺у埗杩囩▼銆 娓╁害鎺у埗绯荤粺鏄鍩轰簬鍗曠墖鏈鐨勮绠楁満妫娴嬫妧鏈殑杞‖浠跺紑鍙戝拰闈㈠悜瀵硅薄鐨勯珮绾...
绛旓細閫氳繃瀹氭椂鎴栬呭惊鐜彁鍙栨瘡璺殑澶氭鏁板硷紝姣斿5娆★紝閭d箞锛屽氨灏嗘彁鍙栧埌鐨勮繖5娆℃暟鍊艰繘琛屽钩鍧囪绠楀嵆鍙晩锛
绛旓細绋嬪簭杩樿鑷繁鏁村悎锛屾瘯绔熻嚜宸辩紪鐨勬墠鏈夋垚灏辨劅锛屾垜缁欎綘鎻愮偣鎬濊矾锛屾恫鏅舵樉绀虹▼搴忓拰娓╁害鎺у埗绋嬪簭閮界湅鎳傜殑鎯呭喌涓嬶紝浣犲彲浠ュ湪瀹氭椂涓柇涓壂鎻忔俯搴︼紝骞跺垽鏂槸鍚﹁揪鍒伴榾鍊硷紝璁剧疆涓涓狟it鍨嬬殑flag锛岀劧鍚庡湪涓荤▼搴忎腑涓鐩磋皟鐢ㄦ杩涚數瀛愬瓙绋嬪簭锛屽悓鏍凤紝姝ヨ繘鐢垫満涓殑姝h浆鍙嶈浆鐢变笂闈㈡彁鍒扮殑flag杩涜鍒ゆ柇銆傛湁浠涔堥棶棰樼户缁拷闂氨琛 ...
绛旓細鏁板瓧寮忔俯婀垮害浼犳劅鍣ㄥ彲浠ラ夋嫨sht20锛岀洿鎺ヨ緭鍑烘暟瀛椾俊鍙凤紝涓鍗曠墖鏈閫氳繃io鍙i氳锛屽崟鐗囨満椹卞姩鏁扮爜绠℃樉绀烘俯婀垮害鏁版嵁锛屽彲浠ラ夋嫨涓ょ粍鏁扮爜绠″垎鍒樉绀娓╁害鍜屾箍搴︼紝涔熷彲浠ヤ娇鐢ㄤ竴缁勬暟鐮佺浜ゆ浛鏄剧ず娓╁害鍜屾箍搴︺
绛旓細姝ゅ浘鏄51鍗曠墖鏈鏁板瓧娓╁害璁′紶鎰熷櫒鐨勬眹缂栫▼搴忋
绛旓細鍦⊿TC鍗曠墖鏈鐨勫畼缃戞湁18B20鐨勭ず渚嬬▼搴忥紝鑷繁鎷挎潵鏀规敼灏辫兘鐢紝鍙兘甯綘鍒拌繖鍎夸簡
绛旓細浣犲彧闇瑕佷笓娉ㄤ笁鍧楋紝绗竴鍧楋紝璋冭妭LED鏁扮爜绠℃樉绀猴紝浣犲彲浠ュ氨鎼炴樉绀烘柟闈㈢殑瀛︿範銆傜浜屽潡锛屼綘鍦ㄦ樉绀轰簡鐨勫熀纭涓婏紝寮凞S1302鐨勭▼搴忥紝鐒跺悗鍋欴S18B20鐨勭▼搴忥紝鏈鍚庡紕璋冭妭鎸夐挳鐨勭▼搴忋
绛旓細杩欎釜鎴戝仛杩
绛旓細2014-05-20 鍗曠墖鏈篈鏄剧ず瀹屸1銆2銆3銆4鈥;鍗曠墖鏈築鏁扮爜绠℃樉绀衡5銆6... 2011-04-20 51鍗曠墖鏈鍋氱殑涓囧勾鍘嗕袱涓8浣嶆暟鐮佺鏄剧ず鏃ユ湡鏃堕棿,涓涓袱浣嶆暟鐮... 2012-07-23 姹備竴涓51鍗曠墖鏈烘眹缂栫▼搴,璁╁洓涓暟鐮佺鍔ㄦ佹樉绀1 2 3 4... 31 2014-01-17 鍩轰簬89c51鍗曠墖鏈8浣嶆暟鐮佺鏃堕棿娓╁害绋嬪簭 鏇村绫讳技闂 > 涓...
绛旓細3 鑳℃眽鎵.鍗曠墖鏈鍘熺悊鍙婃帴鍙f妧鏈.娓呭崕澶у鍑虹増绀,1996 4 鏉庡織鍏ㄧ瓑.鏅鸿兘浠〃璁捐鍘熺悊鍙婂簲鐢.鍥介槻宸ヤ笟鍑虹増绀,1998.6 5 浣曠珛姘戯紟MCS-51绯诲垪鍗曠墖鏈哄簲鐢ㄧ郴缁熻璁★紟鍖椾含鑸┖鑸ぉ澶у鍑虹増绀撅紝1990锛1 6 鏉庡缓姘.鍗曠墖鏈哄湪娓╁害鎺у埗绯荤粺涓殑搴旂敤.姹熸眽澶у瀛︽姤,1996.6 7 寮犳瘏鍒氥佸江鍠滃厓銆佸瀹堣揪銆佷箶绔嬪博锛庢柊缂...