微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 52单片机读取当前温度的电路图和程序

52单片机读取当前温度的电路图和程序

时间:10-02 整理:3721RD 点击:
电路图仿真

程序
// 遇到的问题,负数转换的时候因为我只读了整数和一位符号位,就是八位,但是刚开始定义为 int型,
//然后加0x30,一直转换错误,后来定义为 uchar, 就好了!
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^6;
sbit lcde=P2^2;
sbit lcdrw=P2^1;
sbit lcdrs=P2^0;
float w=0;
int w1=0,w2=0;
uchar w3=0;
int m[12]={0};
uchar table1[]={0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x07,
0x08,0x10,0x10,0x10,0x10,0x08,0x07,};
//温度单位的自定义字符代码
               
/**********精确延时函数群******/
void delay600us(void)   //延时800us子函数
{
    uchar a,b;
    for(b=119;b>0;b--)
        for(a=1;a>0;a--);
}
void delay750ms(void)   //延时750ms
{
    unsigned char a,b,c;
    for(c=61;c>0;c--)
        for(b=28;b>0;b--)
            for(a=218;a>0;a--);
}
void delay20us(void)   //延时20us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}
void delay70us(void)   //延时70us子函数
{
    unsigned char a,b;
    for(b=13;b>0;b--)
        for(a=1;a>0;a--);
}
void delay(uint j)        //LCD延时函数
        {
         uint k;
         while(j)
                 {
                 for(k=50;k>0;k--);
                 j--;
                }
        }  
/**************DS1820初始化**********/
void csh()
        {               
                 DQ=0;
                 delay600us();
                 DQ=1;
                 _nop_();
                delay600us();               
        }
/*********DS1820写函数*******/
        void write(uint j)
        {
                uint i;
                for(i=0;i<8;i++)
                {               
                 DQ=0;
                 delay20us();
                 DQ=j&0x01;
                 delay70us();
                j=j>>1;
                DQ=1;
                _nop_();
                }
        }
/*********DS1820读函数*******/
        void read()
                {
                 uint k;
                 for(k=0;k<12;k++)
                 {
                 DQ=0;
                 _nop_();
                 DQ=1;
                 _nop_();
             m[k]=DQ;
                 delay70us();
                 delay70us();                                           
                 }       
                 w=m[0]/16+m[1]/8+m[2]/4+m[3]/2+m[4]+2*m[5]+4*m[6]+8*m[7]+16*m[8]+32*m[9]+64*m[10];       
                 w1=10*w;//正数
                 w2=m[11];
                 w3=m[4]+2*m[5]+4*m[6]+8*m[7]+16*m[8]+32*m[9]+64*m[10]+128*m[11];//负数                       
                 w3=~(w3-1);//补码还原成原码       
                 //算出温度值,乘个10,舍去最末三个小数,浮点变整形。
                }
/*********LCD写命令*******/
void write_com(uchar com)
                        {                         
                         lcdrs=0;
                         lcde=0;
                         P0=com;
                         delay(1);
                         lcde=1;
                         delay(1);
                         lcde=0;
                        }
/*********LCD写数据*******/
void write_date(int date)
                                {
                                          lcdrs=1;
                                         P0=date;
                                    delay(1);
                                         lcde=1;
                                         delay(1);
                                         lcde=0;
                                }
/*********LCD初始化*******/
void init()
                                {
                                 lcde=0;
                                 write_com(0x3c); //设置5*7,8位
                                 write_com(0x0c);//画面显示开,光标关闭,
                                 write_com(0x06); //输入方式 光标自动加一
                                 write_com(0x01);//清屏                                               
                                }
/*********LCD显示*******/
void xianshi()
                                {                       
                                uchar com;
                                 init();
                                if(w2==0)           //判断符号位是否为0;
                                {
                                 write_com(0x80);         //正的话从这里执行                                                                  
                                if((w1/1000)==0)
                                        {                                         
                                         write_date(0xfe);
                                        }
                                else
                                        {                               
                                write_date(w1/1000+0x30);        //百位
                                         }
                               _nop_();
                                  write_com(0x81);
                                    if((w1/100)==0)
                                         {
                                         write_date(0xfe);
                                        }
                                 else
                                 {
                                  write_date(w1%1000/100+0x30);         //十位                                         
                                _nop_();
                                 }
                                 write_com(0x82);                               
                                 write_date( w1%1000%100/10+0x30);        //个位                                                                 
                                _nop_();
                                 write_com(0x83);                                          
                                 write_date('.');        //写上小数点
                                _nop_();
                                 write_com(0x84);                                          
                                 write_date(w1%1000%100%10+0x30);//小数点后第一位
                                _nop_();
                       
                                }
                                else //负数从这里执行
                                {
                                   write_com(0x80);
                                   write_date(0xfe);
                                        write_com(0x82);
                                        write_date(0xb0);                                                                           
                               
                                if(w3/10==0)
                                {
                                        write_com(0x83);                       
                                 write_date(0xfe);        //十位                                       
                                }
                                else{
                                          write_date(w3/10+0x30);        //十位               
                                    }
                          write_com(0x84);                                                                   
                                  write_date(w3%10+0x30);         //个位       
                                   }       
                                  
                                          write_com(0x40);//往自定义寄存器CGRAM中写数据命令
                                for(com=0;com<16;com++)
                                        {
                                         write_date(table1[com]);
                                        }        //温度的单位用两个字节显示,一个字节写八行,一共需要写16个                                       
                                        write_com(0x85);//显示位置
                                        write_date(0x00); //显示第一个自定义字符
                                        write_com(0x86);
                                        write_date(0x01);                                                                                                                                                                                        
                                                        
                                     }
/*********************** 主程序*********************/
                void main()
                {
                 csh();
                 write(0xcc);
         write(0x44);
         delay750ms();
         csh();
         write(0xcc);
         write(0xbe);
                 read();
                 xianshi();       
                }


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

网站地图

Top