Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17467
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2017-04-06 21:50
文章分类
文章存档

2017年(11)

我的朋友
最近访客

分类: 嵌入式

2017-04-06 21:54:44

stc单片机不断电下载程序 教程


stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序。但每次下载程序都要断电再上电,比较麻烦。

下面介绍一种不需断电就能下载程序的方法,在程序调试时比较方便。

基本原理

     stc单片机有专用的复位寄存器,通过对该寄存器写入不同的数值可以实现单片机热启动复位。
     寄存器功能如下图所示:
7777.JPG

________________________________________-
由上图可以看出只要满足某个条件,向ISP_CONTR写入0x60,就可以实现从ISP监控区软启动启动

某个条件设置为:当串口接收到0xaa数据时,单片机执行ISP_CONTR=0x60; 指令,从ISP监控区软启动启动。

演示程序如下:

//*************************STC12C5410AD软启动演示**************************
//
//收到0xaa,从ISP监控区软启动,利用该特性,可以实现stc单片机不断电下载
//收到0x55,从用户程序区启动
//2010年3月13日21:58:49
//*************************************************************************
#include
uint c;
//*************** 函数定义 ******************
void delay1ms(unsigned int j);
void senddata(uchar dc);

//*************** 主程序 ********************
void main(void)
{
  ///******************  
  TMOD|=0x20;
  SCON=0x50;
  TH1=0xfd;         //12T时钟9600bps
  TL1=0xfd;
  TR1=1;   
  ES=1;
  EA=1;
  AUXR=AUXR|0x40;   //定时器1使用1T时钟  9600*12=115200bps   
  ///******************
  delay1ms(30000);
  for(c=0;c<256;c++)
  {
    senddata(c);
delay1ms(200);  
  }
  while(1)
  {
   
  }
}

//***************************发送数据**************************
void senddata(uchar dc)
{
  SBUF=dc;
  while(!TI);      //当TI=0时,发送未结束,循环等待
  TI=0;            //当TI=1时,发送结束,用软件将TI清零
}
void uart(void) interrupt 4
{
  uchar cdd;
  if(RI)
  {
    RI=0;
cdd=SBUF;
if(cdd==0xaa)
{
   ISP_CONTR=0x60;    //软复位,从ISP监控区启动
}
else if(cdd==0x55)
{
   ISP_CONTR=0x20;   //软复位,从用户程序区启动
}
else
{
   senddata(cdd);
}              
  }
  else
  {
    TI=0;
  }
}
//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
  unsigned int i;
  for(;j>0;j--)
  { for(i=0;i<124;i++)
    {;}
  }
}
______________________________
在调试程序中加入串口初始化代码,串口中断代码即可实现不断电下载程序
///******************  
  TMOD|=0x20;
  SCON=0x50;
  TH1=0xfd;         //12T时钟9600bps
  TL1=0xfd;
  TR1=1;   
  ES=1;
  EA=1;
  AUXR=AUXR|0x40;   //定时器1使用1T时钟  9600*12=115200bps   
  ///******************

void uart(void) interrupt 4
{
  uchar cdd;
  if(RI)
  {
    RI=0;
cdd=SBUF;
if(cdd==0xaa)
{
   ISP_CONTR=0x60;    //软复位,从ISP监控区启动
}
else if(cdd==0x55)
{
   ISP_CONTR=0x20;   //软复位,从用户程序区启动
}
else
{
   senddata(cdd);
}              
  }
  else
  {
    TI=0;
  }
}
_____________
操作录像见附件:

文件:录像1.zip
大小:2028KB
下载:下载


阅读(1094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~