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

设计的温度计,因为电路中用了温度传感器DS18B20,在读写它时的时序要求非常严格,在时序上特别是几个延时的时间不准樱知腊确脊滑,就会出现读温度错误。仿真成功,而实物错误,那比较仿真与实物的晶振频率是否相符。实猛稿物单片机要是STC的1T单片机,延时是有很大差别的。如果,晶振频率不同,在实物上运行的程序就要修改了。

下面是DS18B20测温实验源程序

ORG 0000H

START: MOV SP,#60H 开机初始化段碧

MOV P0,#0FFH

MOV P1,#0FEH

MOV P2,#0FFH

MOV P3,#0FFH

MAIN: LCALL GET_TEMPER 调用读温度子程序

LCALL DISP 调用数码管显示子程序

AJMP MAIN 重复循环

------ 读DS18B20传感念燃贺器的温度仔派值 ------

GET_TEMPER:

SETB P3.3

LCALL RST18B20 复位DS18B20

JB00H,DSS2

RET

DSS2: MOV A,#0CCH 跳过ROM匹配

LCALL WR18B20

MOV A,#44H 向DS18B20发出温度转换命令

LCALL WR18B20

LCALL RST18B20 准备读温度前先复位DS18B20

MOV A,#0CCH 跳过ROM匹配

LCALL WR18B20

MOV A,#0BEH 向DS18B20发出读温度命令

LCALL WR18B20

LCALL RE18B20 读出温度数据

RET

------ DS18B20复位初始化程序 ------

RST18B20:

SETB P3.3

NOP

CLR P3.3

MOV R0,#06BH 主机发出复位低脉冲

MOV R1,#03H

DSR1: DJNZ R0,DSR1

MOV R0,#6BH

DJNZ R1,DSR1

SETB P3.3拉高数据线

NOP

NOP

NOP

MOV R0,#25H

DSR2: JNB P3.3,DSR3 等待DS18B20回应

DJNZ R0,DSR2

LJMP DSR4

DSR3: SETB 00H 置标志位,表示DS1820存在

LJMP DSR5

DSR4: CLR 00H 清标志位,表示DS1820不存在

LJMP DSR7

DSR5: MOV R0,#06BH

DSR6: DJNZ R0,DSR6 延时一段时间

DSR7: SETB P3.3

RET

------ 写DS18B20的子程序 ------

WR18B20:

MOV R2,#8

CLR C

WR1: CLR P3.3

MOV R3,#6

DJNZ R3,$

RRC A

MOV P3.3,C

MOV R3,#23

DJNZ R3,$

SETB P3.3

NOP

DJNZ R2,WR1

SETB P3.3

RET

------ 从DS18B20中读温度数据程序 ------

RE18B20:

MOV R4,#2

MOV R1,#2FH

RE00: MOV R2,#8

RE01: CLR C

SETB P3.3

NOP

NOP

CLR P3.3

NOP

NOP

NOP

SETB P3.3

MOV R3,#09

RE10: DJNZ R3,RE10

MOV C,P3.3

MOV R3,#23

RE20: DJNZ R3,RE20

RRC A

DJNZ R2,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

-------- 显示子程序 --------

DISP: MOV A,2FH

MOV C,70H

RRC A

MOV C,71H

RRC A

MOV C,72H

RRC A

MOV C,73H

RRC A

MOV 2FH,A

MOV A,2FH

MOV B,#10

DIV AB

MOV 30H,A

MOV 31H,B

MOV A,30H

MOV DPTR,#SGTB

MOVC A,@A+DPTR

MOV P0,A 显示温度“十位”值

CLR P2.2

SETB P2.0

SETB P2.1

SETB P2.3

SETB P2.4

LCALL YS4722U

MOV A,31H

MOV DPTR,#SGTB

MOVC A,@A+DPTR

MOV P0,A 显示温度“个位”值

CLR P2.3

SETB P2.0

SETB P2.1

SETB P2.2

SETB P2.4

LCALL YS4722U

MOV A,#01000110B

MOV P0,A 显示温度符号“ ℃”

CLR P2.4

SETB P2.0

SETB P2.1

SETB P2.2

SETB P2.3

LCALL YS4722U

RET

************* 8位共阳数码管显示器字型码表 *****************

SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H

YS4722U:

MOV R4,#10 延时子程序

Y3: MOV R5,#216

DJNZ R5,$

DJNZ R4,Y3

RET

END

精度不知道


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存