找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3062|回復: 17
收起左側

用腐蝕板做成了單片機溫度計實物圖,但是有問題

[復制鏈接]
ID:787372 發(fā)表于 2020-12-19 13:58 | 顯示全部樓層 |閱讀模式
有大佬可以幫我看看怎么回事嗎
最近從網上學習用DS18B20和STC52單片機做了個溫度計,仿真成功后用腐蝕板做成了實物圖,但最后接電源只有蜂鳴器在響,數(shù)碼管不亮,后面實在找不出問題特地來向大佬們求助,原理圖如下

原理圖

原理圖
回復

使用道具 舉報

ID:824490 發(fā)表于 2020-12-19 15:50 | 顯示全部樓層
數(shù)碼管有共陰、共陽之分,你選對了嗎?
回復

使用道具 舉報

ID:787372 發(fā)表于 2020-12-19 15:54 | 顯示全部樓層
#include<reg51.h> #include<intrins.h>    #define dm P0          //段碼輸出口 #define uchar unsigned char  #define uint unsigned int sbit DQ=P2^7;          //溫度輸入口 sbit w0=P2^0;          //數(shù)碼管4 sbit w1=P2^1;          //數(shù)碼管3 sbit w2=P2^2;          //數(shù)碼管2 sbit w3=P2^3;          //數(shù)碼管1 sbit beep=P3^7;   //蜂鳴器 sbit yellow=P1^0;          //指示燈 sbit   led=P1^1;  //  高溫指示燈 sbit set=P3^0;           //低溫指示燈 sbit add=P3^1; sbit dec=P3^2; int temp1=0;           uint h; uint temp; uchar r; uchar high=100,low=25; uchar sign; uchar q=0; uchar tt=0; uchar scale; uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,                         0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};          //小數(shù)斷碼表 uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,                             0x7d,0x07,0x7f,0x6f,0x00,0x40};          //共陰LED段碼表"0""1""2""3""4""5""6""7""8""9""不亮""-" uchar code table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //個位帶小數(shù)點的斷碼表 uchar data temp_data[2]={0x00,0x00};//讀出溫度暫放 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數(shù)據(jù),共四個數(shù)據(jù)和一個運算暫用 /***************11us延時函數(shù)***************/ void delay(uint t) {         for(;t>0;t--); } void scan() {         int j;         for(j=0;j<4;j++)         {                 switch(j)                 {                         case 0:                         dm=table_dm[display[0]];;                         w0=0;                         delay(300);                         w0=1;                                                //小數(shù)點                         case 1:                         dm=table_dm1[display[1]];                         w1=0;                         delay(300);                         w1=1;                                                //個位                         case 2:                         dm=table_dm[display[2]];                         w2=0;                         delay(300);                         w2=1;                                            //十位                         case 3:                         dm=table_dm[display[3]];                         w3=0;                         delay(300);                         w3=1;                                                //百位                 }         } } /**************DS18B20初始化**************/ ow_reset(void) {         char presence=1;         while(presence)         {                 while(presence)                 {                         DQ=1;_nop_();_nop_();                         DQ=0;                         delay(50);                         DQ=1;                         delay(6);                         presence=DQ;                 }                 delay(45);                 presence=~DQ;         }         DQ=1;                 return presence; } /****************寫命令函數(shù)*****************/ void write_byte(uchar val) {         uchar i;         for(i=8;i>0;i--)         {                 DQ=1;_nop_();_nop_();                 DQ=0;_nop_();_nop_();_nop_();_nop_();                 DQ=val&0x01;                 delay(6);                 val=val>>1;                         }         DQ=1;         delay(1); }         /****************讀一個字節(jié)函數(shù)*******************/ uchar read_byte(void) {         uchar i;         uchar value=0;         for(i=8;i>0;i--)         {                 DQ=1;_nop_();_nop_();                 value>>=1;                 DQ=0;_nop_();_nop_();_nop_();_nop_();                 DQ=1;_nop_();_nop_();_nop_();_nop_();                 if(DQ)value|=0x80;                 delay(6);         }         DQ=1;                 return value;  } /***************讀取溫度函數(shù)***************/ read_temp() {         ow_reset();         delay(200);         write_byte(0xcc);         write_byte(0x44);         ow_reset();         delay(1);         write_byte(0xcc);         write_byte(0xbe);         temp_data[0]=read_byte();         temp_data[1]=read_byte();         temp=temp_data[1];         temp<<=8;         temp=temp|temp_data[0];         return temp; } /***************溫度數(shù)據(jù)處理函數(shù)***************/ work_temp(uint tem) {         uchar n=0;         if(tem>6348)         {                 tem=65536-tem;                 n=1;         }         display[4]=tem&0x0f;         display[0]=ditab[display[4]];         display[4]=tem>>4;         display[3]=display[4]/100;         display[1]=display[4]%100;         display[2]=display[1]/10;         display[1]=display[1]%10;         r=display[1]+display[2]*10+display[3]*100;         if(!display[3])         {                 display[3]=0x0a;                 if(!display[2])                         {                         display[2]=0x0a;                 }         }         if(n)         {                 display[3]=0x0b;         }         return n; } /***************報警提示電路***************/ void BEEP() {          if(r>=high&&r<129)         {                 led=0;         }         else         {                 led=1;         }         if(r<low)         {                 yellow=~yellow;         }         else         {                 yellow=1;         }         if((r>=high&&r<129)||(r<low))         {                 beep=!beep;         }                 else         {                 beep=1;         }} /***************溫度顯示轉換**************/ void xianshi(int horl) {         int n=0;         if(horl>128)         {                 horl=256-horl;                 n=1;         }         display[3]=horl/100;         display[3]=display[3]&0x0f;         display[2]=horl%100/10;         display[1]=horl%10;         display[0]=0;         if(!display[3])         {                 display[3]=0x0a;                 if(!display[2])                         {                         display[2]=0x0a;                 }         }         if(n)         {                 display[3]=0x0b;         }                                                                                 } /**************按鍵設置*************/ void keyscan() {         int temp1;    //最高溫度和最低溫度標志位         if(set==0)         {                 while(1)                 {                         delay(500);//消抖                         if(set==0)                         {                                 temp1++;                                 while(!set)                                 scan();                         }                         if(temp1==1)                         {                                 xianshi(high);                                 scan();                                 if(add==0)                                 {                                         while(!add)                                         scan();                                         high+=1;                                 }                                 if(dec==0)                                 {                                         while(!dec)                                         scan();                                         high-=1;                                 }                         }                         if(temp1==2)                         {                                 xianshi(low);                                 if(add==0)                                 {                                         while(!add)                                         scan();                                         low+=1;                                 }                                 if(dec==0)                                 {                                         while(!dec)                                         scan();                                         low-=1;                                 }                                 scan();                         }                         if(temp1>=3)                         {                                 temp1=0;                                 break;                         }                 }         } } /**************主函數(shù)*************/ void main() {         dm=0x00;         w0=0;         w1=0;         w2=0;         w3=0;         for(h=0;h<4;h++)         {                 display[h]=0;         }         ow_reset();         write_byte(0xcc);         write_byte(0x44);         for(h=0;h<100;h++)         {                 scan();         }         while(1)         {                 if(temp1==0)                 {                         work_temp(read_temp());                 scan();                 BEEP();                 keyscan();                 }                 else        keyscan();                      } }
回復

