找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5722|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

有關(guān)定時(shí)器掃描數(shù)碼管顯示ds18b20溫度值的問(wèn)題

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 60 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 2 次(中獎(jiǎng)概率 70%)
跳轉(zhuǎn)到指定樓層
樓主
ID:86791 發(fā)表于 2015-12-21 16:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
為什么單獨(dú)用定時(shí)器掃描數(shù)碼管顯示固定的數(shù)值能正常顯示,
用來(lái)顯示采集到的ds18b20溫度值的時(shí)候出現(xiàn)異常?十位和個(gè)位隔一段時(shí)間循環(huán)顯示?我延時(shí)兩毫秒

程序:
#include<stc12c5a60s2.h>
#include"timer0.h"
#include"delay.h"
uchar num;
void Timer0Init(void)  //2毫秒@12.000MHz 定時(shí)器初始化
{
AUXR|=0x80;  //定時(shí)器時(shí)鐘1T模式
TMOD&=0xF0;  //設(shè)置定時(shí)器模式
TMOD|=0x01;  //設(shè)置定時(shí)器模式
TL0=0x40;  //設(shè)置定時(shí)初值
TH0=0xA2;  //設(shè)置定時(shí)初值
TF0=0;  //清除TF0標(biāo)志
EA=1;
ET0=1;
TR0=1;      //定時(shí)器0開(kāi)始計(jì)時(shí)
}
void Timer0() interrupt 1
{
     TL0=0x40;  //設(shè)置定時(shí)初值
  TH0=0xA2;  //設(shè)置定時(shí)初值  
  num++;
}


數(shù)碼管:
#include<stc12c5a60s2.h>
#include"shumaguan.h"
#include"timer0.h"
#define DataPort P0     //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P1 替換
sbit LATCH2=P2^3;    //位選
sbit LATCH1=P2^2;    //段選
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //段選
void display(uchar gw,uchar sw)
{
    switch(num)
{
    case 1:P0=0xbf;
           LATCH2=1;
     LATCH2=0;
     P0=smg_du[sw];
     LATCH1=1;
     LATCH1=0;
     break;
       case 2:num=0;
           P0=0x7f;
           LATCH2=1;
     LATCH2=0;
     P0=smg_du[gw];
     LATCH1=1;
     LATCH1=0;
     break;
}
}

ds18b20采集
#include<stc12c5a60s2.h>
#include"ds18b20.h"
#include"delay.h"      //注:stc12c5a60s2單片機(jī)執(zhí)行一條語(yǔ)句的時(shí)間是普通51單片機(jī)的1/12,在寫(xiě)時(shí)序時(shí)一定要注意到
sbit DQ=P2^0;
uchar data disdata[2];
uint tvalue;         //溫度值
void init_ds18b20()//ds1820復(fù)位   
{
DQ=1;          //DQ復(fù)位
delay_18B20(40); //延時(shí)
DQ=0;          //DQ拉低
delay_18B20(1000); //精確延時(shí)大于480us
DQ=1;          //拉高
delay_18B20(400);
}
void write_byte(uchar dat)      //寫(xiě)一個(gè)字節(jié)
{
    uchar i=0;
    for(i=8;i>0;i--)
    {
   DQ=0;
      DQ=dat&0x01;
      delay_18B20(100);
      DQ=1;
      dat>>=1;
    }
}
uchar read_byte()       //讀一個(gè)字節(jié)
{
    uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{  
     DQ=0; //給脈沖信號(hào)
     dat>>=1;
     DQ=1; //給脈沖信號(hào)
     if(DQ)
     dat|=0x80;
     delay_18B20(100);
}
   return(dat);
}
uchar read_temp()   //讀取溫度值并轉(zhuǎn)換
{
    uchar a,b;
float f_temp;
init_ds18b20();   
write_byte(0xcc);   //跳過(guò)讀序列號(hào)
write_byte(0x44);         //啟動(dòng)溫度轉(zhuǎn)換
delay(5);
init_ds18b20();   
write_byte(0xcc);      //跳過(guò)讀序列號(hào)
write_byte(0xbe);         //讀取溫度
a=read_byte();
b=read_byte();
tvalue=b;
tvalue<<=8;   
tvalue|=a;
f_temp=tvalue*0.0625;
tvalue=f_temp*10+0.5;
return(tvalue);
}


主函數(shù):
#include"ds18b20.h"
#include"timer0.h"
#include"shumaguan.h"
#include"delay.h"

