久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2919|回復: 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();
        }
}
回復

使用道具 舉報

ID:401564 發表于 2021-8-13 00:11 | 顯示全部樓層
如果是軟件延時,那主要就是延時部分要修改
回復

使用道具 舉報

ID:190577 發表于 2021-8-13 06:47 | 顯示全部樓層
主要要修改延時函數,還有單片機接口定義。
回復

使用道具 舉報

ID:584195 發表于 2021-8-13 07:07 | 顯示全部樓層
建議你用邏輯分析儀看看你的寫18B20的時序對不對。按理來講18B20如果時序不對,也會讀出來FF值來,你顯示會看到的。
回復

使用道具 舉報

ID:917238 發表于 2021-8-13 08:36 來自手機 | 顯示全部樓層
Y_G_G 發表于 2021-8-13 00:11
如果是軟件延時,那主要就是延時部分要修改

IO口,時鐘口和數據口怎么定義?不好意思小白一個
回復

使用道具 舉報

ID:917238 發表于 2021-8-13 11:51 來自手機 | 顯示全部樓層
bbxyliyang 發表于 2021-8-13 06:47
主要要修改延時函數,還有單片機接口定義。

謝謝!還是不會
回復

使用道具 舉報

ID:917238 發表于 2021-8-13 11:52 來自手機 | 顯示全部樓層
zyluglugl 發表于 2021-8-13 07:07
建議你用邏輯分析儀看看你的寫18B20的時序對不對。按理來講18B20如果時序不對,也會讀出來FF值來,你顯示會 ...

謝謝!感謝您的幫助
回復

使用道具 舉報

ID:917238 發表于 2021-8-13 11:53 來自手機 | 顯示全部樓層
bbxyliyang 發表于 2021-8-13 06:47
主要要修改延時函數,還有單片機接口定義。

謝謝你們啦
回復

使用道具 舉報

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;
回復

使用道具 舉報

ID:158375 發表于 2021-8-13 15:16 | 顯示全部樓層
a18075128066 發表于 2021-8-13 08:36
IO口,時鐘口和數據口怎么定義?不好意思小白一個

按照
Y_G_G 發表于 2021-8-13 13:13 | 只看該作者
說的修改管教定義
回復

使用道具 舉報

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++;
回復

使用道具 舉報

ID:401564 發表于 2021-8-13 21:49 | 顯示全部樓層
哥們,你連IO端口定義都還不知道,就搞這么多代碼的程序,你不覺得難度有點大嗎?
但對于我來說,難度并不大,雖然我沒寫過18B20程序,但我覺得這并不難
雖然我七月底才開始學C語言,我現在已經看不上18B20這種程序了,現在在開始學PID控制
跟你說這.并不是說我有多能,只是想分享一下學習
我學C語言是對著教程,一個一個的學的,延時,流水燈,定時器....一個一個小程序的來,一個一個都要自己寫,哪怕是已經完全看明白了,也要一行一行代碼的寫,基本沒有復制過一個別人的程序,就算是抄也是自己抄出來的
像你這個程序,就得一個一個功能來的,不能是復制粘貼,然后燒錄試看一下
先寫LCD的功能,去把LCD的數據手冊看明白了,然后再寫
寫完LCD就開始寫IIC的,如果LCD的是IIC通訊的話,就得先學IIC
..........就這么多了
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产99视频精品免费播放照片 | 国产欧美一区二区在线观看 | 精品国产1区2区3区 一区二区手机在线 | 精品国产一二三区 | 91精品国产综合久久精品 | 久久免费精品视频 | 国产一区二区av | 日日夜夜精品免费视频 | 国产成人久久精品 | 尤物视频在线免费观看 | 羞羞涩涩在线观看 | 国产成人精品一区二区三区四区 | 欧美另类视频在线 | 日韩视频中文字幕 | 波多野结衣精品在线 | 久久久精品久久久 | 免费成人高清在线视频 | 少妇无套高潮一二三区 | 一级黄色片网站 | 亚洲精品2区 | 久久精品国产免费 | 亚洲国产成人久久综合一区,久久久国产99 | 99亚洲精品| 亚洲综合天堂网 | 亚洲视频区 | 精品视频在线播放 | 色妹子综合网 | 欧美一级片黄色 | 午夜精品影院 | www.日韩 | 在线免费观看视频黄 | 午夜爽爽男女免费观看hd | 国产精品日韩在线观看一区二区 | 欧美亚洲国产日韩 | 国内精品久久久久久 | 日韩1区2区| 欧美成人黄色小说 | 亚洲精品在线视频 | 国产欧美一区二区三区久久手机版 | 国偷自产av一区二区三区 | 毛片网站在线观看 |