用c语言编写一个温度计,程序要怎么写

用c语言编写一个温度计,程序要怎么写,第1张

程序如下:

#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语言-百度百科

#include <reg51.h>

#define uchar unsigned char

sbit BEEP=P3^7

//接控制继电器

sbit DQ = P3^6

//接温度传感器18B20

uchar t[2],number=0,*pt

/让瞎/温度值

uchar TempBuffer1[4]={0,0,0,0}

uchar Tmax=50,Tmin=10

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7}

uchar currtemp

void t0isr() interrupt 1

{

TH0=(65536-5000)/256

TL0=(65536-5000)%256

P2=1<<number

if(number==2)P0=distab[TempBuffer1[0]]&0x7f

else P0=distab[TempBuffer1[0]]

number++

if(number>3)number=0

}

void delay_18B20(unsigned int i)

{

while(i--)

}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)

{

bit x=0

do{

DQ=1

delay_18B20(8)

DQ = 0 //单片机将DQ拉低

delay_18B20(90)//誉燃精确延时 大于 480us

DQ = 1 //拉高总线

delay_18B20(14)

x=DQ //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化

}while(x)

delay_18B20(20)

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{

unsigned char i=0

unsigned char dat = 0

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

{

DQ = 0// 给脉冲信号

dat>>=1

DQ = 1// 给脉冲信号

if(DQ)

dat|=0x80

delay_18B20(4)

}

return(dat)

}

/*************ds18b20写一个字节****************/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0

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

{

DQ = 0

DQ = dat&0x01

delay_18B20(5)

DQ = 1

dat>>=1

}

}

/**************读取ds18b20当前温度************/

unsigned char *ReadTemperature(unsigned char rs)

{

unsigned char tt[2]

delay_18B20(80)

Init_DS18B20()

WriteOneChar(0xCC) //跳过读序号列号的 *** 作

WriteOneChar(0x44)

//启动温度转换

delay_18B20(80)

Init_DS18B20()

WriteOneChar(0xCC)

//跳过读序号列号的 *** 作

WriteOneChar(0xBE)

//读取温度寄存器等(共可读9个寄存器)前两个就是温度

tt[0]=ReadOneChar() //读取温度值低位

tt[1]=ReadOneChar() //读取温度值高位

return(tt)

}

void covert1(void)

//将温度转换为LED显示的数据

{

uchar x=0x00,y=0x00

t[0]=*pt

pt++

t[1]=*pt

if(t[1]&0x080) //判断正负温度

{

TempBuffer1[0]=0x0c

//c代表负

t[1]=~t[1]

/*下面几句把负数的补码*/

t[0]=~t[0]

/*换算成绝对值*********/坦虚空

x=t[0]+1

t[0]=x

if(x==0x00)t[1]++

}

else TempBuffer1[0]=0x0a

//A代表正

t[1]<<=4

//将高字节左移4位

t[1]=t[1]&0xf0

x=t[0]

//将t[0]暂存到X,因为取小数部分还要用到它

x>>=4

//右移4位

x=x&0x0f

//和前面两句就是取出t[0]的高四位

y=t[1]|x

//将高低字节的有效值的整数部分拼成一个字节

TempBuffer1[1]=(y%100)/10

TempBuffer1[2]=(y%100)%10

t[0]=t[0]&0x0f

//小数部分

TempBuffer1[3]=t[0]*10/16

if(currtemp<Tmin || currtemp>Tmax)BEEP=1

else BEEP=0

}

void convert(char tmp)

{

uchar a

if(tmp<0)

{

TempBuffer1[0]=0x0c

a=~tmp+1

}

else

{

TempBuffer1[0]=0x0a

a=tmp

}

TempBuffer1[1]=(a%100)/10

TempBuffer1[2]=(a%100)%10

}

main()

{

TMOD=0x01

TH0=(65536-5000)/256

TL0=(65536-5000)%256

TR0=1

ET0=1

EA=1

out=1

flag=0

ReadTemperature(0x3f)

delay_18B20(50000)

//延时等待18B20数据稳定

while(1)

{

pt=ReadTemperature(0x7f)//读取温度,温度值存放在一个两个字节的数组中

if(dismod==0)covert1()

delay_18B20(30000)

}

}

//------------------------------------------------------------------

