找回密码
 立即注册

QQ登录

只需一步,快速开始

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

想请问各位大佬,为什么单片机程序会烧不进去芯片里?

  [复制链接]
跳转到指定楼层
楼主
之前拿焊好的板烧程序一直烧不进去,之后拿最小系统那个模块来烧程序也不行,期间换了好几块芯片来试都不行,一直显示正在检测目标单片机。请问这是程序的问题吗?还是其他原因?
单片机源程序如下:
  1. /************************************
  2. *********STC89C52**********
  3. **********12MHz晶振*********/

  4. #include "reg51.h"
  5. #include<stdio.h>
  6. #include<intrins.h>
  7. #define uint8 unsigned char
  8. #define uint16 unsigned int
  9. #define uchar unsigned char
  10. #define uint unsigned int





  11. uint16 cnt2ms;        //10ms计时器
  12. uint8 cnt1s;        //1秒计数器

  13. //电阻--------------------------------
  14. #define        Z1 13700053.00
  15. #define        Z2 3685279.00


  16. float RZ=0;
  17. unsigned long   RX=0;
  18. unsigned long   RX2=0;
  19. unsigned long   RX3=0;
  20. unsigned long   RX4=0;
  21. unsigned long   RX5=0;
  22. unsigned long   RX6=0;
  23. unsigned long   RX7=0;
  24. unsigned long   RX8=0;
  25. unsigned long   RX9=0;



  26. //电感--------------------------------
  27. float LZ=0;
  28. #define        C1 0.1461

  29. //电容--------------------------------
  30. float CZ=0;
  31. float CX=0;
  32. #define        R1 42874

  33. uint8 KL=0;        //
  34. unsigned int Pulsecnt=0;        //脉冲个数
  35. unsigned int Pulsenum;        //脉冲个数
  36. uint8 start=0;        //
  37. uint16 PulseTime;        //10ms计数器
  38. uint16 Pulse;        //10ms计数器
  39. bit flag=0;
  40. uint8 CH=0;        //
  41. unsigned long x;
  42. void Init_Extint(void);
  43. void TimerInitProc();

  44. void Init_System(void);
  45. void Display(uint8 chose_dat, uint8 dat);
  46. void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);
  47. void DelayMs(uint8 Ms);
  48. uint8 Pulse_FLAG=0;
  49. uint8 Pulse_5=0;
  50. /********************************按键*****************************************/
  51. sbit    K1=P1^3;
  52. sbit    K2=P1^4;
  53. sbit    K3=P1^5;

  54. sbit    A0=P2^1;
  55. sbit    A1=P2^0;

  56. sbit    RED=P3^6;
  57. sbit    YEW=P3^4;
  58. sbit    GRE=P3^3;
  59. /********************************LCD液晶**************************************/
  60. #define LCD_Data P0           //LCD的数据口
  61. sbit    LCD_BF=LCD_Data^7;    //LCD的忙信号位
  62. sbit    LCD_RS=P1^0;
  63. sbit    LCD_RW=P1^1;
  64. sbit    LCD_EN=P1^2;



  65. #define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位

  66. //输入方式设置
  67. #define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一
  68. #define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
  69. #define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移
  70. #define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动

  71. //设置显示、光标及闪烁开、关
  72. #define LCD_DISPLAY_ON            0x0C         //显示开
  73. #define LCD_DISPLAY_OFF           0x08         //显示关
  74. #define LCD_CURSOR_ON             0x0A         //光标显示
  75. #define LCD_CURSOR_OFF            0x08         //光标不显示
  76. #define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
  77. #define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁

  78. //光标、画面移动,不影响DDRAM
  79. #define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
  80. #define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
  81. #define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
  82. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位

  83. //工作方式设置
  84. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
  85. #define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
  86. /*定义子程序*/
  87. void LCD_ClrAll(void);              //清屏
  88. void Judge_LCD_busy(void);           //检测是否忙碌
  89. void LCD_Write(uchar WriteData);     //写控制字
  90. void LCD_write_data(uchar LCD_data); //写数据显示
  91. void LCD_cursor(uchar x);    //光标起始地址
  92. void LCD_printc(unsigned char lcd_data) ;  //输出一个字符
  93. void LCD_prints(unsigned char *lcd_string);//输出一个字符串



  94. /*LCD1602忙碌判断子程序*/
  95. void Judge_LCD_busy(void)   //判断LCD1602是否忙状态
  96. {
  97. while(1)
  98.   {
  99.    LCD_EN=0;
  100.    LCD_RS=0;
  101.    LCD_RW=1;
  102.    LCD_Data=0xff;
  103.    LCD_EN=1;   //EN 是1-0 使能
  104.    if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待
  105.   }
  106.    LCD_EN=0;
  107. }
  108. /******LCD清屏***************/
  109. void LCD_ClrAll(void)
  110. {

  111. Judge_LCD_busy();   //判断是否忙碌
  112. LCD_RS=0;
  113. LCD_RW=0;
  114. LCD_Data=0x01;
  115. LCD_EN=1;
  116. LCD_EN=0;

  117. }
  118. /*******LCD写数据定义各种模式*********/
  119. void LCD_Write(uchar WriteData)   //写指令到LCD
  120. {
  121. Judge_LCD_busy();
  122. LCD_RS=0;
  123. LCD_RW=0;

  124. P0=WriteData; //把WriteDate的数据送到数据口
  125. LCD_EN=1;
  126. LCD_EN=0;
  127. }
  128. /********LCD显示数据***********/
  129. void LCD_write_data(uchar LCD_data)      //输入一个字节数据到LCD
  130. {
  131. Judge_LCD_busy();
  132. LCD_RS=1;
  133. LCD_RW=0;

  134. P0=LCD_data;
  135. LCD_EN=1;
  136. LCD_EN=0;
  137. }
  138. /****光标位置的确定***/
  139. void LCD_cursor(uchar x)            //LCD光标定位到x处
  140. {
  141. LCD_Write(0x80+x);                       //第一行地址是0x80

  142. }
  143. /*输入一个字符*/
  144. void LCD_printc(unsigned char lcd_data)
  145. {
  146. LCD_write_data(lcd_data);
  147. }

  148. /*输出字符串*/
  149. void LCD_prints(unsigned char *lcd_string)
  150. {
  151. unsigned char i=0;
  152. while(lcd_string[i]!=0x00)
  153.   {
  154.    LCD_write_data(lcd_string[i]);
  155.    i++;
  156.   }
  157. }

  158. /*初始化程序*/
  159. void LCD_initial(void)                        //初始化LCD
  160. {
  161. LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  162. LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  163. LCD_Write(LCD_DISPLAY_DOUBLE_LINE);
  164. LCD_ClrAll();

  165. }

  166. /****延时******/
  167. void delay_1ms(uint x)
  168. {
  169. uint j;
  170. uchar i;
  171. for(j=0;j<x;j++)
  172. {
  173. for(i=0;i<120;i++);
  174. }
  175. }
  176. void Key_SM(void){

  177.         if(K3==0){
  178.              delay_1ms(5);
  179.             if(K3==0){
  180.                 YEW=1;RED=0;
  181.                 GRE=1;                  
  182.                 LCD_cursor(0x00);
  183.                 LCD_prints("   MEASURE Lx   ");  
  184.                 //----电感档-------
  185.                 A0=0;
  186.                 A1=1;
  187.                 CH=2;//电感档

  188.                 while(K3==0){}
  189.                      
  190.                  }
  191.             }

  192.         if(K2==0){
  193.              delay_1ms(5);
  194.             if(K2==0){
  195.                 GRE=1;YEW=0;
  196.                 RED=1;                  
  197.                 LCD_cursor(0x00);            
  198.                 LCD_prints("   MEASURE Rx   ");  
  199.                //----电阻档-------
  200.                 A0=1;
  201.                 A1=0;
  202.                 CH=1;//电阻档   
  203.                  
  204.                 while(K2==0){}
  205.                      }

  206.                 }
  207.        if(K1==0){
  208.              delay_1ms(5);
  209.             if(K1==0){
  210.                YEW=1;GRE=0;RED=1;
  211.                LCD_cursor(0x00);
  212.                LCD_prints("   MEASURE Cx   ");  
  213.                //----电容档-------
  214.                 A0=0;
  215.                 A1=0;
  216.                 CH=3;//电容档                     
  217.                while(K1==0){}
  218.                        }

  219.                 }


  220. }

  221. void  Value_to_ASCII(unsigned long value,uchar add)
  222. {
  223.     unsigned char temp[] = "0000.000K ";
  224.     temp[0] = value/1000000 + 0x30;//数值改成字符,液晶显示需要ASCII码
  225.     value = value%1000000;
  226.     temp[1] = value/100000 + 0x30;
  227.     value = value%100000;
  228.     temp[2] = value/10000 + 0x30;
  229.     value = value%10000;
  230.     temp[3] = value/1000 + 0x30;
  231.     value = value%1000;
  232.     temp[5] = value/100 + 0x30;
  233.     value = value%100;
  234.     temp[6] = value/10 + 0x30;
  235.     value = value%10;
  236.     temp[7] = value + 0x30;  
  237.    
  238. LCD_cursor(add);   //光标起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  239. LCD_prints(temp);
  240. }

  241. void  Value_to_ASCIIL(unsigned long value,uchar add)
  242. {
  243.     unsigned char temp[] = "000000uH ";
  244.     temp[0] = value/100000 + 0x30;
  245.     value = value%100000;
  246.     temp[1] = value/10000 + 0x30;
  247.     value = value%10000;
  248.     temp[2] = value/1000 + 0x30;
  249.     value = value%1000;
  250.     temp[3] = value/100 + 0x30;
  251.     value = value%100;
  252.     temp[4] = value/10 + 0x30;
  253.     value = value%10;
  254.     temp[5] = value + 0x30;  
  255.    
  256. LCD_cursor(add);   //光标起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  257. LCD_prints(temp);
  258. }
  259. void  Value_to_ASCIIC(unsigned long value,uchar add)
  260. {
  261.     unsigned char temp[] = "00000.0pF ";
  262.     temp[0] = value/100000 + 0x30;
  263.     value = value%100000;
  264.     temp[1] = value/10000 + 0x30;
  265.     value = value%10000;
  266.     temp[2] = value/1000 + 0x30;
  267.     value = value%1000;
  268.     temp[3] = value/100 + 0x30;
  269.     value = value%100;
  270.     temp[4] = value/10 + 0x30;
  271.     value = value%10;
  272.     temp[6] = value + 0x30;  
  273.    
  274. LCD_cursor(add);   //光标起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  275. LCD_prints(temp);
  276. }
  277. //--------------------主程序--------------------------------
  278. void main()
  279. {
  280.    
  281.       TMOD=0x51;                 //设置定时器0,方式1::1位定时器
  282.       TH1=0;
  283.       TL1=0;
  284.       TH0=(65536-2100)/256; //设定定时周期
  285.       TL0=(65536-2100)%256;
  286.       TR0=1;
  287.       TR1=1;
  288.       ET1=1;
  289.       ET0=1;
  290.       EA=1;
  291. //----电阻档-------
  292.       A0=1;
  293.       A1=0;
  294.     LCD_initial();
  295.           delay_1ms(50);
  296.     LCD_initial();
  297.           delay_1ms(50);
  298.     LCD_cursor(0x00);
  299.                
  300.     LCD_prints("   MEASURE Rx   ");
  301.     GRE=1;
  302.         YEW=0;
  303.           RED=1;
  304.     LCD_cursor(0x45);
  305.     CH=1;
  306.    
  307.         while(1)
  308.         {

  309.      Key_SM();
  310.     if(flag==1){

  311.         flag=0;

  312.         x=Pulsenum*65536+TL1;//计算1s内的脉冲个数,频率=脉冲个数
  313. if(CH==1){

  314.         RZ=(Z1/x);//测量100到1000
  315.         RX=RZ-1000;
  316.         RX=RX>>1;

  317. if(RX>=100){
  318.         RX=RX+100;
  319.     }else{RX=0;}

  320.     if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}
  321.   if(RX>1000000){RX=1000000; }
  322.             
  323.               RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度

  324. RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
  325.               //保存上一次的阻值
  326.             
  327.          Value_to_ASCII(RX2,0x44);//更新阻值显示



  328. }
  329. if(CH==2){

  330.       
  331.         LZ=(x*39*C1)/100000;
  332.         LZ=LZ*x;
  333.         LZ=1000000/LZ;
  334.     if(x==0)LZ=0;
  335.   if(LZ>999999)LZ=999999; //限制最高值
  336.          Value_to_ASCIIL(LZ,0x44);//更新电感值显示
  337. }
  338. if(CH==3){

  339.        CZ=660000/x;
  340.     if(x==0||x>30500)CZ=0;
  341.   if(CZ>999999)CZ=999999;  //限制最高值
  342.          Value_to_ASCIIC(CZ,0x44);//更新电容值显示
  343. }
  344.          cnt2ms=0;
  345.          Pulsenum=0;
  346.          TH1=0;
  347.          TL1=0;
  348.          TR1=1;
  349.         
  350.     }
  351.         
  352.         }
  353. }
  354. /*******************************************************************************
  355. * 函数名:Extio interrupt
  356. * 函数功能:/TO引脚下降沿进入中断
  357. * 入口参数:无
  358. * 返    回:无
  359. *******************************************************************************/
  360. void T1_interrupt(void) interrupt 3 using 0
  361. {
  362.    
  363.   Pulsenum++;        //保存测得脉冲值  
  364.         
  365. }
  366. /********************************************************************
  367. 函数功能:定时器/计时器1中断处理
  368. 入口参数:null
  369. 返    回:null
  370. 备    注:null
  371. ********************************************************************/
  372. void Timer0IntProc() interrupt 1 using 0 //2ms
  373. {
  374.   TH0=(65536-2000)/256;
  375.   TL0=(65536-2000)%256;
  376.     cnt2ms++;

  377.         if(cnt2ms==500)        //1s计时到
  378.         {              
  379.                 cnt2ms = 0;
  380.             
  381.         flag=1;
  382.         }

  383. }
