📄 温度测量.c
字号:
#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define RS_1 PORTA|=(1<<3)
#define RS_0 PORTA&=~(1<<3)
#define RW_1 PORTA|=(1<<4)
#define RW_0 PORTA&=~(1<<4)
#define EN_1 PORTA|=(1<<5)
#define EN_0 PORTA&=~(1<<5)
unsigned char str1[]={"temperature1: "};
unsigned char str2[]={"temperature2: "};
unsigned char str3[]={"temperature3: "};
unsigned char str4[]={"temperature4: "};
unsigned char str5[4][8]={
{0x28,0x45,0xc5,0xb8,0x00,0x00,0x00,0xfd},
{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},
{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},
{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0}
};
uchar adata[5];
uchar n;
uint tvalue;//温度
uchar tflag;//温度正负标志
/*************************lcd1602程序**************************/
void delay1ms(uint i)//延时1毫秒(不够精确的)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<1142;j++);
}
void wr_com(unsigned char com)//写指令//
{
delay1ms(1);
RS_0;
RW_0;
EN_0;
PORTB=com;
delay1ms(1);
EN_1;
delay1ms(1);
EN_0;
}
void wr_dat(unsigned char dat)//写数据//
{
delay1ms(1);
RS_1;
RW_0;
EN_0;
PORTB=dat;
delay1ms(1);
EN_1;
delay1ms(1);
EN_0;
}
void lcd_init()//初始化设置//
{
DDRB|=0xFF; /*I/O口方向设置*/
DDRA|=(1<<3)|(1<<4)|(1<<5);
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void display(unsigned char *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
/******************************ds1820程序***************************************/
void delay_18B20(int time)
{
do
time--;
while(time>1);
}
unsigned char ds1820rst()/*ds1820复位*/
{
unsigned char ack;
DDRA|=0x01;
PORTA&=0xfe;
delay_18B20(500);
PORTA|=0x01;
DDRA&=0xfe;
delay_18B20(75);
ack=PINA;
ack&=0x01;
delay_18B20(500);
return ack;
}
unsigned char ds1820rd()/*读数据*/
{
unsigned char i,byte,temp;
byte=0x00;
for (i=0;i<8;i++)
{
DDRA|=0x01;
PORTA&=0xfe;//给脉冲信号
delay_18B20(3);
PORTA|=0x01;
DDRA&=0xfe;
delay_18B20(10);
temp=(PINA&0x01);
if(temp!=0x00)
byte|=0x80;
if(i<7)
byte=byte>>1;
delay_18B20(100);
DDRA|=0x01;
delay_18B20(5);
}
return byte;
}
void ds1820wr(uchar wdata)/*写数据*/
{
unsigned char i,j;
DDRA|=0x01;
for (j=0;j<=7;j++)
{
i=wdata&0x01;
if(i==0x01)
{
PORTA&=0xfe;
delay_18B20(10);
PORTA|=0x01;
delay_18B20(100);
}
else
{
PORTA&=0xfe;
delay_18B20(100);
PORTA|=0x01;
delay_18B20(10);
}
wdata=wdata>>1;
}
}
/******************************************************************/
void ds1820disp()//温度值显示
{
uchar flagdat;
DDRB|=0xFF;
DDRC|=(1<<3)|(1<<4)|(1<<5);
adata[0]=tvalue/1000+0x30;//百位数
adata[1]=tvalue%1000/100+0x30;//十位数
adata[2]=tvalue%100/10+0x30;//个位数
adata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(adata[0]==0x30)
{
adata[0]=0x20;//如果百位为0,不显示
if(adata[1]==0x30)
{
adata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
if(n==0)
{
wr_com(0x80);
display(str1);
}
else if(n==1)
{
wr_com(0x80);
display(str2);
}
else if(n==2)
{
wr_com(0x80);
display(str3);
}
else if(n==3)
{
wr_com(0x80);
display(str4);
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(adata[0]);//显示百位
wr_com(0xc2);
wr_dat(adata[1]);//显示十位
wr_com(0xc3);
wr_dat(adata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(adata[3]);//显示小数位
}
/*******************读取温度值并转换********************************/
void readandisp_temp()
{
unsigned char a,b,i;
DDRB|=0xFF;
DDRA|=(1<<3)|(1<<4)|(1<<5);
lcd_init();
for(n=0;n<4;n++)
{
do
i=ds1820rst();
while(i==0x01);
ds1820wr(0xCC);
ds1820wr(0x44);
delay_18B20(600);
do
i=ds1820rst();
while(i==0x01);
ds1820wr(0x55);//匹配
for(i=0;i<8;i++)
{
ds1820wr(str5[n][i]);
}
ds1820wr(0xbe);
a=ds1820rd();
b=ds1820rd();
ds1820rst();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
ds1820disp();
delay1ms(1000);
}
}
/********************主程序***********************************/
void main()
{
while(1)
{
readandisp_temp();//读取和显示温度
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -