找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2108|回复: 17
打印 上一主题 下一主题
收起左侧

用腐蚀板做成了单片机温度计实物图,但是有问题

[复制链接]
跳转到指定楼层
楼主
ID:787372 发表于 2020-12-19 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有大佬可以帮我看看怎么回事吗
最近从网上学习用DS18B20和STC52单片机做了个温度计,仿真成功后用腐蚀板做成了实物图,但最后接电源只有蜂鸣器在响,数码管不亮,后面实在找不出问题特地来向大佬们求助,原理图如下

51hei截图20201219134730.png (147.79 KB, 下载次数: 58)

原理图

原理图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:824490 发表于 2020-12-19 15:50 | 只看该作者
数码管有共阴、共阳之分,你选对了吗?
回复

使用道具 举报

板凳
ID:787372 发表于 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;          //数码管4 sbit w1=P2^1;          //数码管3 sbit w2=P2^2;          //数码管2 sbit w3=P2^3;          //数码管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};          //小数断码表 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};        //个位带小数点的断码表 uchar data temp_data[2]={0x00,0x00};//读出温度暂放 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共四个数据和一个运算暂用 /***************11us延时函数***************/ 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;                                                //小数点                         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; } /****************写命令函数*****************/ 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); }         /****************读一个字节函数*******************/ 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;  } /***************读取温度函数***************/ 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; } /***************温度数据处理函数***************/ 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;                         }                 }         } } /**************主函数*************/ 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 发表于 2020-12-19 15:55 | 只看该作者
名字不是重点 发表于 2020-12-19 15:50
数码管有共阴、共阳之分,你选对了吗?

是共阴的,选对了的
回复

使用道具 举报

5#
ID:824490 发表于 2020-12-19 15:56 | 只看该作者
1、你的软件是否有问题?
2、数码管是否选对?
3、PCB走线是否无错?
另外你家这个原理图有问题,没看到一个滤波电容(MCU、18B20都没有)。数码管没有限流电阻,驱动不扩流,会造成亮度不均。
仿真只从逻辑上从计算分析,并不会从电气上给你报错。。
回复

使用道具 举报

6#
ID:824490 发表于 2020-12-19 16:01 | 只看该作者
蜂鸣器接法也不对劲。NPN管B极要串一个电阻(1K-4K7),NPN管的C极接10K电阻不对。把电阻去了,蜂鸣器改接电阻位置,E极直接接地
回复

使用道具 举报

7#
ID:787372 发表于 2020-12-19 16:09 | 只看该作者
名字不是重点 发表于 2020-12-19 15:56
1、你的软件是否有问题?
2、数码管是否选对?
3、PCB走线是否无错?

数码管和51单片机之间接了个排阻4.7k的,滤波电路不懂咋弄,求教
回复

使用道具 举报

8#
ID:18297 发表于 2020-12-19 16:09 | 只看该作者
硬件电路有问题的,软件也不知道是否正常。
前期可以先仿真一下软件功能,再搞个开发板,验证一下真实效果,最后再自己做板子。
回复

使用道具 举报

9#
ID:554500 发表于 2020-12-19 16:14 | 只看该作者
数码管其实就是发光二极管
如果是共阴,P2置0,P0置1
如果是共阳,P2置1,P0置0
然后看下哪些段亮,哪些不亮
然后再找问题
回复

使用道具 举报

10#
ID:298850 发表于 2020-12-19 16:27 | 只看该作者
原理图问题有点多:
回复

使用道具 举报

11#
ID:787372 发表于 2020-12-19 16:30 | 只看该作者
名字不是重点 发表于 2020-12-19 16:01
蜂鸣器接法也不对劲。NPN管B极要串一个电阻(1K-4K7),NPN管的C极接10K电阻不对。把电阻去了,蜂鸣器改接 ...

按照前辈的方法改了之后仿真达不到预期,蜂鸣器不响,其他电路正常(不懂怎么发图片)
回复

使用道具 举报

12#
ID:298850 发表于 2020-12-19 16:35 | 只看该作者
1、D1、D2限流电阻太小,用510欧
2、蜂鸣器怎么接成射极跟随的,改为正常的开关电路
3、数码管电路应该可以正常,但直驱方式太刚,加个594吧
18b20看手册
其他就看你的编程水平了,能做成伪并行的状态。
回复

使用道具 举报

13#
ID:298850 发表于 2020-12-19 16:36 | 只看该作者
补充:数码管驱动需加入限流电阻
回复

使用道具 举报

14#
ID:414556 发表于 2020-12-19 17:15 | 只看该作者
你的上拉排阻4.7K有点大,换470Ω应该就亮了.
回复

使用道具 举报

15#
ID:824490 发表于 2020-12-19 17:19 | 只看该作者
Schematic Prints.pdf (38.22 KB, 下载次数: 10) 匆忙中画个图给你参考一下


回复

使用道具 举报

16#
ID:787372 发表于 2020-12-19 20:20 | 只看该作者
名字不是重点 发表于 2020-12-19 17:19
匆忙中画个图给你参考一下

感谢,
回复

使用道具 举报

17#
ID:420836 发表于 2020-12-20 00:48 | 只看该作者
查看电路板,检查是否有缺陷,例如短路,断线等。如果电路板是好,则检查程序是否错误。
回复

使用道具 举报

18#
ID:401564 发表于 2020-12-20 19:46 | 只看该作者
只要是用STC单片机有跟软件延时相关的东西,仿真正常了,实物一定是不行的
仿真是以传统的AT8051指令进行的,而STC单片机的指令时钟是要比AT8051快的
还有,已经快要到2021年了,不要再像以前那样用三氯化铁了,自己画好PCB板,发去打样,有一天左右到手
你最终还是要学会画板的,这画板跟泡板可不一样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表