复制代码


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

使用道具 举报

沙发
ID:96682 发表于 2021-6-17 14:09 来自手机 | 只看该作者
操作问题,这跟所使用的下载器有关。插拔,上电等步骤得按部就班操作才行,不然会让你抓狂
回复

使用道具 举报

板凳
ID:938885 发表于 2021-6-17 14:41 | 只看该作者
驱动,操作,下载器,或者电脑有点问题都是有可能的  多试几下试试
回复

使用道具 举报

地板
ID:57657 发表于 2021-6-17 15:47 | 只看该作者
请用示波器或万用表的频率档,检测晶振是否正常。
回复

使用道具 举报

5#
ID:829782 发表于 2021-6-17 16:43 | 只看该作者
lyh122 发表于 2021-6-17 14:41
驱动,操作,下载器,或者电脑有点问题都是有可能的  多试几下试试

都试过了,不行
回复

使用道具 举报

6#
ID:829782 发表于 2021-6-17 16:49 | 只看该作者
npn 发表于 2021-6-17 15:47
请用示波器或万用表的频率档,检测晶振是否正常。

可我单独使用最小系统模块烧入程序也不行,大佬可还有其他原因导致的吗?
回复

使用道具 举报

7#
ID:829782 发表于 2021-6-17 16:51 | 只看该作者
wc86110 发表于 2021-6-17 14:09
操作问题,这跟所使用的下载器有关。插拔,上电等步骤得按部就班操作才行,不然会让你抓狂

