找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2301|回复: 8
收起左侧

求高手指导,关于51单片机温度计的!!!!!

[复制链接]
ID:98222 发表于 2015-12-3 21:23 | 显示全部楼层 |阅读模式
程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sbit din=P1^0;                            //MAX7219数据串行输入端
sbit cs=P1^1;                             //MAX7219数据输入允许端
sbit clk=P1^2;                            //MAX7219时钟信号
sbit DQ=P1^5;                             //DS18B20端口DQ
uchar dig;
sbit DIN = P0^7;                          //小数点
bit  list_flag=0;                         //显示开关标志
uchar code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,
                  0x70,0x7f,0x7b,0x4E,0x63,0x01,0x00};   //表示不译方式0~9,0x4E为‘C’;0x63为'.';0x01为'-';0x00为不显示
uchar data  temp_data[2]={0x00,0x00};
unsigned char data  display[]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code  ditab[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                             0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
void Delay(unit ms)                        //延时函数
{
  while(ms--);
}
uchar Init_DS18B20(void)                   //初始化DS18B20
{
   uchar status;
   DQ = 1;                              //DQ复位
   Delay(8);                            //延时片刻
   DQ = 0;                              //单片机将DQ拉低
   Delay(90);         //精确延时 大于 480us
   DQ = 1;          //拉高总线
   Delay(8);
   status=DQ;         //如果为0,则初始化成功;如果为1,则初始化失败
   Delay(100);
   DQ = 1;
   return(status);
}
uchar ReadOneByte(void)                    //读一个字节
{
   uchar i=0;
   uchar dat=0;
   for(i=8;i>0;i--)
   {
     DQ=0;                       //给脉冲信号
  dat >>=1;
  DQ=1;                                 //给脉冲信号
  _nop_();
  _nop_();
  if(DQ)
  {
    dat|=0x80;
  }
  Delay(4);
  DQ=1;
   }
   return(dat);
}
void WriteOneByte(uchar dat)              //写一个字节
{
   uchar i=0;
   for(i=8;i>0;i--)
   {
     DQ=0;
  DQ = dat&0x01;
  Delay(5);
  DQ=1;
     dat>>=1;
   }
}
void Read_Temperature(void)              //读取温度
{
   if(Init_DS18B20()==1)
      {
        list_flag=1;                        //DS18B20不正常
      }
   else
       {         
      list_flag=0;      
   WriteOneByte(0xCC);    //跳过读序号列号的操作
   WriteOneByte(0X44);    //启动温度转换
   Init_DS18B20();
      WriteOneByte(0xCC);    //跳过读序号列号的操作
   WriteOneByte(0xBE);    //读取温度寄存器
   temp_data[0]=ReadOneByte();  //温度低8位
   temp_data[1]=ReadOneByte();  //温度高8位
    }
}
void Temperature_trans()                    //温度值处理
{
   uchar  ng=0;
   if((temp_data[1]&0xF8)==0xF8)
   {
      temp_data[1]=~temp_data[1];
   temp_data[0]=~temp_data[0]+1;
   if(temp_data[0]==0x00)
   {
      temp_data[1]++;
   }
   ng=1;
   }
   display[4]=temp_data[0]&0x0f;
   display[0]=ditab[display[4]];            //查表得小数位的值
   display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
   display[3]=display[4]/100;
   display[1]=display[4]%100;
   display[2]=display[1]/10;
   display[1]=display[1]%10;
   if(ng==1)                                //温度为零度以下时
      {
        display[5]=12;                      //显示“-”
      }
else
   {
     display[5]=13;                      //不显示“-”
   }
if(!display[3])                         //高位为0,不显示
  {
    display[3]=13;
    if(!display[2])                     //次高位为0,不显示
       display[2]=13;
  }
}     
void write_7219(uchar add,uchar date)       //add为接受MAX7219地址:data为要写的数据
{
     uchar i;
  cs=0;
  for(i=0;i<8;i++)
  {
      clk=0;
   din=add&0x80;                      //按照高位在前,低位在后的顺序发送
   add<<=1;                           //先发送地址
   clk=1;
  }
  for(i=0;i<8;i++)                       //时钟上升沿写入一位
  {
      clk=0;
   din=date&0x80;
   date<<=1;                          //再发送数据
   clk=1;
  }
  cs=1;
}
void int_7219()
{
     write_7219(0x0c,0x01);     //0x0c 为关断模式寄存器;0x01 表示显示器处于工作状态
  write_7219(0x0a,0x0f);     //0x0a 为亮度调节寄存器;0x0f 使数码管显示亮度为最亮
  write_7219(0x09,0x00);     //oxo9 为译码模式选择寄存器;0x00为非译码方式
  write_7219(0x0b,0x07);     //0x0b 为扫描限制寄存器;0x07 表示可将8个LED数码管
}
void disp_Max7219(uchar dig,uchar date)     //指定位,显示某一数
{
   write_7219(dig,date);
}
void main()
{
     init_7219();
  while(1)
  {
     Temperature_trans();
  Read_Temperature();
  if(list_flag==0)
    {
      disp_Max7219(1,tab[display[5]]);
   disp_Max7219(2,tab[display[3]]);
   disp_Max7219(3,tab[display[2]]);
   disp_Max7219(4,tab[display[1]]|0x80);        //|0x80为带上小数点
   disp_Max7219(5,tab[display[0]]);
   disp_Max7219(7,tab[11]);
   disp_Max7219(8,tab[10]);
    }
  }
}
回复

使用道具 举报

ID:98222 发表于 2015-12-3 22:50 | 显示全部楼层
本帖最后由 电饭煲 于 2015-12-3 22:54 编辑

这是电路图  ,运行后没显示,不知道哪里错了                                                                                                                                                                                                      


电路图

电路图
回复

使用道具 举报

ID:98222 发表于 2015-12-3 22:52 | 显示全部楼层
运行后就是没显示,搞了半天实在不知道哪里不对
回复

使用道具 举报

ID:98251 发表于 2015-12-4 00:34 | 显示全部楼层
我也在做
回复

使用道具 举报

ID:98222 发表于 2015-12-4 08:59 来自手机 | 显示全部楼层
2997553568 发表于 2015-12-4 00:34
我也在做

做好了吗
回复

使用道具 举报

ID:79544 发表于 2015-12-4 13:32 | 显示全部楼层
先写个液晶显示的程序看看电路如何,再查电路或程序
回复

使用道具 举报

ID:98251 发表于 2015-12-5 10:01 | 显示全部楼层

没有,已经困扰了好几天
回复

使用道具 举报

ID:96682 发表于 2015-12-5 10:26 | 显示全部楼层
干嘛不用 P0口和P2口驱动数码管呢?
回复

使用道具 举报

ID:96682 发表于 2015-12-5 13:01 | 显示全部楼层
数码管点亮倒是没问题,只是没有时钟信号这温度计探头没法开工了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表