微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 温度传感器两个好奇妙的问题 谢谢大神啦

温度传感器两个好奇妙的问题 谢谢大神啦

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include <intrins.h>
#define uchar  unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar flag,num;
uint temp;
uchar code table[]={"Temp=      C"};
uchar code table1[]={"0123456789"};     //不带小数点数字编码

void delay_us(uint x)                         //延时x微秒
{
        while(x--);
}
void delay(uint i)                          //延时i 毫秒
{                
        uint x,y;
        for(x=i;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)           //液晶写命令函数
{
         lcdrs=0;
         P0=com;
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
}
void write_data(uchar date)                 //液晶写数据
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void init_yejing()                                  //液晶初始化
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<12;num++)
        {
                write_data(table[num]);
                delay(5);
        }
        write_com(0x80+10);
        write_data(0xdf);
}
/*void ds_reset()            //DS18B20初始化
{
        ds=1;
        delay_us(1);
        ds=0;
//        delay_us(600);
//        delay_us(40);
        delay_us(81);
        ds=1;
        delay_us(44);
        if(ds==0)
                flag=1;                 //检测28b20成功
        else
                flag=0;                 //检测28b20失败
        delay_us(140);
        ds=1;
}                         */
void ds_reset()            //DS18B20初始化
{
        uint i;
        ds=0;
        i=103;
        while(i>0) i--;
        ds=1;
        i=4;
        while(i>0) i--;
}
/*bit ds_read_bit()      //温度传感器读一位
{
        bit dat;
//        ds=1;
//        delay_us(2);
        ds=0;
//        delay_us(6);
        delay_us(1);
        ds=1;
        delay_us(2);
        dat=ds;
        delay_us(20);
        return(dat);
}            */
bit ds_read_bit()                  //温度传感器读一位                                       
{
        uint i;
        bit dat;
        ds=0;
        i++;
        ds=1;
        i++;i++;
        dat=ds;
        i=8;
        while(i>0) i--;
        return dat;
}          
uchar ds_read_byte()      //温度传感器读一字节
{
        uchar value,i,j;
        value=0;
        for(i=0;i<8;i++)
        {
                j=ds_read_bit();
                value=(j<<7)|(value>>1);
        }       
        return value;
}
void ds_write_byte(uchar dat)          //温度传感写一个字节
{
        uchar j;                                        
        uint i;
        bit onebit;
        for(j=0;j<8;j++)
        {
                onebit=dat&0x01;
                dat=dat>>1;       
        if(onebit)                                                //写1
        {
                ds=0;
                i++;i++;
                ds=1;
                i=8;while(i>0)i--;
        }
        else                              //写0
        {
                ds=0;
                i=8;
                while(i>0)
                i--;
                ds=1;
                i++;i++;
        }
        }
}                               

void tem_change()              //发送温度转换命令
{
        ds_reset();
        delay(2);
        ds_write_byte(0xcc);
        ds_write_byte(0x44);
}
uint get_temp()
{
        float wendu;
        uchar H,L;
        ds_reset();
        delay(2);
        ds_write_byte(0xcc);
        ds_write_byte(0xbe);
        L=ds_read_byte();
        H=ds_read_byte();
        temp=H;
        temp=temp<<8;
        temp=temp|L;
        wendu=temp*0.0625;
        temp=wendu*100+0.05;
        return temp;        
}
void display(uint wendu)                           //液晶屏显示温度
{
        uchar qian,bai,shi,ge,wenduH,wenduL;
        wenduH=wendu/100;
        wenduL=wendu%100;
        qian=wenduH/10;       //测得的温度的首位
        bai=wenduH%10;       //测得的温度的第二位
        shi=wenduL/10;       //测得的温度的第三位
        ge=wenduL%10;       //测得的温度的第四位
        write_com(0x80+5);
        delay(5);
        write_data(table1[qian]);
        delay(5);
        write_data(table1[bai]);
        delay(5);
        write_data('.');
        delay(5);
        write_data(table1[shi]);
        delay(5);
        write_data(table1[ge]);
        delay(5);
}
/*void init_com()
{
        TMOD=0x20;      //设置定时器1为模式2
   TH1=0xfd;       //装初值设定波特率
   TL1=0xfd;
   TR1=1;          //启动定时器
   SM0=0;          //串口通信模式设置
   SM1=1;
// REN=1;          //串口允许接收数据
   PCON=0;         //波特率不倍频
//  SMOD=0;       //波特率不倍频
  // EA=1;          //开总中断
  //ES=1;          //开串行中断
}         */
                                                          
void main()
{
        uint e;
        init_yejing();
        while(1)
        {
                 tem_change();
                 for(e=10;e>0;e--)
                 {
                         display(get_temp());
             }
        }
}
温度传感器写一个字节的那个子函数,为啥这个地方一定要分别把j定义为uchar  把i定义为uint,不能定义反也不能都定义成uint或uchar  否则就无法出数据呢    还有温度传感器读一位的子函数,为啥用我自己写的上面的标为注释的那一段程序就不对呢    求大神解答  谢谢啦

看程序应该没这问题呀,估计是哪里设置不对了

但是如果改了的话  确实在液晶屏上出现乱码啊 啊啊

那你把温度采集程序先不弄了,就光弄液晶试试呢

特不幸的是  正常显示

正常显示好啊,那在一点一点试温度这块吧,逐步排除错误的程序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top