程序如下:
#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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)