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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5679|回復: 9
打印 上一主題 下一主題
收起左側

有關定時器掃描數碼管顯示ds18b20溫度值的問題

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

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


數碼管:
#include<stc12c5a60s2.h>
#include"shumaguan.h"
#include"timer0.h"
#define DataPort P0     //定義數據端口 程序中遇到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單片機執行一條語句的時間是普通51單片機的1/12,在寫時序時一定要注意到
sbit DQ=P2^0;
uchar data disdata[2];
uint tvalue;         //溫度值
void init_ds18b20()//ds1820復位   
{
DQ=1;          //DQ復位
delay_18B20(40); //延時
DQ=0;          //DQ拉低
delay_18B20(1000); //精確延時大于480us
DQ=1;          //拉高
delay_18B20(400);
}
void write_byte(uchar dat)      //寫一個字節
{
    uchar i=0;
    for(i=8;i>0;i--)
    {
   DQ=0;
      DQ=dat&0x01;
      delay_18B20(100);
      DQ=1;
      dat>>=1;
    }
}
uchar read_byte()       //讀一個字節
{
    uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{  
     DQ=0; //給脈沖信號
     dat>>=1;
     DQ=1; //給脈沖信號
     if(DQ)
     dat|=0x80;
     delay_18B20(100);
}
   return(dat);
}
uchar read_temp()   //讀取溫度值并轉換
{
    uchar a,b;
float f_temp;
init_ds18b20();   
write_byte(0xcc);   //跳過讀序列號
write_byte(0x44);         //啟動溫度轉換
delay(5);
init_ds18b20();   
write_byte(0xcc);      //跳過讀序列號
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);
}


主函數:
#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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

回帖獎勵 +10 黑幣

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

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

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

  6. bit ReadTempFlag;//定義讀時間標志

  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};//分別對應相應的數碼管點亮,即位碼
  9. unsigned char TempData[8]; //存儲顯示值的全局變量


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


  21. if(ReadTempFlag==1)
  22. {
  23.   ReadTempFlag=0;
  24.   temp=ReadTemperature();
  25.   if(temp&0x8000)
  26.      {
  27.      TempData[0]=0x40;//負號標志
  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;//小數近似處理
  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; //個位溫度,帶小數點
  46.      TempData[4]=dofly_DuanMa[TempL];
  47.          TempData[6]=0x39;         //顯示C符號
  48.   }       
  49. }
  50. }

  51. /*------------------------------------------------
  52. 顯示函數,用于動態掃描數碼管
  53. 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
  54. 如輸入0表示從第一個顯示。
  55. Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
  56. ------------------------------------------------*/
  57. void Display(unsigned char FirstBit,unsigned char Num)
  58. {
  59.       static unsigned char i=0;
  60.           

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

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

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


  74. }
  75. /*------------------------------------------------
  76.                     定時器初始化子程序
  77. ------------------------------------------------*/
  78. void Init_Timer0(void)
  79. {
  80. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  81. //TH0=0x00;              //給定初值
  82. //TL0=0x00;
  83. EA=1;            //總中斷打開
  84. ET0=1;           //定時器中斷打開
  85. TR0=1;           //定時器開關打開
  86. }
  87. /*------------------------------------------------
  88.                  定時器中斷子程序
  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);       // 調用數碼管掃描
  96. num++;
  97. if(num==300)        //
  98.    {
  99.     num=0;
  100.     ReadTempFlag=1; //讀標志位置1
  101.         }
  102. }
復制代碼
回復

使用道具 舉報

板凳
ID:86421 發表于 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復位
  11. DelayUs2x(5);   //稍做延時
  12. DQ = 0;         //單片機將DQ拉低
  13. DelayUs2x(200); //精確延時 大于 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); //稍作延時返回
  19. return dat;
  20. }

  21. /*------------------------------------------------
  22.                     讀取一個字節
  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; // 給脈沖信號
  31.   dat>>=1;
  32.   DQ = 1; // 給脈沖信號
  33.   if(DQ)
  34.    dat|=0x80;
  35.   DelayUs2x(25);
  36. }
  37. return(dat);
  38. }
  39. /*------------------------------------------------
  40.                     寫入一個字節
  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); // 跳過讀序號列號的操作
  65. WriteOneChar(0x44); // 啟動溫度轉換
  66. DelayMs(10);
  67. Init_DS18B20();
  68. WriteOneChar(0xCC); //跳過讀序號列號的操作
  69. WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  70. a=ReadOneChar();   //低位
  71. b=ReadOneChar();   //高位

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

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

使用道具 舉報

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

回帖獎勵 +10 黑幣

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

使用道具 舉報

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

  16. #endif



  17. #ifndef __DS18B20_H__
  18. #define __DS18B20_H__

  19. #include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  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.                   函數聲明
  29. ------------------------------------------------*/
  30. unsigned int ReadTemperature(void);
  31. bit Init_DS18B20(void);
  32. unsigned char ReadOneChar(void);
  33. void WriteOneChar(unsigned char dat);

  34. #endif
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

回帖獎勵 +10 黑幣

有數碼管能用的程序嗎?復制的文本錯誤
回復

使用道具 舉報

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

回帖獎勵 +10 黑幣


回復

使用道具 舉報

9#
ID:373388 發表于 2018-10-15 13:47 | 只看該作者
case = 0 時,就會顯示上次數據,所以就亂了
回復

使用道具 舉報

10#
ID:373388 發表于 2018-10-15 13:48 | 只看該作者
沒有處理case 0 時的情況,當num = 0,就會顯示上次數據,所以就亂了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级片免费网站 | 日韩免费av | 日本五月婷婷 | 在线看片国产 | 亚洲精品一区中文字幕乱码 | 国产精品久久久久久婷婷天堂 | 超碰人人做 | 成人国产精品免费观看视频 | 野狼在线社区2017入口 | 精品中文字幕一区二区 | 久久久久国产成人精品亚洲午夜 | 三a毛片 | 久久久久久久国产 | 国产一区高清 | 亚洲精品久久久一区二区三区 | 久草电影网 | 精品在线一区二区 | 亚洲麻豆 | 99久久婷婷国产综合精品电影 | 男女视频在线免费观看 | 日韩精品一区二区三区 | 国产精品免费一区二区三区四区 | 一区二区三区免费观看 | 亚洲高清免费 | 中文字幕久久久 | 91九色porny首页最多播放 | 91中文在线观看 | 中文字幕亚洲一区 | 日本精品在线一区 | 精品一区欧美 | 亚洲成人免费在线 | 成人精品 | 欧美日韩网站 | 日韩视频中文字幕 | 日韩在线精品视频 | 91精品欧美久久久久久久 | 久99久视频 | 91精品久久久久久久久中文字幕 | 国产精品视频一 | 亚洲精品久久久久久久久久久 | 亚洲在线一区 |