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

QQ登錄

只需一步,快速開始

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

stc15f104e單片機(jī)+max7219+ds18B02數(shù)碼管溫度顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:456690 發(fā)表于 2020-1-28 17:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
stc15f104e + max7219 + ds18B02數(shù)碼管溫度顯示


4.jpg (864.68 KB, 下載次數(shù): 90)

成品

成品

電路圖.png (44.98 KB, 下載次數(shù): 68)

電路圖

電路圖

PCB板.png (29.23 KB, 下載次數(shù): 79)

PCB 圖

PCB 圖

CAD圖.png (27.51 KB, 下載次數(shù): 68)

CAD 外殼

CAD 外殼

1.jpg (1.06 MB, 下載次數(shù): 80)

熱轉(zhuǎn)印制PCB板

熱轉(zhuǎn)印制PCB板

2.jpg (1.04 MB, 下載次數(shù): 81)

顯微鏡改臺(tái)鉆打洞

顯微鏡改臺(tái)鉆打洞

3.jpg (922.03 KB, 下載次數(shù): 75)

元件電路板

元件電路板
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:456690 發(fā)表于 2020-1-28 17:35 | 只看該作者
運(yùn)行程序  15f104e是1T運(yùn)行速度,晶體速度11.0529M 使用12T芯片延時(shí)降低10倍 #include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
bit flag1s = 0; //1s 定時(shí)標(biāo)志
unsigned char T0RH = 0; //T0 重載值的高字節(jié)
unsigned char T0RL = 0; //T0 重載值的低字節(jié)
void ConfigTimer0(unsigned int ms);
unsigned char code disp1[]={0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb};        //數(shù)字帶點(diǎn)
unsigned char code disp2[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};        //數(shù)字不帶點(diǎn)  
unsigned char code disp3[]={0x0};  //不顯示
unsigned char code disp4[]={0x4f};  //顯示E
unsigned char code disp5[]={0x01};  //顯示-

sbit Max7219_pinCLK = P3^2;
sbit Max7219_pinCS  = P3^5;
sbit Max7219_pinDIN = P3^4;
sbit IO_18B20 = P3^3; //DS18B20 通信引腳

/* 軟件延時(shí)函數(shù),延時(shí)時(shí)間(t*10)us */
void DelayX10us(unsigned char t)
{
   do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
      }
          while (--t);
}

//向MAX7219(U3)寫入字節(jié)
void Write_Max7219_byte(uchar DATA)         
{
            uchar i;   
                Max7219_pinCS=0;                                //CS=0有效,CS=1鎖存       
            for(i=8;i>=1;i--)
          {                  
            Max7219_pinCLK=0;
            Max7219_pinDIN=DATA&0x80; //&10000000, 編譯器對(duì)位操作的理解:非0即為1
            DATA=DATA<<1;
            Max7219_pinCLK=1;                //上升沿把數(shù)據(jù)送出去
          }                                 
}

/*向M第一片MAX7219寫入數(shù)據(jù)*/
void Write_Max7219(uchar add1,uchar dat1)
{
     Max7219_pinCS=0;
         Write_Max7219_byte(add1);           //寫入地址,即數(shù)碼管編號(hào)
     Write_Max7219_byte(dat1);               //寫入數(shù)據(jù),即數(shù)碼管顯示數(shù)字
         Max7219_pinCS=1;                        
}

/*初始化芯片*/
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00);       //譯碼方式:BCD碼
Write_Max7219(0x0a, 0x03);       //亮度
Write_Max7219(0x0b, 0x07);       //掃描界限;8個(gè)數(shù)碼管顯示
Write_Max7219(0x0c, 0x01);       //掉電模式:0,普通模式:1
Write_Max7219(0x0f, 0x00);       //顯示測(cè)試:1;測(cè)試結(jié)束,正常顯示:0
Write_Max7219(1,disp3[0]);
Write_Max7219(2,disp3[0]);
Write_Max7219(3,disp3[0]);
Write_Max7219(4,disp3[0]);
}

/* 復(fù)位總線,獲取存在脈沖,以啟動(dòng)一次讀寫操作 */
bit Get18B20Ack()
{
   bit ack;
   EA = 0; //禁止總中斷
   IO_18B20 = 0; //產(chǎn)生 500us 復(fù)位脈沖
   DelayX10us(500);//50
   IO_18B20 = 1;
   DelayX10us(60); //延時(shí) 60us 6
   ack = IO_18B20; //讀取存在脈沖
   while(!IO_18B20); //等待存在脈沖結(jié)束
   EA = 1; //重新使能總中斷
   return ack;
}

