STC51系列单片机免掉电下载(热启动下载)

 

STC51系列单片机免掉电下载(热启动下载)

分类: 技巧   77人阅读  评论(0)  收藏  举报
热启动 单片机 免断电下载

        相信喜欢单片机的朋友都用过STC的单片机,用过STC单片机的朋友都有这种感受:实惠、易用、功能强大!就是每次下载都要冷启动特别恶心,相信很多朋友的开发板上的电源键都按烂了。

        其实STC单片机可以不用免掉电下载,想要知道怎样才能免掉电下载,我们先要了解STC单片机是怎样实现串口下载的,其实STC单片机出厂时就预置了一段ISP监控程序,我们称作ISP引导码,这段ISP监控程序就好比电脑硬盘的系统引导区。我们对STC单片机上电启动时,单片机首先执行ISP引导码检测串口是否下载程序的命令,如果上位机在对单片机下载程序时,单片机检测到下载数据流就启动ISP下载功能对单片机进行程序下载,这就是我们平时实验时点击下载后按开发板电源键的过程。
        STC单片机在进行冷启动时会从ISP引导码开始执行程序,而进行热启动或按复位键软启动时是从用户程序段开始执行的。然而熟悉STC单片机的朋友知道STC单片机增加了ISP/IAP控制寄存器ISP_CONTR,用来管理ISP/IAP功能和是否软启动,其各位功能大家可参照STC公司相关资料。当我们将ISP_CONTR置为0x60时单片机自动复位从ISP引导码开始执行。由此我们在需要下载程序时将ISP_CONTR置为0x60就可以完成下载了。
    下面来介绍怎样实现
            方法一:通过按复位键来实现,STC单片机上电复位时PCON的POF=1,在按复位键复位时POF=0。所以我们在程序中可以用POF来   控制ISP_CONTR。
            方法二:利用串口,STC下载软件中有个自定义下载,也就是下载前通过串口发送一段自定义代码,单片机收到该代码后来控制单片机
ISP_CONTR进行软复位下载。

 STC51系列单片机免掉电下载(热启动下载)_第1张图片

[cpp]  view plain copy
  1. /************************************************************************************ 
  2. * 程序名称:STC单片机免掉电下载 
  3. * 程序作者:itas109 
  4. * 个人博客:http://blog.csdn.net/itas109 
  5. * 程序版本: V1.1 
  6. * 编制日期: 2013-08-05 
  7. * 编译器:Keil C uVision4 
  8. * 调试芯片:STC90C516RD+ 11.0592M晶振 
  9. * 占用资源:  1、自定义下载:串口,定时器T1,中断 
  10.               2、复位键下载:不占用资源 
  11. * 特别说明:  1、修改后的程序可以实现复位按键和自定义下载同时进行,也可以根据自己 
  12.                 的需要选择,若用户所写程序用到定时器时,请只是用复位下载。 
  13.               2、注意使用自定义下载时,尽量不要对P3口的低四位进行操作,否则可能 
  14.                  下载失败。 
  15.               3、该头文件使用说明: 
  16.                 使用时,将该头文件加入到所编写的程序当中(可以直接添加到Keil的库文件里面), 
  17.                 在main开始调用Auto_Download()函数即可,例如: 
  18.                 #include<xx.h>//你所需的头文件 
  19.                 #include"download.h"//添加免掉电下载头文件 
  20.                 void main() 
  21.                 { 
  22.                     Auto_Download();//调用免掉电下载函数 
  23.                     while(1) 
  24.                     { 
  25.                         //添加你的代码 
  26.                     } 
  27.                 } 
  28.               4、自定义下载时,波特率为9600,奇偶位为None,数据位为8,停止位为1,自定义 
  29.                 下载指令为AB。以上设置可以自己在程序中修改。 
  30.               5、程序可以根据自己的喜好修改,不过请标注原作者的信息,谢谢! 
  31.  
  32.  
  33. ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆原作者信息☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 
  34. *******源程序地址;http://www.51hei.com/mcu/1405.html******************************* 
  35. * 程序作者: 郭伟(QQ:495817787 ,Email:) 
  36. * 程序版本: V1.0 
  37. * 编制日期: 2012-01-19 
  38. * 编译器:Keil C uVision4 
  39. * 调试芯片:STC89C52 11.0592M晶振 
  40. * 占用资源:  1》自定义下载:串口,定时器T1,中断 
  41.                      2》复位键下载:不占用资源 
  42. * 特别说明:  1》使用本程序时需要用宏来选择条件编译程序段 
  43.                       2》使用复位键下载时,只需要在main函数开头调用ResetKey_Download(); 
  44.                       3> 使用自定义下载时调用Auto_Download()对串口进行初始化,波特率9600 
  45.         
  46. **************************************************************************************/  
  47. #ifndef _DOWNLOAD_H_     
  48. #define _DOWNLOAD_H_  
  49.   
  50. sfr ISP_CONTR  = 0xE7;//软复位寄存器声明  
  51.   
  52. /***选择下载方式***/  
  53. //#define Serial_download//若用户所写程序没有用到定时器,可以去掉注释,使其有效   
  54. #define ResetKey_download//使用条件编译选择下载方式,可以只使用一个。  
  55. /*****************/  
  56. #ifdef ResetKey_download  
  57.     //复位下载相关函数  
  58.     void ResetKey_Download()  
  59.     {     
  60.         if ((PCON & 0x10) == 0)  
  61.         {      
  62.             //POF位=0,单片机软件复位  
  63.             PCON = PCON | 0x10;     //将POF位置1,防止重复进入isp监控区  
  64.                 ISP_CONTR = 0x60;       //软复位,从ISP监控区启动,如果没有isp下载流,则重新转向用户区引导  
  65.         }  
  66.     else  
  67.         {  
  68.             PCON = PCON & 0xef;   //将POF清零,以便下次下载  
  69.         }  
  70.     }  
  71. #endif    
  72.   
  73. #ifdef Serial_download    
  74.     //延时函数  
  75.     void delay_ms(unsigned int ms)   
  76.     {     
  77.         unsigned int i,j;    
  78.         for(i = ms;i > 0;i --)     
  79.             for(j=110;j > 0;j --);   
  80.     }  
  81.   
  82.     //初始化串口  
  83.     void Serial_Download()  
  84.     {  
  85.         EA=1;        //开总中断  
  86.         ES=1;        //允许串口中断  
  87.         TMOD=0x20;   //定时器T1,在方式3中断产生波特率  
  88.         PCON=0x00;   //SMOD=0  
  89.         SCON=0x50;     
  90.         TH1=0xfd;    //波特率设置为9600  
  91.         TL1=0xfd;  
  92.         TR1=1;       //开定时器T1运行控制位  
  93.     }  
  94.       
  95.     //串行口中断  
  96.     void Serial_int(void) interrupt 4 using 0  
  97.     {  
  98.         unsigned char com_buff;  
  99.         RI=0;  
  100.         com_buff=SBUF;  
  101.         if(com_buff==0xAB)  
  102.         {     
  103.             delay_ms(1000);   
  104.             ISP_CONTR=0X60;       //软件复位后,从ISP程序区启动  
  105.         }  
  106.     }  
  107. #endif    
  108.     //自动下载调用函数  
  109.     void Auto_Download()         
  110.     {  
  111.         #ifdef Serial_download  
  112.             Serial_Download();  
  113.         #endif  
  114.           
  115.         #ifdef ResetKey_download  
  116.             ResetKey_Download();  
  117.         #endif  
  118.     }  
  119. #endif  

你可能感兴趣的:(技巧)