跪求 单片机进行温度检测的C语言程序

跪求 单片机进行温度检测的C语言程序,第1张

//DS18B20的读写程序,数据脚P2.7 //

//温度传感器18B20汇编程序,采用器件默认的12位转化 //

//最大转化时间750微秒,显示温度-55到+125度,显示精度 //

//为0.1度,显示采用4位LED共阳显示测温值//

//P0口为段码输入,P34~P37为位选 //

/***************************************************/

#include "reg51.h"

#include "intrins.h"//_nop_()延时函数用

#define Disdata P0 //段码输出口

#define discan P3 //扫描口

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^7 //温度输入口

sbit DIN=P0^7 //LED小数点控制

uint h

uint temp

//

//

//**************温度小数部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}

//

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}

//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"

uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef} //列扫描控制字

uchar data temp_data[2]={0x00,0x00}//读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00}//显示单元数据,共4个数据和一个运算暂用

//

//

//

/*****************11us延时函数*************************/

//

void delay(uint t)

{

for (t>0t--)

}

//

/****************显示扫描函数***************************/

scan()

{

char k

for(k=0k<4k++) //4位LED扫描控制

{

Disdata=dis_7[display[k]] //数据显示

if (k==1){DIN=0} //小数点显示

discan=scan_con[k]//位选

delay(300)

}

}

//

//

/****************DS18B20复位函数************************/

ow_reset(void)

{

char presence=1

while(presence)

{

while(presence)

{

DQ=1_nop_()_nop_()//从高拉倒低

DQ=0

delay(50) //550 us

DQ=1

delay(6) //66 us

presence=DQ//presence=0 复位成功,继续下一步

}

delay(45) //延时500 us

presence=~DQ

}

DQ=1 //拉高电平

}

//

//

/****************DS18B20写命令函数************************/

//向1-WIRE 总线上写1个字节

void write_byte(uchar val)

{

uchar i

for(i=8i>0i--)

{

DQ=1_nop_()_nop_() //从高拉倒低

DQ=0_nop_()_nop_()_nop_()_nop_() //5 us

DQ=val&0x01 //最低位移出

delay(6) //66 us

val=val/2//右移1位

}

DQ=1

delay(1)

}

//

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

uchar read_byte(void)

{

uchar i

uchar value=0

for(i=8i>0i--)

{

DQ=1_nop_()_nop_()

value>>=1

DQ=0_nop_()_nop_()_nop_()_nop_()//4 us

DQ=1_nop_()_nop_()_nop_()_nop_()//4 us

if(DQ)value|=0x80

delay(6)//66 us

}

DQ=1

return(value)

}

//

/****************读出温度函数************************/

//

read_temp()

{

ow_reset() //总线复位

delay(200)

write_byte(0xcc) //发命令

write_byte(0x44) //发转换命令

ow_reset()

delay(1)

write_byte(0xcc) //发命令

write_byte(0xbe)

temp_data[0]=read_byte() //读温度值的第字节

temp_data[1]=read_byte() //读温度值的高字节

temp=temp_data[1]

temp<<=8

temp=temp|temp_data[0] // 两字节合成一个整型变量。

return temp//返回温度值

}

//

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/

work_temp(uint tem)

{

uchar n=0

if(tem>6348)// 温度值正负判断

{tem=65536-temn=1}// 负温度求补码,标志位置1

display[4]=tem&0x0f // 取小数部分的值

display[0]=ditab[display[4]] // 存入小数部分显示值

display[4]=tem>>4// 取中间八位,即整数部分的值

display[3]=display[4]/100// 取百位数据暂存

display[1]=display[4]%100// 取后两位数据暂存

display[2]=display[1]/10 // 取十位数据暂存

display[1]=display[1]%10

/******************符号位显示判断**************************/

if(!display[3])

{

display[3]=0x0a //最高位为0时不显示

if(!display[2])

{

display[2]=0x0a //次高位为0时不显示

}

}

if(n){display[3]=0x0b} //负温度时最高位显示"-"

}

//

//

/****************主函数************************/

main()

{

Disdata=0xff//初始化端口

discan=0xff

for(h=0h<4h++) //开机显示"0000"

{display[h]=0}

ow_reset() //开机先转换一次

write_byte(0xcc)//Skip ROM

write_byte(0x44)//发转换命令

for(h=0h<100h++)//开机显示"0000"

{scan()}

while(1)

{

work_temp(read_temp())//处理温度数据

scan()//显示温度值

}

}

//

//***********************结束**************************//

程序如下:

#include <stdio.h>

int main()

{

int f

float c

printf("请输入一个华氏温度\n")

scanf_s("%d", &f)

c = (float)(f - 32) * 5 / 9

printf("它的摄氏温度为:%.2f", c)

}

如图:

调试通过:

扩展资料:

C语言编写程序时的注意事项:

1、书写标识符时,忽略了大小写字母的区别

编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。

2、忽略了变量的类型,进行了不合法的运算