/* 向 DS18B20 寫入一個(gè)字節(jié),dat-待寫入字節(jié) */
void Write18B20(unsigned char dat)
{
   unsigned char mask;
   EA = 0; //禁止總中斷
   for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 個(gè) bit
   {
      IO_18B20 = 0; //產(chǎn)生 2us 低電平脈沖
      _nop_();
      _nop_();
      if ((mask&dat) == 0) //輸出該 bit 值
         IO_18B20 = 0;
      else
         IO_18B20 = 1;
      DelayX10us(60); //延時(shí) 60us
      IO_18B20 = 1; //拉高通信引腳
   }
   EA = 1; //重新使能總中斷
}

/* 從 DS18B20 讀取一個(gè)字節(jié),返回值-讀到的字節(jié) */
unsigned char Read18B20()
{
   unsigned char dat;
   unsigned char mask;
   EA = 0; //禁止總中斷
   for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次采集 8 個(gè) bit
   {
      IO_18B20 = 0; //產(chǎn)生 2us 低電平脈沖
      _nop_();
      _nop_();
      IO_18B20 = 1; //結(jié)束低電平脈沖,等待 18B20 輸出數(shù)據(jù)
      _nop_(); //延時(shí) 2us
      _nop_();
      if (!IO_18B20) //讀取通信引腳上的值
         dat &= ~mask;
      else
         dat |= mask;
      DelayX10us(60); //再延時(shí) 60us
   }
      EA = 1; //重新使能總中斷
      return dat;
}

/* 啟動(dòng)一次 18B20 溫度轉(zhuǎn)換,返回值-表示是否啟動(dòng)成功 */
bit Start18B20()
{
   bit ack;
   ack = Get18B20Ack(); //執(zhí)行總線復(fù)位,并獲取 18B20 應(yīng)答
   if (ack == 0) //如 18B20 正確應(yīng)答,則啟動(dòng)一次轉(zhuǎn)換
   {
      Write18B20(0xCC); //跳過 ROM 操作
      Write18B20(0x44); //啟動(dòng)一次溫度轉(zhuǎn)換
   }
   return ~ack; //ack==0 表示操作成功,所以返回值對(duì)其取反
}

/* 讀取 DS18B20 轉(zhuǎn)換的溫度值,返回值-表示是否讀取成功 */
bit Get18B20Temp(int *temp)
{
   bit ack;
   unsigned char LSB, MSB; //16bit 溫度值的低字節(jié)和高字節(jié)
   ack = Get18B20Ack(); //執(zhí)行總線復(fù)位,并獲取 18B20 應(yīng)答
   if (ack == 0) //如 18B20 正確應(yīng)答,則讀取溫度值
   {
      Write18B20(0xCC); //跳過 ROM 操作
      Write18B20(0xBE); //發(fā)送讀命令
      LSB = Read18B20(); //讀溫度值的低字節(jié)
      MSB = Read18B20(); //讀溫度值的高字節(jié)
      *temp = ((int)MSB << 8) + LSB; //合成為 16bit 整型數(shù)
   }
     return ~ack; //ack==0 表示操作應(yīng)答,所以返回值為其取反值
}

/*****************************main.c 文件程序源代碼******************************/
void main()
{
   bit res;
   int temp; //讀取到的當(dāng)前溫度值
  // int intT, decT; //溫度值的整數(shù)和小數(shù)部分
   unsigned char qian,bai,shi,ge;
   float tp;
   Init_MAX7219();  
   EA = 1; //開總中斷
   ConfigTimer0(10); //T0 定時(shí) 10ms
   Start18B20(); //啟動(dòng) DS18B20
   while (1)
   {
      if (flag1s) //每秒更新一次溫度
      {
         flag1s = 0;
         res = Get18B20Temp(&temp); //讀取當(dāng)前溫度
         if (res) //讀取成功時(shí),刷新當(dāng)前溫度顯示
         {
                if(temp< 0)                                                 //溫度低于0度
                  {               
                       temp=temp-1;
                       temp=~temp;
                       tp=temp;
                       temp=tp*0.0625*100+0.5;
                           qian = temp % 10000 / 1000;
                   bai = temp % 1000 / 100;
                   shi = temp % 100 / 10;
                   ge = temp % 10;
                           Write_Max7219(1,disp5[0]);          // 顯示 "-"
                           Write_Max7219(2,disp2[qian]);
                           Write_Max7219(3,disp1[bai]);
                           Write_Max7219(4,disp2[shi]);                                  
                  }
                  else                                                        // 溫度大于0度
                  {                       
                   tp=temp;
                   temp=tp*0.0625*100+0.5;
                           qian = temp % 10000 / 1000;
                   bai = temp % 1000 / 100;
                   shi = temp % 100 / 10;
                   ge = temp % 10;
                           if(qian>0)                                        // 溫度10度顯示十位
                           {
                              Write_Max7219(1,disp2[qian]);
                                Write_Max7219(2,disp1[bai]);
                              Write_Max7219(3,disp2[shi]);
                              Write_Max7219(4,disp2[ge]);
                           }
                           if(qian<=0)                                    // 溫度10度以下顯示個(gè)位不顯示十位
                           {
                              Write_Max7219(1,disp3[qian]);
                                Write_Max7219(2,disp1[bai]);
                              Write_Max7219(3,disp2[shi]);
                              Write_Max7219(4,disp2[ge]);
                           }       
                }
         }
         else //讀取失敗時(shí),提示錯(cuò)誤信息
         {
             Write_Max7219(1,disp4[0]);
                         Write_Max7219(2,disp3[0]);
                         Write_Max7219(3,disp3[0]);
                         Write_Max7219(4,disp3[0]);
         }
         Start18B20(); //重新啟動(dòng)下一次轉(zhuǎn)換
      }
   }
}