真的抓狂了,按照步骤走试了好多次都不行,大佬可还有其他解决办法吗?
回复

使用道具 举报

8#
ID:829782 发表于 2021-6-17 16:53 | 只看该作者
lyh122 发表于 2021-6-17 14:41
驱动,操作,下载器,或者电脑有点问题都是有可能的  多试几下试试

大佬觉得可能还有其他什么原因导致的吗?
回复

使用道具 举报

9#
ID:94031 发表于 2021-6-17 16:59 | 只看该作者
一直显示正在检测目标单片机,这时只要断一下板子供电,就可以往下进行了。
回复

使用道具 举报

10#
ID:829782 发表于 2021-6-17 17:11 | 只看该作者
xuyaqi 发表于 2021-6-17 16:59
一直显示正在检测目标单片机,这时只要断一下板子供电,就可以往下进行了。

这个也试过了,断电后再供电还是依然在显示正在检测目标单片机,大佬觉得还有其他原因吗?
回复

使用道具 举报

11#
ID:94031 发表于 2021-6-17 17:18 | 只看该作者
木槿w 发表于 2021-6-17 17:11
这个也试过了,断电后再供电还是依然在显示正在检测目标单片机,大佬觉得还有其他原因吗?

那估计你的板子硬件有问题
回复

使用道具 举报