使用道具 舉報

ID:787372 發(fā)表于 2020-12-19 15:55 | 顯示全部樓層
名字不是重點 發(fā)表于 2020-12-19 15:50
數(shù)碼管有共陰、共陽之分,你選對了嗎?

是共陰的,選對了的
回復

使用道具 舉報

ID:824490 發(fā)表于 2020-12-19 15:56 | 顯示全部樓層
1、你的軟件是否有問題?
2、數(shù)碼管是否選對?
3、PCB走線是否無錯?
另外你家這個原理圖有問題,沒看到一個濾波電容(MCU、18B20都沒有)。數(shù)碼管沒有限流電阻,驅動不擴流,會造成亮度不均。
仿真只從邏輯上從計算分析,并不會從電氣上給你報錯。。
回復

使用道具 舉報

ID:824490 發(fā)表于 2020-12-19 16:01 | 顯示全部樓層
蜂鳴器接法也不對勁。NPN管B極要串一個電阻(1K-4K7),NPN管的C極接10K電阻不對。把電阻去了,蜂鳴器改接電阻位置,E極直接接地
回復

使用道具 舉報

ID:787372 發(fā)表于 2020-12-19 16:09 | 顯示全部樓層
名字不是重點 發(fā)表于 2020-12-19 15:56
1、你的軟件是否有問題?
2、數(shù)碼管是否選對?
3、PCB走線是否無錯?