/* 配置并啟動(dòng) T0,ms-T0 定時(shí)時(shí)間 */
void ConfigTimer0(unsigned int ms)
{
   unsigned long tmp; //臨時(shí)變量
   tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率
   tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
   tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
   tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
   T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
   T0RL = (unsigned char)tmp;
   TMOD &= 0xF0; //清零 T0 的控制位
   TMOD |= 0x01; //配置 T0 為模式 1
   TH0 = T0RH; //加載 T0 重載值
   TL0 = T0RL;
   ET0 = 1; //使能 T0 中斷
   TR0 = 1; //啟動(dòng) T0
}

/* T0 中斷服務(wù)函數(shù),完成 1 秒定時(shí) */
void InterruptTimer0() interrupt 1
{
   static unsigned char tmr1s = 0;
   TH0 = T0RH; //重新加載重載值
   TL0 = T0RL;
   tmr1s++;
   if (tmr1s >= 100) //定時(shí) 1s
   {
      tmr1s = 0;
      flag1s = 1;
   }
}

回復(fù)

使用道具 舉報(bào)

板凳
ID:748788 發(fā)表于 2020-8-17 15:23 | 只看該作者
因?yàn)樵谧鞯暮湍愕牟畈欢,就將這個(gè)程序用uvision4編譯了,想下載到單片機(jī)看看效果,結(jié)果下載工具報(bào)錯(cuò),不知是什么原因。還有一次報(bào)錯(cuò)說編譯器版本太古老。另外仿真時(shí)顯示“E”,即出錯(cuò)。別的程序仿真能顯示溫度。
回復(fù)

使用道具 舉報(bào)

地板
ID:378732 發(fā)表于 2020-8-26 16:30 | 只看該作者
樓主這個(gè)外殼是3D打印的嗎?PCB是自己腐蝕的?熱轉(zhuǎn)移用的什么燙上去的?
回復(fù)

使用道具 舉報(bào)

5#
ID:125719 發(fā)表于 2020-8-28 14:37 | 只看該作者
ty417502873 發(fā)表于 2020-8-26 16:30
樓主這個(gè)外殼是3D打印的嗎?PCB是自己腐蝕的?熱轉(zhuǎn)移用的什么燙上去的?

熱轉(zhuǎn)印好像最好的就是用電熨斗。
回復(fù)

使用道具 舉報(bào)

6#
ID:235954 發(fā)表于 2020-8-28 16:14 | 只看該作者
學(xué)習(xí)一下匯編
回復(fù)

使用道具 舉報(bào)

7#
ID:618330 發(fā)表于 2021-1-26 16:55 | 只看該作者
您好,請(qǐng)問有工程文件嗎?按照您發(fā)的報(bào)錯(cuò)太多了
回復(fù)

使用道具 舉報(bào)

8#
ID:456690 發(fā)表于 2022-1-29 22:06 | 只看該作者
ty417502873 發(fā)表于 2020-8-26 16:30
樓主這個(gè)外殼是3D打印的嗎?PCB是自己腐蝕的?熱轉(zhuǎn)移用的什么燙上去的?

外殼是CAD畫圖3d打印的,pcb 是99畫圖的 轉(zhuǎn)印用電熨斗開到最高溫度壓印
回復(fù)

使用道具 舉報(bào)

9#
ID:456690 發(fā)表于 2022-1-29 22:13 | 只看該作者
wwh2382 發(fā)表于 2020-8-17 15:23
因?yàn)樵谧鞯暮湍愕牟畈欢,就將這個(gè)程序用uvision4編譯了,想下載到單片機(jī)看看效果,結(jié)果下載工具報(bào)錯(cuò),不知 ...

這是程序文件 試試看好用不

ds18b02-1T數(shù)碼管.7z

2.51 MB, 下載次數(shù): 13, 下載積分: 黑幣 -5

制作程序文件

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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