void main()
{
   uchar gw,sw;
   Timer0Init();  
   while(1)
   {
      read_temp();   
      sw=tvalue/100;
      gw=tvalue%100/10;
      display(gw,sw);
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:86421 發(fā)表于 2015-12-22 20:52 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

給你一個(gè)程序,自已根據(jù)數(shù)碼管的情況改一下,分析對(duì)照一下哪出了問(wèn)題。這個(gè)程序用著挺好的。
  1. #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include "18b20.h"

  3. #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換

  4. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  5. sbit LATCH2=P2^3;//                 位鎖存

  6. bit ReadTempFlag;//定義讀時(shí)間標(biāo)志

  7. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  8. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
  9. unsigned char TempData[8]; //存儲(chǔ)顯示值的全局變量


  10. void Display(unsigned char FirstBit,unsigned char Num);//數(shù)碼管顯示函數(shù)
  11. void Init_Timer0(void);//定時(shí)器初始化
  12. /*------------------------------------------------
  13.                     主函數(shù)
  14. ------------------------------------------------*/
  15. void main (void)
  16. {                  
  17. unsigned int TempH,TempL,temp;
  18. Init_Timer0();
  19. while (1)         //主循環(huán)
  20.   {


  21. if(ReadTempFlag==1)
  22. {
  23.   ReadTempFlag=0;
  24.   temp=ReadTemperature();
  25.   if(temp&0x8000)
  26.      {
  27.      TempData[0]=0x40;//負(fù)號(hào)標(biāo)志
  28.      temp=~temp;  // 取反加1
  29.          temp +=1;
  30.          }
  31.   else
  32.      TempData[0]=0;

  33.      TempH=temp>>4;
  34.      TempL=temp&0x0F;
  35.      TempL=TempL*6/10;//小數(shù)近似處理
  36.            
  37.     if(TempH/100==0)
  38.           TempData[1]=0;
  39.         else
  40.       TempData[1]=dofly_DuanMa[TempH/100]; //十位溫度
  41.     if((TempH/100==0)&&((TempH%100)/10==0))//消隱
  42.           TempData[2]=0;
  43.         else
  44.      TempData[2]=dofly_DuanMa[(TempH%100)/10]; //十位溫度
  45.      TempData[3]=dofly_DuanMa[(TempH%100)%10]|0x80; //個(gè)位溫度,帶小數(shù)點(diǎn)
  46.      TempData[4]=dofly_DuanMa[TempL];
  47.          TempData[6]=0x39;         //顯示C符號(hào)
  48.   }       
  49. }
  50. }

  51. /*------------------------------------------------
  52. 顯示函數(shù),用于動(dòng)態(tài)掃描數(shù)碼管
  53. 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個(gè)數(shù)碼管開(kāi)始顯示
  54. 如輸入0表示從第一個(gè)顯示。
  55. Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
  56. ------------------------------------------------*/
  57. void Display(unsigned char FirstBit,unsigned char Num)
  58. {
  59.       static unsigned char i=0;
  60.           

  61.            DataPort=0;   //清空數(shù)據(jù),防止有交替重影
  62.        LATCH1=1;     //段鎖存
  63.        LATCH1=0;

  64.        DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
  65.        LATCH2=1;     //位鎖存
  66.        LATCH2=0;

  67.        DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
  68.        LATCH1=1;     //段鎖存
  69.        LATCH1=0;
  70.       
  71.            i++;
  72.        if(i==Num)
  73.               i=0;


  74. }
  75. /*------------------------------------------------
  76.                     定時(shí)器初始化子程序
  77. ------------------------------------------------*/
  78. void Init_Timer0(void)
  79. {
  80. TMOD |= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                     
  81. //TH0=0x00;              //給定初值
  82. //TL0=0x00;
  83. EA=1;            //總中斷打開(kāi)
  84. ET0=1;           //定時(shí)器中斷打開(kāi)
  85. TR0=1;           //定時(shí)器開(kāi)關(guān)打開(kāi)
  86. }
  87. /*------------------------------------------------
  88.                  定時(shí)器中斷子程序
  89. ------------------------------------------------*/
  90. void Timer0_isr(void) interrupt 1
  91. {
  92. static unsigned int num;
  93. TH0=(65536-2000)/256;                  //重新賦值 2ms
  94. TL0=(65536-2000)%256;

  95. Display(0,8);       // 調(diào)用數(shù)碼管掃描
  96. num++;
  97. if(num==300)        //
  98.    {
  99.     num=0;
  100.     ReadTempFlag=1; //讀標(biāo)志位置1
  101.         }
  102. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:86421 發(fā)表于 2015-12-22 20:53 | 只看該作者
上面是主程序,下面是18B20的
  1. ------------------------------------------------*/
  2. #include"delay.h"
  3. #include"18b20.h"
  4. /*------------------------------------------------
  5.                     18b20初始化
  6. ------------------------------------------------*/
  7. bit Init_DS18B20(void)
  8. {
  9. bit dat=0;
  10. DQ = 1;    //DQ復(fù)位
  11. DelayUs2x(5);   //稍做延時(shí)
  12. DQ = 0;         //單片機(jī)將DQ拉低
  13. DelayUs2x(200); //精確延時(shí) 大于 480us 小于960us
  14. DelayUs2x(200);
  15. DQ = 1;        //拉高總線
  16. DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
  17. dat=DQ;        //如果x=0則初始化成功, x=1則初始化失敗
  18. DelayUs2x(25); //稍作延時(shí)返回
  19. return dat;
  20. }

  21. /*------------------------------------------------
  22.                     讀取一個(gè)字節(jié)
  23. ------------------------------------------------*/
  24. unsigned char ReadOneChar(void)
  25. {
  26. unsigned char i=0;
  27. unsigned char dat = 0;
  28. for (i=8;i>0;i--)
  29. {
  30.   DQ = 0; // 給脈沖信號(hào)
  31.   dat>>=1;
  32.   DQ = 1; // 給脈沖信號(hào)
  33.   if(DQ)
  34.    dat|=0x80;
  35.   DelayUs2x(25);
  36. }
  37. return(dat);
  38. }
  39. /*------------------------------------------------
  40.                     寫(xiě)入一個(gè)字節(jié)
  41. ------------------------------------------------*/
  42. void WriteOneChar(unsigned char dat)
  43. {
  44. unsigned char i=0;
  45. for (i=8; i>0; i--)
  46. {
  47.   DQ = 0;
  48.   DQ = dat&0x01;
  49.   DelayUs2x(25);
  50.   DQ = 1;
  51.   dat>>=1;
  52. }
  53. DelayUs2x(25);
  54. }

  55. /*------------------------------------------------
  56.                     讀取溫度
  57. ------------------------------------------------*/
  58. unsigned int ReadTemperature(void)
  59. {
  60. unsigned char a=0;
  61. unsigned int b=0;
  62. unsigned int t=0;
  63. Init_DS18B20();
  64. WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
  65. WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  66. DelayMs(10);
  67. Init_DS18B20();
  68. WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
  69. WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  70. a=ReadOneChar();   //低位
  71. b=ReadOneChar();   //高位

  72. b<<=8;
  73. t=a+b;

  74. return(t);
  75. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

地板
ID:86421 發(fā)表于 2015-12-22 20:54 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

延時(shí)文件
  1. #include "delay.h"
  2. /*------------------------------------------------
  3. uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
  4. unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
  5. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
  6. 長(zhǎng)度如下 T=tx2+5 uS
  7. ------------------------------------------------*/
  8. void DelayUs2x(unsigned char t)
  9. {   
  10. while(--t);
  11. }
  12. /*------------------------------------------------
  13. mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
  14. unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
  15. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
  16. ------------------------------------------------*/
  17. void DelayMs(unsigned char t)
  18. {
  19.      
  20. while(t--)
  21. {
  22.      //大致延時(shí)1mS
  23.      DelayUs2x(245);
  24.          DelayUs2x(245);
  25. }
  26. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:86421 發(fā)表于 2015-12-22 20:56 | 只看該作者
  1. #ifndef __DELAY_H__
  2. #define __DELAY_H__
  3. /*------------------------------------------------
  4. uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
  5. unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
  6. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
  7. 長(zhǎng)度如下 T=tx2+5 uS
  8. ------------------------------------------------*/
  9. void DelayUs2x(unsigned char t);
  10. /*------------------------------------------------
  11. mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
  12. unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
  13. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
  14. ------------------------------------------------*/
  15. void DelayMs(unsigned char t);

  16. #endif



  17. #ifndef __DS18B20_H__
  18. #define __DS18B20_H__

  19. #include<reg52.h>     //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  20. #include<intrins.h>

  21. #define uchar unsigned char
  22. #define uint   unsigned int;
  23. /*------------------------------------------------
  24.                     端口定義
  25. ------------------------------------------------*/
  26. sbit DQ=P1^3;//ds18b20 端口
  27. /*------------------------------------------------
  28.                   函數(shù)聲明
  29. ------------------------------------------------*/
  30. unsigned int ReadTemperature(void);
  31. bit Init_DS18B20(void);
  32. unsigned char ReadOneChar(void);
  33. void WriteOneChar(unsigned char dat);

  34. #endif
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:86421 發(fā)表于 2015-12-22 20:56 | 只看該作者
上面是兩上.H文件
回復(fù)

使用道具 舉報(bào)

7#
ID:108622 發(fā)表于 2016-3-29 13:22 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

有數(shù)碼管能用的程序嗎?復(fù)制的文本錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

8#
ID:87568 發(fā)表于 2016-3-29 21:36 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣


回復(fù)

使用道具 舉報(bào)

9#
ID:373388 發(fā)表于 2018-10-15 13:47 | 只看該作者
case = 0 時(shí),就會(huì)顯示上次數(shù)據(jù),所以就亂了
回復(fù)

使用道具 舉報(bào)

10#
ID:373388 發(fā)表于 2018-10-15 13:48 | 只看該作者
沒(méi)有處理case 0 時(shí)的情況,當(dāng)num = 0,就會(huì)顯示上次數(shù)據(jù),所以就亂了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表