zoukankan      html  css  js  c++  java
  • 单片机: 热敏电阻測温而且显示到数码管(温度计)

       如上图所看到的,PCF8591的9脚和10脚。一个是数据线SDA。一个是时钟线SCL。分别接到单片机的P2.0 , P2.1上面。

    为什么选这两个引脚?由于51单片机上没有IIC总线接口,须要用普通的IO模拟。所以它随便选了两个IO接上即可。

    VREF是什么?基准电压。也是它能測量的最大电压。
    怎样控制?今天先不说IIC总线,仅仅说控制流程。
    看器件手冊能够知道:
    分四步:
    1、发送地址字节,选择该器件。

    2、发送控制字节,选择相应通道。               
    3、又一次发送地址字节,选择该器件。
    4、接收目标通道的数据。

    这次的程序流程是:AD採样,串口发送,循环运行。

    详细实现看代码:
    #include <reg51.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    #define  PCF8591 0x90
    sbit SCL=P2^0;
    sbit SDA=P2^1; 
    sbit spk=P1^4;
    sbit WEI=P2^7;  //wei
    sbit DUAN=P2^6; //duan
    
    unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};// 显示段码值0~9
    unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别相应相应的数码管点亮,即位码
    
    void delay(int z)
    {
    	while(z--);
    }
    
    
    void Screen(int i,int n)
    {
    
         P0=0;
         DUAN=1;
    	 DUAN=0;
         
         P0=dofly_WeiMa[i];
         WEI=1;
    	 WEI=0;
        
         P0=dofly_DuanMa[n]; 
         DUAN=1;  
         DUAN=0;
    
    	 delay(250);
    
    }
    
    void Get_out_print(uchar temperatureNum)
    {
        if(temperatureNum/100>0)
    	{
    	   Screen(3,temperatureNum/100);
    	   temperatureNum%=100;
    	}
    
    	if(temperatureNum/10>0)
    	 {
    	     Screen(4,temperatureNum/10);
            
    	 }
          
    	 Screen(5,temperatureNum%10);
    	 Screen(7,12); //显示c
    
    }
    
    
    void delay()   //延时4-5个微秒
    {;;}
    
    void delay_1ms(uint z)
    {
     uint x,y;
     for(x=z;x>0;x--)
               for(y=110;y>0;y--)
                     ;
    }
    
    void start()
    {
      SDA=1;
        delay();
      SCL=1;
        delay();
      SDA=0;
        delay();
    }
    
    void stop()
    {
      SDA=0;
        delay();
      SCL=1;
        delay();
      SDA=1;
        delay();
    }
    
    
    void respons()
    {
      uchar i;
      SCL=1;
        delay();
      while((SDA==1)&&(i<250))
               i++;
          SCL=0;
        delay();
    }
    
    void init() 
    {
      SDA=1;
        delay();
      SCL=1;
        delay();    
    }
    
    uchar read_byte()
    {
        uchar i,k;
        SCL=0;
        delay();
        SDA=1;
        delay();
       for(i=0;i<8;i++)
       {
             SCL=1;
                delay();
              k=(k<<1)|SDA;
                 SCL=0;
                delay();
       }
      return k;
    
    }
    
    void write_byte(uchar date)
    {
         uchar i,temp;
         temp=date;
         for(i=0;i<8;i++)
         {
             temp=temp<<1;
              SCL=0; 
              delay();
              SDA=CY;
              delay();
              SCL=1;
              delay();            
         }   
         SCL=0;
           delay();
         SDA=1;
           delay();
    }
    
    
    
    void write_add(uchar control,uchar date)
    {
            start();
            write_byte(PCF8591);       
            respons();
            write_byte(control);
            respons();
            write_byte(date);
            respons();
            stop();
    
    }
    
    uchar read_add(uchar control)
    {
           uchar date;
           start();
           write_byte(PCF8591);
           respons();
           write_byte(control);
           respons();
           start();
           write_byte(PCF8591+1);
           respons();
           date=read_byte();
           stop();
           return date;
    
    }
    uchar temperatureNum=0;
    void main()
    {  
       
       TMOD= 0x01;		     
       EA=1;
       ET0=1; 
       TR0=1;              
       init();
       while(1)
       {        
         temperatureNum=read_add(0x41);  //确定路
         Get_out_print(151-temperatureNum);
       }
    }
    
    void Timer0_isr(void) interrupt 1 
    {
       TH0=0xfe;
       TL0=0;
       if(temperatureNum<118)
     	spk=!spk;
    
    }
    注意:温度可能不是非常准确,由于我的电压---温度相应关系没有进行细致的測量。。粗略为y=-x+151


  • 相关阅读:
    workerPool _ golang
    jsp:JDBCmysql数据库连接
    jsp:session的跟踪方式
    js:使用nodejs为页面传递mysql中的数据
    js:网页中的高和宽(document)
    js:nodejs简单的Http服务器搭建
    js:面向对象编程
    js:nextSibling兄弟节点的使用
    java:mysql基础语法
    jsp:常用标签的核心标签的使用
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8316412.html
Copyright © 2011-2022 走看看