//DS18B20温度传感器输出显示,运行本例时,外界温度将显示在1602LCD上

//------------------------------------------------------------------

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define delayNOP() {_nop_()_nop_()_nop_()_nop_()}

sbit DQ=P2^2

sbit dula=P2^6//定义锁存器锁存端

sbit wela=P2^7

sbit rs=P3^5 //定义1602液晶RS端

sbit lcden=P3^4//定义1602液晶LCDEN端

sbit s1=P3^0 //定义按键--功能键

sbit s2=P3^1 //定义按键--增加键

sbit s3=P3^2 //定义按键--减小键

sbit s4=P3^6//闹钟查看键

sbit rd=P3^7

sbit beep=P2^3//定义蜂鸣器端

uchar code Temp_Disp_Title[]={" Current Temp : "}

uchar Current_Temp_Display_Buffer[]={" TEMP: "}

uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"}

uchar Alarm_HI_LO_STR[]={"Hi:Lo:"}

uchar temp_data[2]={0x00,0x00}

uchar temp_alarm[2]={0x00,0x00}

uchar display[5]={0x00,0x00,0x00,0x00,0x00}

uchar display1[3]={0x00,0x00,0x00}

uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}

uchar CurrentT=0 /谈搏/当前读取的温度整数部分

uchar Temp_Value[]={0x00,0x00} /宏侍枯/从DS18B20读取的温度值

uchar Display_Digit[]={0,0,0,0} //待显示的各温度数位

bit DS18B20_IS_OK=1//传感器正常标志

/蔽洞/-------------------------------------

//延时1

//-------------------------------------

void delay1(uint x)

{

uchar i

while(x--) for(i=0i<200i++)

}

//-------------------------------------

//延时2

//-------------------------------------

void Delay(uint x)

{

while(x--)

}

//------------------------------------

//忙检查

//------------------------------------

void write_com(uchar com)//液晶写命令函数

{

rs=0

lcden=0

P0=com

delay1(5)

lcden=1

delay1(5)

lcden=0

}

void Write_LCD_Data(uchar date)//液晶写数据函数

{

rs=1

lcden=0

P0=date

delay1(5)

lcden=1

delay1(5)

lcden=0

}

//-----------------------------

//设置LCD显示位置

//---------------------------------

void Set_Disp_Pos(uchar Pos)

{

write_com(Pos|0x80)

}

//-----------------------------

//LCD初始化

//---------------------------------

void Initialize_LCD()

{

uchar num

rd=0 //软件将矩阵按键第4列一端置低用以分解出独立按键

dula=0//关闭两锁存器锁存端,防止 *** 作液晶时数码管会出乱码

wela=0

lcden=0

write_com(0x38)//初始化1602液晶

write_com(0x0c)

write_com(0x06)

write_com(0x01)

write_com(0x80)//设置显示初始坐标

for(num=0num<14num++)//显示年月日星期

{

Write_LCD_Data(Temp_Disp_Title[num])

delay1(5)

}

}

//-------------------------------------

//函数功能:初始化DS18B20

//出口参数:status---DS18B20是否复位成功的标志

//-------------------------------------

uchar Init_DS18B20()

{

uchar status //储存DS18B20是否存在的标志,status=0,表示存在;status=1,表示不存在

DQ=1Delay(8) //先将数据线拉高 //略微延时约6微秒

DQ=0Delay(90) //再将数据线从高拉低,要求保持480~960us

//略微延时约600微秒 以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ=1Delay(8) //释放数据线(将数据线拉高) //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

status=DQDelay(100) //让单片机检测是否输出了存在脉冲(DQ=0表示存在) //延时足够长时间,等待存在脉冲输出完毕

DQ=1 // 将数据线拉高

return status //返回检测成功标志

}

//-------------------------------------

//函数功能:读一字节

//出口参数:dat---读出的数据

//-------------------------------------

uchar ReadOneByte()

{

uchar i,dat=0

DQ=1_nop_() // 先将数据线拉高 //等待一个机器周期

for (i=0i<8i++)

{

DQ=0 //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

dat>>=1

_nop_() //等待一个机器周期

DQ=1 //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备

_nop_()_nop_()//延时约6us,使主机在15us内采样

if (DQ) dat|=0x80 //如果读到的数据是1,则将1存入dat,如果是0则保持原值不变

Delay(30)//延时3us,两个读时序之间必须有大于1us的恢复期

DQ=1 // 将数据线拉高,为读下一位数据做准备

}

return dat

}