數(shù)碼管和51單片機之間接了個排阻4.7k的,濾波電路不懂咋弄,求教
回復

使用道具 舉報

ID:18297 發(fā)表于 2020-12-19 16:09 | 顯示全部樓層
硬件電路有問題的,軟件也不知道是否正常。
前期可以先仿真一下軟件功能,再搞個開發(fā)板,驗證一下真實效果,最后再自己做板子。
回復

使用道具 舉報

ID:554500 發(fā)表于 2020-12-19 16:14 | 顯示全部樓層
數(shù)碼管其實就是發(fā)光二極管
如果是共陰,P2置0,P0置1
如果是共陽,P2置1,P0置0
然后看下哪些段亮,哪些不亮
然后再找問題
回復

使用道具 舉報

ID:298850 發(fā)表于 2020-12-19 16:27 | 顯示全部樓層
原理圖問題有點多:
回復

使用道具 舉報

ID:787372 發(fā)表于 2020-12-19 16:30 | 顯示全部樓層
名字不是重點 發(fā)表于 2020-12-19 16:01
蜂鳴器接法也不對勁。NPN管B極要串一個電阻(1K-4K7),NPN管的C極接10K電阻不對。把電阻去了,蜂鳴器改接 ...

按照前輩的方法改了之后仿真達不到預期,蜂鳴器不響,其他電路正常(不懂怎么發(fā)圖片)
回復

使用道具 舉報

ID:298850 發(fā)表于 2020-12-19 16:35 | 顯示全部樓層
1、D1、D2限流電阻太小,用510歐
2、蜂鳴器怎么接成射極跟隨的,改為正常的開關電路
3、數(shù)碼管電路應該可以正常,但直驅方式太剛,加個594吧
18b20看手冊
其他就看你的編程水平了,能做成偽并行的狀態(tài)。
回復

使用道具 舉報

ID:298850 發(fā)表于 2020-12-19 16:36 | 顯示全部樓層
補充:數(shù)碼管驅動需加入限流電阻
回復

使用道具 舉報

ID:414556 發(fā)表于 2020-12-19 17:15 | 顯示全部樓層
你的上拉排阻4.7K有點大,換470Ω應該就亮了.
回復

使用道具 舉報

ID:824490 發(fā)表于 2020-12-19 17:19 | 顯示全部樓層
Schematic Prints.pdf (38.22 KB, 下載次數(shù): 10) 匆忙中畫個圖給你參考一下


回復

使用道具 舉報

ID:787372 發(fā)表于 2020-12-19 20:20 | 顯示全部樓層
名字不是重點 發(fā)表于 2020-12-19 17:19
匆忙中畫個圖給你參考一下

感謝,
回復

使用道具 舉報

ID:420836 發(fā)表于 2020-12-20 00:48 | 顯示全部樓層
查看電路板,檢查是否有缺陷,例如短路,斷線等。如果電路板是好,則檢查程序是否錯誤。
回復

使用道具 舉報

ID:401564 發(fā)表于 2020-12-20 19:46 | 顯示全部樓層
只要是用STC單片機有跟軟件延時相關的東西,仿真正常了,實物一定是不行的
仿真是以傳統(tǒng)的AT8051指令進行的,而STC單片機的指令時鐘是要比AT8051快的
還有,已經快要到2021年了,不要再像以前那樣用三氯化鐵了,自己畫好PCB板,發(fā)去打樣,有一天左右到手
你最終還是要學會畫板的,這畫板跟泡板可不一樣
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表