数码之家

 找回密码
 立即注册
搜索
查看: 3182|回复: 20

[综合] (解决)求助下,按照论坛做的点焊机st单机片经常死机

[复制链接]
发表于 2021-1-20 14:01:01 | 显示全部楼层 |阅读模式
本帖最后由 沨の痕 于 2021-1-29 15:10 编辑

原帖子:https://www.mydigit.cn/forum.php?mod=viewthread&tid=27146


升压改sx1308,加均衡,做出后触发经常会出现自己复位或者会死机(数码管不亮没反应),断电重开才恢复,然后还是会死机,外接5V供电还是这样,stc5w041单机片
源码
  1. #include "reg51.h"       //此文件中定义了单片机的一些特殊功能寄存器
  2. typedef unsigned int u16;//对数据类型进行声明定义
  3. typedef unsigned char u8;//对数据类型进行声明定义
  4. sbit P30=P1^0;                        //数码管第1位
  5. sbit P31=P1^1;                        //数码管第2位
  6. sbit k1=P1^6;        //将单片机的P3.2端口定义为时间加
  7. sbit k2=P1^5;        //将单片机的P3.3端口定义为时间减
  8. sbit k3=P1^7;        //将单片机的P3.4端口定义为检测点焊笔


  9. sbit out=P1^4;       //驱动脉冲输出
  10. //数码管真值表//
  11. u8 code LED_CODE[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //显示0~F的段码


  12. u16 Cntms1=0,Cntms2=0,num1,num2;ke;


  13. u8 num;                //定时变量=毫秒


  14. void Delay(unsigned long int t)
  15. {
  16.         while(--t);
  17.          
  18. }


  19. /*===加按键检测===*/
  20. /*当此函数检测到有效按键时返回1,没有检测到有效值时返回0*/
  21. bit skey0(void)
  22. {
  23.         static unsigned char a = 0;
  24.         if(k1 == 0)                                        //如果检测到按键引脚有低电平,记数变量开始累加.
  25.         {
  26.                 if(a < 50)                                //控制延时计数返0,因为当按键不松开时,j一直在累加
  27.                         a++;                                //CPU每检测到一次按键引脚为低电平0,j就累加1次.
  28.         }
  29.         else                                                //如果按键没有按下或者按下后有高电平(抖动)j清0
  30.                 a = 0;
  31.         
  32.         if(a == 49)                                //如果变量j的值累加到49,说明按键已跨过抖动区.
  33.                 return 1;                                //返回1,说明已检测到按键有效值.
  34.         else
  35.                 return 0;                                //返回0,说明没有检测到有效值.
  36. }
  37. /*===减按键检测===*/
  38. /*当此函数检测到有效按键时返回1,没有检测到有效值时返回0*/
  39. bit skey1(void)
  40. {
  41.         static unsigned char i = 0;        //定义静态变量,用来记录延时用.
  42.         if(k2 == 0)                                        //如果检测到按键引脚有低电平,记数变量开始累加.
  43.         {
  44.                 if(i < 50)                                //控制延时计数返0,因为当按键不松开时,i一直在累加.
  45.                         i++;                                //CPU每检测到一次按键引脚为低电平0,i就累加1次.
  46.         }
  47.         else                                                //如果按键没有按下或者按下后有高电平(抖动)i清0
  48.                 i = 0;
  49.         
  50.         if(i == 49)                                //如果变量i的值累加到49,说明按键已跨过抖动区
  51.                 return 1;                                //返回1,说明已检测到按键有效值.
  52.         else
  53.                 return 0;                                //返回0,说明没有检测到有效值.
  54. }


  55. bit skey2(void)
  56. {
  57.         static unsigned  int l = 0;        //定义静态变量,用来记录延时用.                   unsigned long int
  58.         if(k3 == 0)                                //如果检测到按键引脚有低电平,记数变量开始累加.
  59.         {
  60.                 if(l <5000)                                //控制延时计数返0,因为当按键不松开时,i一直在累加
  61.                         l++;                                //CPU每检测到一次按键引脚为低电平0,i就累加1次.
  62.         }
  63.         else                                                //如果按键没有按下或者按下后有高电平(抖动)i清0
  64.                 l = 0;
  65.         
  66.         if(l == 4999)                                //如果变量i的值累加到4999,说明点焊笔已经做好准备,可以焊接了.
  67.                 return 1;                                //返回1,说明已检测到按键有效值.
  68.         else
  69.                 return 0;                                //返回0,说明没有检测到有效值.
  70. }




  71. /********************************
  72.                 数码管动态显示程序
  73. ********************************/
  74. void display()
  75. {
  76.         static u8 i=0;
  77.       
  78.                   
  79.          
  80.         if(i==0)
  81.         {
  82.                 P30=1;
  83.                 P31=0;
  84.                 P3=LED_CODE[num/10];
  85.                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  86.                             P31=1;
  87.                                 P3=0Xff;
  88.                                 
  89.                 i=1;
  90.                                 
  91.         }
  92.         else
  93.         {
  94.                 P31=1;
  95.                 P30=0;
  96.                 P3=LED_CODE[num%10];
  97.                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  98.                                 P30=1;
  99.                                 P3=0Xff;                 //消隐
  100.                                 
  101.                 i=0;
  102.                         
  103.         }
  104. }





  105. //主函数//
  106. void main()
  107. {      
  108.                   bit m = 0,m1 = 0,m2=0;                        //声明一个位变量.用来存储按键状态.
  109.          unsigned char i;
  110.         out=1; //初始化输出端口
  111.         num=40;//定时变量赋初值
  112.         
  113.             
  114.                 k1 = 1;                                                //加按键输入端口电平置高
  115.                 k2 = 1;                                                //减按键输入端口电平置高
  116.                 k3 = 1;               
  117.                                        
  118.                         while(1)                                        //主循环
  119.                         {
  120.                            
  121.                                 m  = skey0();                        //采集加按键
  122.                                 m1 = skey1();                        //采集减按键
  123.                             m2 = skey2();                        //采集按键
  124.                                 if(m == 1)                                //如果采集到加按键值.
  125.                                 {
  126.                                  if(num < 99)
  127.                                         num++;                                //计数自增        
  128.                                 }
  129.                                 if(m1 == 1)                                //如果采集到减按键值.
  130.                                 {
  131.                                  if(num >1)        
  132.                                         num--;                                //计数自减
  133.                                   }
  134.                                  if(m2 == 1)
  135.                                          { for(i=0;i<2;i++)        //加入 for循环,表明for循环大括号中的程序循环执行2次
  136.                                           {
  137.                                                 out=0;                        //将P1.0口赋值 0,对外输出低电平
  138.                                                 Delay(num*50);        //调用延时程序;更改延时数字可以更改延时长度;用于改变输出脉冲时间
  139.                                                 out=1;                        //将P1.0口赋值 1,对外输出高电平
  140.                                                 Delay(3000);
  141.                                            }
  142.                                          }                        
  143.                         display();//数码管动态显示        
  144.                     }
  145. }
复制代码


已解决,解决方法为把2200uf电容直接焊在单机片输入脚

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2021-1-20 14:40:58 | 显示全部楼层
如果只是开机,不触发时会死机吗?还是按下触发键才会死机?
回复 支持 反对

使用道具 举报

发表于 2021-1-20 14:44:38 | 显示全部楼层
应该是高频干扰问题,还是PCB布线问题吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 15:07:02 | 显示全部楼层
本帖最后由 沨の痕 于 2021-1-20 15:08 编辑
温力口 发表于 2021-1-20 14:40
如果只是开机,不触发时会死机吗?还是按下触发键才会死机?

点焊的时候死机,空触发不会,有时正常有时死机,外接5v供电还是那样
回复 支持 反对

使用道具 举报

发表于 2021-1-20 15:10:58 | 显示全部楼层
沨の痕 发表于 2021-1-20 15:07
点焊的时候死机,空触发不会,有时正常有时死机,外接5v供电还是那样

就做了一片么,尝试换个单片机芯片试试看供电搞过还是没用那只能换着来了
回复 支持 反对

使用道具 举报

发表于 2021-1-20 15:17:54 | 显示全部楼层
出现单片机死机多半是信号输入,强弱电电源等干扰,看楼主电路建议将单片机地与场管输出地分开,还有在微动开关输入端加光耦与单片机隔离试试,其他解决干扰的方案如在程序设计中加入抗干扰程序,以及换用抗干扰能力较强的单片机如PIC系列等等只是有一定的难度罢了。

打赏

参与人数 2家元 +40 收起 理由
hideaway + 20 歡迎探討
10655188 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-1-20 15:23:55 | 显示全部楼层
VCC上加104电容  就是0.1uF
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 15:26:59 | 显示全部楼层
ddd111222 发表于 2021-1-20 15:10
就做了一片么,尝试换个单片机芯片试试看供电搞过还是没用那只能换着来了 ...

换单机片还是那样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 15:27:49 | 显示全部楼层
firn 发表于 2021-1-20 15:23
VCC上加104电容  就是0.1uF

试过了,单机版输入加104,直接焊在芯片脚上,结果无端端烧了2片
回复 支持 反对

使用道具 举报

发表于 2021-1-20 15:35:45 来自手机浏览器 | 显示全部楼层
把板的照片发出来更好分析点!
回复 支持 反对

使用道具 举报

发表于 2021-1-20 16:17:45 | 显示全部楼层
沨の痕 发表于 2021-1-20 15:07
点焊的时候死机,空触发不会,有时正常有时死机,外接5v供电还是那样

这是干扰造成的,你把电源波波做好,大电流地与信号地分开。如果有可能,把控制板放在金属盒内屏蔽。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 23:43:24 | 显示全部楼层
温力口 发表于 2021-1-20 16:17
这是干扰造成的,你把电源波波做好,大电流地与信号地分开。如果有可能,把控制板放在金属盒内屏蔽。 ...

我看别人做都没分开,直接法拉电容升压用都正常
回复 支持 反对

使用道具 举报

发表于 2021-1-21 00:07:17 | 显示全部楼层
沨の痕 发表于 2021-1-20 23:43
我看别人做都没分开,直接法拉电容升压用都正常

走线很重要。
回复 支持 反对

使用道具 举报

发表于 2021-1-21 09:04:23 | 显示全部楼层
估计是布板的问题,建议有示波器的用示波器量下SX1308升压后的电压,估计波动很大.
建议SX1308升压到12V再降压给单片机供电,另个给MOS触发建议也加个光藕
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-21 11:36:10 | 显示全部楼层
rogerllg 发表于 2021-1-21 09:04
估计是布板的问题,建议有示波器的用示波器量下SX1308升压后的电压,估计波动很大.
建议SX130 ...

sx1308升压的确有波动,设计是15v,有时会飙到16v
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-21 15:34:55 | 显示全部楼层

我尝试了挑起芯片脚单独供电还是会死机,用外接5v给板子供电时发现,出现复位或者死机的时候外接电源进入恒流
回复 支持 反对

使用道具 举报

发表于 2021-1-21 16:02:28 | 显示全部楼层
沨の痕 发表于 2021-1-21 15:34
我尝试了挑起芯片脚单独供电还是会死机,用外接5v给板子供电时发现,出现复位或者死机的时候外接电源进入 ...

这单片机耗电很小,何必要设置成恒流模式?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-21 16:17:05 | 显示全部楼层
温力口 发表于 2021-1-21 16:02
这单片机耗电很小,何必要设置成恒流模式?

是我用可调电源单独给单机片供电,恒流1a,出现死机的情况电源会瞬间恒流1秒左右,还有死机后单机片发热严重,有时点焊电容均衡也会无端端打开
回复 支持 反对

使用道具 举报

发表于 2021-1-21 17:07:50 | 显示全部楼层
51内核的先天那样,如有可能换ST的试试
回复 支持 反对

使用道具 举报

发表于 2021-1-27 10:16:03 | 显示全部楼层
电路图问题很多啊。
1,光耦没有上拉。
2,按键没有防抖和ESD
3,电源连个电容都不加
4,数码显示限流电阻也没有
5,NMOS集体没有下拉、
反正能跑起来 也算奇迹吧
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-19 07:38 , Processed in 0.202801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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