hamiltontai吧 关注:24贴子:747

-液晶和温度传感器-

只看楼主收藏回复

RT


IP属地:北京1楼2012-12-18 23:01回复
    题目:
    用温度传感器探测到温度,用液晶显示出来,并假设温度范围为20-30摄氏度,如果超出范围声音报警。


    IP属地:北京2楼2012-12-18 23:02
    回复
      代码序号:1447554


      IP属地:北京3楼2012-12-18 23:04
      回复
        审核ING,不知道审核完毕能有多少……


        IP属地:北京4楼2012-12-18 23:05
        回复
          程序源码:
          /********************************************
          读取DS18B20温度,通过LCD1602显示出来
          第一行: 实时温度值
          第二行: 允许最大值和最小值
          ********************************************/
          #include <reg52.h>
          #include <intrins.h>
          #define uint unsigned int
          #define uchar unsigned char
          sbit DQ=P2^2; //定义DS18B20通信端口
          sbit lcd_rs_port=P3^5; //定义LCD控制端口
          sbit lcd_rw_port=P3^6;
          sbit lcd_en_port=P3^4;
          sbit beep=P2^3;
          #define lcd_data_port P0
          sbit WELA=P2^7; //数码管的位选信号
          void delay1 (uint sx) //关闭数码管延时程序
          {
          int sj,sk;


          IP属地:北京5楼2012-12-19 06:52
          回复
            for (sj=sx;sj>0;sj--)
            for(sk=110;sk>0;sk--);
            }
            //////////////以下是LCD1602驱动程序////////////////
            void lcd_delay(uchar ***CD1602 延时
            {
            uchar j;
            while(ms--)
            {
            for(j=0;j<250;j++);
            }
            }
            void lcd_busy_wait() //LCD1602 忙等待
            {
            lcd_rs_port=0;
            lcd_rw_port=1;
            lcd_en_port=1;


            IP属地:北京6楼2012-12-19 06:52
            回复
              lcd_data_port=0xff;
              while (lcd_data_port&0x80);
              lcd_en_port=0;
              }
              void lcd_command_write(uchar command) //LCD1602 命令字写入
              {
              lcd_busy_wait();
              lcd_rs_port=0;
              lcd_rw_port=0;
              lcd_en_port=0;
              lcd_data_port=command;
              lcd_en_port=1;
              lcd_en_port=0;
              }
              void lcd_system_reset() //LCD1602 初始化
              {
              lcd_delay(20);
              lcd_command_write(0x38);
              lcd_delay(100);
              lcd_command_write(0x38);


              IP属地:北京7楼2012-12-19 06:52
              回复
                lcd_delay(50);
                lcd_command_write(0x38);
                lcd_delay(10);
                lcd_command_write(0x38); //设置显示模式 16*2显示,5*7点阵,8位数据接口
                lcd_command_write(0x08);
                lcd_command_write(0x01);
                lcd_command_write(0x06); //地址指针加1,光标加1,整屏不动。
                lcd_command_write(0x0c); //开显示,不显示光标,光标不闪烁。
                }
                void lcd_char_write(uchar x_pos,y_pos,lcd_dat) //LCD1602 字符写入
                {
                x_pos&=0x0f; //X位置范围 0~15
                y_pos&=0x01; //Y位置范围 0~ 1
                if(y_pos==1) x_pos+=0x40;


                IP属地:北京8楼2012-12-19 06:52
                回复
                  x_pos += 0x80;
                  lcd_command_write(x_pos);//写入指针位置
                  lcd_busy_wait();
                  lcd_rs_port=1;
                  lcd_rw_port=0;
                  lcd_en_port=0;
                  lcd_data_port=lcd_dat;
                  lcd_en_port=1;
                  lcd_en_port=0;
                  }
                  void lcd_bad_check() //LCD1602 坏点检查
                  {
                  char i,j;
                  for(i=0;i<2;i++)
                  for(j=0;j<16;j++)
                  lcd_char_write(j,i,0xff);


                  IP属地:北京9楼2012-12-19 06:52
                  回复
                    lcd_delay(200);
                    lcd_delay(200);
                    lcd_delay(200);
                    lcd_delay(100);
                    lcd_delay(200);
                    lcd_command_write(0x01); //清除液晶显示
                    }
                    //////////////////以上是LCD1602驱动程序////////////////
                    //////////////////以下是DS18B20驱动程序////////////////
                    //延时函数
                    void delay(unsigned int i)//约100us
                    {
                    while(i--);
                    }
                    //初始化函数
                    Init_DS18B20(void)
                    {
                    unsigned char x=0;
                    DQ=1; //DQ复位
                    delay(8); //稍做延时
                    DQ=0; //单片机将DQ拉低


                    IP属地:北京10楼2012-12-19 06:52
                    回复
                      delay(80); //精确延时 大于 480us
                      DQ=1; //拉高总线
                      delay(14);
                      x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
                      delay(20);
                      }
                      //读一个字节
                      ReadOneChar(void)
                      {
                      uchar i=0;
                      uchar dat=0;
                      for (i=8;i>0;i--)
                      {
                      DQ=0; // 给脉冲信号
                      dat>>=1;
                      DQ=1; // 给脉冲信号
                      if(DQ) dat|=0x80;


                      IP属地:北京11楼2012-12-19 06:52
                      回复
                        delay(4);
                        }
                        return(dat);
                        }
                        //写一个字节
                        WriteOneChar(uchar dat)
                        {
                        uchar i=0;
                        for (i=8;i>0;i--)
                        {
                        DQ=0;
                        DQ=dat&0x01;
                        delay(5);
                        DQ=1;
                        dat>>=1;
                        }
                        }
                        //读取温度
                        ReadTemperature(void)
                        {
                        uchar a=0;
                        uchar b=0;


                        IP属地:北京12楼2012-12-19 06:52
                        回复
                          uint t=0;
                          float tt=0;
                          Init_DS18B20();
                          WriteOneChar(0xCC); // 跳过读序号列号的操作
                          WriteOneChar(0x44); // 启动温度转换
                          Init_DS18B20();
                          WriteOneChar(0xCC); //跳过读序号列号的操作
                          WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
                          a=ReadOneChar();
                          b=ReadOneChar();
                          t=b;
                          t<<=8;
                          t=t|a;
                          tt=t*0.0625; //将温度的高位与低位合并
                          t= tt*10+0.5; //对结果进行4舍5入


                          IP属地:北京13楼2012-12-19 06:52
                          回复
                            return(t);
                            }
                            //////////////////以上是DS18B20驱动程序////////////////
                            //定义数字ascii编码
                            uchar mun_char_table[]={"0123456789abcdef"};
                            uchar temp_table[] ={"Temp: . 'C"};
                            uchar temp_high_low[]={"H: . L: . "};
                            //1MS为单位的延时程序
                            void delay_1ms(uchar x)
                            {
                            uchar j;
                            while(x--)
                            {
                            for(j=0;j<125;j++);
                            }
                            }
                            void alarm(void)
                            {
                            uint aj;


                            IP属地:北京14楼2012-12-19 06:52
                            回复
                              beep=0;
                              for(aj=0;aj<5;aj++)
                              delay_1ms(100);
                              beep=1;
                              for(aj=0;aj<5;aj++)
                              delay_1ms(100);
                              }
                              void main()
                              {
                              uint i=0;
                              float th,tl;
                              uint tth,ttl;
                              th=30.0; //设置最高和最低允许温度
                              tl=20.0;
                              tth=th*10+0.5;


                              IP属地:北京15楼2012-12-19 06:52
                              回复