⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度测量.c

📁 电机的不同转动轻快
💻 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 + -