12#
ID:678280 发表于 2021-6-17 17:39 | 只看该作者
我也曾经遇到这事,后来改了对应芯片型号就能成功烧写了,芯片后缀也不能差。


回复

使用道具 举报

13#
ID:829782 发表于 2021-6-17 18:06 | 只看该作者
一片一城 发表于 2021-6-17 17:39
我也曾经遇到这事,后来改了对应芯片型号就能成功烧写了,芯片后缀也不能差。

呜呜呜,后缀改了也不行
回复

使用道具 举报

14#
ID:94031 发表于 2021-6-17 19:56 | 只看该作者
木槿w 发表于 2021-6-17 16:49
可我单独使用最小系统模块烧入程序也不行,大佬可还有其他原因导致的吗?

会不会你的下载线有问题
回复

使用道具 举报

15#
ID:939589 发表于 2021-6-17 20:37 | 只看该作者
型号,波特率换换
回复

使用道具 举报

16#
ID:748788 发表于 2021-6-17 21:15 | 只看该作者
rx、tx有没有交叉?
回复

使用道具 举报

17#
ID:372579 发表于 2021-6-17 21:53 | 只看该作者
可能存在的问题如下
1、电平转换芯片MAX232烧坏
2、单片机P3.0(RXD)和P3.1(TXD)烧坏
3、复位电路有问题,RST端一直被置为高电平,正常情况下不复位时RST端为低电平
4、PC端的RXD对应MAX232上的TXD,不知道你有没有换过串口线
5、电脑的串口或者是串口线坏了
6、是不是对应芯片型号,能不能基本上就是这些问题吧,你可以参考参考

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

