找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1746|回复: 12
打印 上一主题 下一主题
收起左侧

求大神,用STC89C52芯片程序需要怎样修改,TM1637和DS18B20

[复制链接]
跳转到指定楼层
楼主
ID:917238 发表于 2021-8-12 18:07 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "STC15W4K.H"
#include "DS18b20.h"
#include "myfun.h"
#include "TM1637.h"
unsigned char str[6];                   // 最长字符10字节,比如:-123.4567/0
unsigned char zf;
//****************温度数据处理函数************************/
void gettemp()                           //读取温度值
{                     
         unsigned int temp0,temp;      // 存放小数、整数、符号,10000倍小数值
         temp=DS18B20_ReadTemperature();         // 从18B20中读取2字节原始温度值
         
         if ((temp&0xf800)!=0)                   // 如果是负温,将补码取反加1变为原码
         {
                 temp=~temp        +1;
                 zf=1;                 //负值
     temp0=temp*0.0625*100+0.5;        
                }        
         
         else            //温度>0
          {        
                        zf=0;                 //正值
                        temp0=temp*0.0625*100+0.5;
                }
                 str[1]=temp0 / 10000;
                str[2]=temp0 % 10000 / 1000;
                str[3]=temp0 % 1000 / 100;
                str[4]=temp0 % 100 / 10;
                str[5]=temp0 % 10;               
}
void xsled(void)   //送显示
{
    SDA=1;
    SCL=1;
    start_IIC(); //调用开始信号
    WriteByte(0x44);//写命令40H(数据设置)
    stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令

        switch(zf)
        {
                case 0:    //正值
                             if (str[1]==0)
                                         {
                                         write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
                       write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管 个位
           write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位
           write_LEDSROM(0xC3,xsbcdbuf[str[5]]);//第四个数码管  小数2位
                                   }
                                         else
                                         {
                                         write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
                       write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管 个位
           write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位
           write_LEDSROM(0xC3,xsbcdbuf[11]);//第四个数码管 显示 A               
                                         }
                                                 break;
                case 1:   //负值
                             write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示 十位
                                   write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管  个位
           write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位        
           write_LEDSROM(0xC3,0x40);//第四个数码管  -
                                         break;        
        }
   
    IIC_delay();
    start_IIC(); //调用开始信号
    WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
    stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
}
void port_mode()            // 端口模式
{
        P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
        P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
}
void main()
{
        unsigned char *s="Now temp is:";
        port_mode();                      // 所有IO口设为准双向弱上拉方式。
        DS18B20_SetResolution(3);     // 设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)
        while(1)
        {               
                gettemp();
                xsled();
                delay60us();
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-8-13 00:11 | 只看该作者
如果是软件延时,那主要就是延时部分要修改
回复

使用道具 举报

板凳
ID:190577 发表于 2021-8-13 06:47 | 只看该作者
主要要修改延时函数,还有单片机接口定义。
回复

使用道具 举报

地板
ID:584195 发表于 2021-8-13 07:07 | 只看该作者
建议你用逻辑分析仪看看你的写18B20的时序对不对。按理来讲18B20如果时序不对,也会读出来FF值来,你显示会看到的。
回复

使用道具 举报

5#
ID:917238 发表于 2021-8-13 08:36 来自手机 | 只看该作者
Y_G_G 发表于 2021-8-13 00:11
如果是软件延时,那主要就是延时部分要修改

IO口,时钟口和数据口怎么定义?不好意思小白一个
回复

使用道具 举报

6#
ID:917238 发表于 2021-8-13 11:51 来自手机 | 只看该作者
bbxyliyang 发表于 2021-8-13 06:47
主要要修改延时函数,还有单片机接口定义。

谢谢!还是不会
回复

使用道具 举报

7#
ID:917238 发表于 2021-8-13 11:52 来自手机 | 只看该作者
zyluglugl 发表于 2021-8-13 07:07
建议你用逻辑分析仪看看你的写18B20的时序对不对。按理来讲18B20如果时序不对,也会读出来FF值来,你显示会 ...

谢谢!感谢您的帮助
回复

使用道具 举报

8#
ID:917238 发表于 2021-8-13 11:53 来自手机 | 只看该作者
bbxyliyang 发表于 2021-8-13 06:47
主要要修改延时函数,还有单片机接口定义。

谢谢你们啦
回复

使用道具 举报

9#
ID:401564 发表于 2021-8-13 13:13 | 只看该作者
a18075128066 发表于 2021-8-13 08:36
IO口,时钟口和数据口怎么定义?不好意思小白一个

这???
难道你学C语言不是一步一步来的吗?这可是基础呀
在包含的头文件中,但不知道是哪个,你在Keil双击打开.h文件,看里面哪里有SDA=P....之类的,这就是端口的定义,你可以修改成你的
比如,里头是 SDA=P1^6;
而你是用的P3.0
那就改成 SDA=P3^0;
回复

使用道具 举报

10#
ID:158375 发表于 2021-8-13 15:16 | 只看该作者
a18075128066 发表于 2021-8-13 08:36
IO口,时钟口和数据口怎么定义?不好意思小白一个

按照
Y_G_G 发表于 2021-8-13 13:13 | 只看该作者
说的修改管教定义
回复

使用道具 举报

11#
ID:917238 发表于 2021-8-13 16:40 来自手机 | 只看该作者
#include<reg52.h>
#include<intrins.h>
sbit SCL=P1^2;
sbit SDA=P1^3;
unsigned char t,shi,ge,bai,dadt;
unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
/*************************************************************************

********************
LCD WRITE 模式 连续写入数据
*************************************************************************/
/*********************************************************

*IIC_delay

*******************************************************/

void init()
{
  TMOD=0X01;
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  ET0=1;
  EA=1;
  TR0=1;
}

void IIC_delay(void)
{
  unsigned char i;
  for(i=0;i<20;i++) _nop_();
}

/*********************************************************
*
启动IIC
*********************************************************/

void start_IIC(void)

{
  SCL=1; //给芯片发送开始信号
  SDA=1;
  IIC_delay();
  SDA=0;
  IIC_delay();
  SCL=0; //开始信号传送完
  IIC_delay();
}

/*******************************************************
*
停止IIC
*******************************************************/
void stop_IIC(void)
{
  SCL=0;
  IIC_delay();
  SDA=0;
  IIC_delay();
  SCL=1;
  IIC_delay();
  SDA=1;
}

void ack_IIC()
{
  SCL=0;
  _nop_();_nop_();_nop_();
  while(SDA);
  SCL=1;
  _nop_();_nop_();_nop_();
  SCL=0;
}

/*******************************************************
*
写一个字节数据
*******************************************************/

void WriteByte(unsigned char WriteData)
{
  unsigned char i;
  for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
  {
  SCL=0;
  IIC_delay();
  WriteData=WriteData>>1;
  SDA=CY;
  IIC_delay();
  SCL=1;
  IIC_delay();
  }
//8位数据传送完
  ack_IIC(); //判断芯片发过来的ACK应答信号
}
/*******************************************************

/************************************************
写一字节数据到LEDSROM
**************************************************/

void write_LEDSROM(unsigned char addr,unsigned char WData)
{
  start_IIC(); //调用开始信号
  WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
  WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
  stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
}
/************************************************
/************************************************
*
分开写数据到LED
**************************************************/
void xsled(void)
{
  SDA=1;
  SCL=1;
  start_IIC(); //调用开始信号
  WriteByte(0x44);//写命令40H(数据设置)
  stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  write_LEDSROM(0xC0,0x00); //第一个数码管
  write_LEDSROM(0xC1,xsbcdbuf[bai]);//第二个数码管
  write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三个数码管
  write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四个数码管
  IIC_delay();
  start_IIC(); //调用开始信号
  WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
}

void jisuan()
{
  bai=dadt/100;
  shi=dadt/10%10;
  ge=dadt%10;
}

void main()
{
  //P1=0xff;
  init();
while(1)
  {
  jisuan();
  xsled();
  if(t==20)
  {
    t=0;
    dadt++;
    if(dadt==1000)
    {
      dadt=0;
    }
  }
  }
}

void T0_time() interrupt 1
{
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  t++;
回复

使用道具 举报

12#
ID:401564 发表于 2021-8-13 21:49 | 只看该作者
哥们,你连IO端口定义都还不知道,就搞这么多代码的程序,你不觉得难度有点大吗?
但对于我来说,难度并不大,虽然我没写过18B20程序,但我觉得这并不难
虽然我七月底才开始学C语言,我现在已经看不上18B20这种程序了,现在在开始学PID控制
跟你说这.并不是说我有多能,只是想分享一下学习
我学C语言是对着教程,一个一个的学的,延时,流水灯,定时器....一个一个小程序的来,一个一个都要自己写,哪怕是已经完全看明白了,也要一行一行代码的写,基本没有复制过一个别人的程序,就算是抄也是自己抄出来的
像你这个程序,就得一个一个功能来的,不能是复制粘贴,然后烧录试看一下
先写LCD的功能,去把LCD的数据手册看明白了,然后再写
写完LCD就开始写IIC的,如果LCD的是IIC通讯的话,就得先学IIC
..........就这么多了
回复

使用道具 举报

13#
ID:917238 发表于 2021-8-14 03:10 来自手机 | 只看该作者
Y_G_G 发表于 2021-8-13 21:49
哥们,你连IO端口定义都还不知道,就搞这么多代码的程序,你不觉得难度有点大吗?
但对于我来说,难度并不大,虽 ...

谢谢您告诉我这么多东西
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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