//-------------------------------------

//函数功能:写一字节

//入口参数:dat---待写入的数据

//-------------------------------------

void WriteOneByte(uchar dat)

{

uchar i

for (i=0i<8i++)

{

DQ=0 //将数据线从高拉低时即启动写时序

DQ=dat &0x01//利用与运算取出要写的某位二进制数据,

//并将其送到数据线上等待DS18B20采样

Delay(5) //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1 //释放数据线

dat>>=1//将dat中的各二进制位数据右移1位

}

}

//-------------------------------------

//函数功能:读取温度值

//出入口参数:无

//-------------------------------------

void Read_Temperature()

{

if(Init_DS18B20() == 1) //DS18B20故障

DS18B20_IS_OK=0

else

{

WriteOneByte(0xCC) // 跳过读序号列号的 *** 作

WriteOneByte(0x44) // 启动温度转换

Init_DS18B20() //将DS18B20初始化

WriteOneByte(0xCC) //跳过读序号列号的 *** 作

WriteOneByte(0xBE) //读取温度寄存器,前两个分别是温度的低位和高位

Temp_Value[0]=ReadOneByte() //温度低8位

Temp_Value[1]=ReadOneByte() //温度高8位

DS18B20_IS_OK=1

}

}

//-------------------------------------

//函数功能:在LCD上显示当前温度

//入口参数:

//-------------------------------------

void Display_Temperature()

{

uchar i

//延时值与负数标识

uchar t=150,ng=0

//高5位全为1(0xF8)则为负数,为负数时取反加1,并设置负数标示

if ((Temp_Value[1] &0xF8)==0xF8)

{

Temp_Value[1]=~Temp_Value[1]

Temp_Value[0]=~Temp_Value[0]+1

if(Temp_Value[0]==0x00) Temp_Value[1]++ //加1后如果低字节为00表示有进位,进位位再加到高字节上

ng=1 //负数标示置1

}

Display_Digit[0]=df_Table[Temp_Value[0] &0x0F]//查表得到温度小数部分

//获取温度整数部分(高字节的低3位与低字节中的高4位,无符号)

CurrentT=((Temp_Value[0] &0xF0)>>4)|((Temp_Value[1] &0x07)<<4)

//将整数部分分解为3位待显示数字

Display_Digit[3]=CurrentT/100 //百位 digit[CurrentT/100]

Display_Digit[2]=CurrentT%100/10 //十位

Display_Digit[1]=CurrentT%10 //个位

//刷新LCD显示缓冲

Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0'//先将'0'转换成整数48,然后与前面数字相加,得到相应数字的ASCII字符

Current_Temp_Display_Buffer[10]='.'

Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0' //个位

Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0' //十位

Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0' //百位

//高位为0时不显示

if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' '

//高位为0且次高位为0时,次高位不显示

if(Display_Digit[2]==0 &&Display_Digit[3]==0)

Current_Temp_Display_Buffer[8]=' '

//负数符号显示在恰当位置

if(ng)

{

if (Current_Temp_Display_Buffer[8]==' ')

Current_Temp_Display_Buffer[8]='-'

else if(Current_Temp_Display_Buffer[7]==' ')

Current_Temp_Display_Buffer[7]='-'

else

Current_Temp_Display_Buffer[6]='-'

}

//在第一行显示标题

Set_Disp_Pos(0x00)

for(i=0i<16i++)

{

Write_LCD_Data(Temp_Disp_Title[i])

}

Set_Disp_Pos(0x40) //在第二行显示当前温度

for(i=0i<16i++)

{

Write_LCD_Data(Current_Temp_Display_Buffer[i])

}

//显示温度符号

// Set_Disp_Pos(0x4D)Write_LCD_Data(0x00)

Set_Disp_Pos(0x4D)Write_LCD_Data(0xdf)

Set_Disp_Pos(0x4E) Write_LCD_Data('C')

}

//-------------------------------------

//函数功能:主函数

//入口参数:

//-------------------------------------

void main()

{

Initialize_LCD()

Read_Temperature()

Delay(50000)

Delay(50000)

while (1)

{

Read_Temperature()

if (DS18B20_IS_OK) Display_Temperature()

delay1(100)

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存