18#
ID:939657 发表于 2021-6-17 23:06 | 只看该作者
可以参考我之前遇到过的情况:
1、烧录软件不对,就去找度娘了解清楚我所使用的的芯片适应的烧录软件
2、串行口接触不良,多把开关按几遍,USB线多次重复插进去,再烧录
3、选的芯片类型不对,一般普中单片机是stc89Cxx(new)这个类型
4、波特率过低,可以试一下波特率调到最高

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

19#
ID:938846 发表于 2021-6-18 00:16 | 只看该作者
每一步骤都要细致地去执行,而且要多尝试几次
回复

使用道具 举报

20#
ID:690831 发表于 2021-6-18 01:45 | 只看该作者
确定晶振正常
把两根电源线,以及TX,RX直接接到单片机的管脚上,以排除虚焊或跳线设置错误。
把P1.0和P1.1接地试试

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

21#
ID:592807 发表于 2021-6-18 08:35 | 只看该作者
木槿w 发表于 2021-6-17 16:43
都试过了,不行

断电断的不彻底
回复

使用道具 举报

22#
ID:524818 发表于 2021-6-18 08:44 | 只看该作者
用的什么下载线?
回复

使用道具 举报

23#
ID:879348 发表于 2021-6-18 13:37 | 只看该作者
初学者的通病,当年也经常烧录不进去,一个好的烧录工具很重要

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

24#
ID:938893 发表于 2021-6-19 13:40 | 只看该作者
重新编译,型号选择。或者网上弄一个程序检查一下硬件问题
回复

使用道具 举报

25#
ID:742483 发表于 2021-6-19 14:17 | 只看该作者
如果生成了HEX文件,烧不进去就不会是程序的问题,可能是软件那儿出的错误
回复

使用道具 举报

26#
ID:923669 发表于 2021-6-19 18:17 来自手机 | 只看该作者
逐步检查一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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