%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。

3、将字符常量与字符串常量混淆

在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a’和‘\0’,而把它赋给一个字符变量是不行的。

4、忽略了“=”与“==”的区别

在许多高级语言中,用“=”符号作为关系运算符“等于”。但C语言中,“=”是赋值运算符,“==”是关系运算符,由于习惯问题,初学者往往会犯这样的错误。

5、忘记加分号

分号是C语句中不可缺少的一部分,语句末尾必须有分号。编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。

改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。

6、多加分号

对于一个复合语句, 复合语句的花括号后不应再加分号,否则将会画蛇添足。如:

if (a%3==0) I++ 本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。

7、输入变量时忘记加地址运算符“&”

int a,b scanf(“%d%d”,a,b) 这是不合法的。scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。

8、输入数据的方式与要求不符

scanf(“%d%d”,&a,&b) 输入时,不能用逗号作两个数据间的分隔符;

scanf(“%d,%d”,&a,&b) C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。

参考资料来源:C语言-百度百科

/********************************************************************

*

文件名

温度采集DS18B20.c

*

描述

:

该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。

*

创建人

东流,2009年4月10日

*

版本号

2.0

***********************************************************************/

#include<reg52.h>

#define

uchar

unsigned

char

#define

uint

unsigned

int

#define

jump_ROM

0xCC

#define

start

0x44

#define

read_EEROM

0xBE

sbit

DQ

=

P2^3

//DS18B20数据口

unsigned

char

TMPH,TMPL

uchar

code

table[10]

=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

/********************************************************************

*

名称

:

delay()

*

功能

:

延时,延时时间大概为140US。

*

输入

:

*

输出

:

***********************************************************************/

void

delay_1()

{

int

i,j

for(i=0

i<=10

i++)

for(j=0

j<=2

j++)

}

/********************************************************************

*

名称

:

delay()

*

功能

:

延时函数

*

输入

:

*

输出

:

***********************************************************************/

void

delay(uint

N)

{

int

i

for(i=0

i<N

i++)

}

/********************************************************************

*

名称

:

Delay_1ms()

*

功能

:

延时子程序,延时时间为

1ms

*

x

*

输入

:

x

(延时一毫秒的个数)

*

输出

:

***********************************************************************/

void

Delay_1ms(uint

i)//1ms延时

{

uchar

x,j

for(j=0j<ij++)

for(x=0x<=148x++)

}

/********************************************************************

*

名称

:

Reset()

*

功能

:

复位DS18B20

*

输入

:

*

输出

:

***********************************************************************/

uchar

Reset(void)

{

uchar

deceive_ready

DQ

=

0

delay(29)

DQ

=

1

delay(3)

deceive_ready

=

DQ

delay(25)

return(deceive_ready)

}

/********************************************************************

*

名称

:

read_bit()

*

功能

:

从DS18B20读一个位值

*

输入

:

*

输出

:

从DS18B20读出的一个位值

***********************************************************************/

uchar

read_bit(void)

{

uchar

i

DQ

=

0

DQ

=

1

for(i=0

i<3

i++)

return(DQ)

}

/********************************************************************

*

名称

:

write_bit()

*

功能

:

向DS18B20写一位

*

输入

:

bitval(要对DS18B20写入的位值)

*

输出

:

***********************************************************************/

void

write_bit(uchar

bitval)

{

DQ=0if(bitval==1)

DQ=1

delay(5)

DQ=1

}

/********************************************************************

*

名称

:

read_byte()

*

功能

:

从DS18B20读一个字节

*

输入

:

*

输出

:

从DS18B20读到的值

***********************************************************************/

uchar

read_byte(void)

{

uchar

i,m,receive_data

m

=

1

receive_data

=

0

for(i=0

i<8

i++)

{

if(read_bit())

{

receive_data

=

receive_data

+

(m

<<

i)

}

delay(6)

}

return(receive_data)

}

/********************************************************************

*

名称

:

write_byte()

*

功能

:

向DS18B20写一个字节

*

输入

:

val(要对DS18B20写入的命令值)

*

输出

:

***********************************************************************/

void

write_byte(uchar

val)

{

uchar

i,temp

for(i=0

i<8

i++)

{

temp

=

val

>>

i

temp

=

temp

&

0x01

write_bit(temp)

delay(5)

}

}

/********************************************************************

*

名称

:

Main()

*

功能

:

主函数

*

输入

:

*

输出

:

***********************************************************************/

void

main()

{

float

tt

uint

temp

P2

=

0x00

while(1)

{

Reset()

write_byte(jump_ROM)

write_byte(start)

Reset()

write_byte(jump_ROM)

write_byte(read_EEROM)

TMPL

=

read_byte()

TMPH

=

read_byte()

temp

=

TMPL

/

16

+

TMPH

*

16

P0

=

table[temp/10%10]

P2

=

6

Delay_1ms(5)

P0

=

table[temp%10]

P2

=

7

Delay_1ms(5)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11905629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存