×
单片机 > 单片机程序设计 > 详情

STC单片机不重新加电烧写方法

发布时间:2020-12-29 发布时间:
|

###############################main.c#############################
#include
#include "myreg.h"
#include "uart.h"
#include "tool.h"

void RdUART();
void main(void)
{
        volatile unsigned long CNT = 0;
        UCHAR I=0;
        UART_init(38400,RdUART);
        UART_open();
        while(1)
        {
                while(CNT<10000)
                {
                        CNT++;//约1秒1次
                }
                CNT = 0;
                I = I + 45;
        //        I = I;
                P2        = I;
        }
}

void RdUART()
{
        // 拷到ISP软件中  0 1 2 3 4 5 6 7 8 9 A B C D E F 10

        static UCHAR i        = 0;
        UCHAR Rd;
        UART_get(&Rd);
        P2 = Rd;
        UART_send(Rd);
        if(Rd == i)
        {
                i++;
        }
        else
        {
                i=0;
        }

        if(i>16)
        {
                UART_close();
                delay();
                P2        = 0xAA;
                delay();
                P2        = 0x55;
                soft_reset_to_ISP_Monitor();
                i        = 0;
        }
}

###############################uart.h#############################
#ifndef _UART_H_
#define _UART_H_

#include "myreg.h"

// 波特率可设的中断型发送接收

typedef struct
{
        UCHAR        isBusy;
        UCHAR        RxCnt;
        UCHAR        RxD;
        void        (*Fun)();
}LocUART;

extern void UART_init(USHORT Rate, void (*pFun)());
extern void UART_open();
extern void UART_close();
extern UCHAR UART_isBusy();
extern void UART_send(UCHAR D);
extern UCHAR UART_get(UCHAR *D);
extern void UART_Interrupt_Receive(void);





#endif


##########################uart.c######################################

#include "uart.h"
#include "myreg.h"

LocUART LocUSta;
void UART_init(USHORT Rate, void (*pFun)())
{
        // SCON = SM0/FE SM1 SM2 REN TB8 RB8 TI RI
        
        USHORT SetVal        = 0;
        SetVal        = 65536 - (SYSFREQ / Rate / 32);
        UART_close();
        SM0        = 0;
        SM1        = 1;
        SM2        = 0;
        RCAP2H        = SetVal>>8;
        RCAP2L        = SetVal & 0x00FF;
        RCLK        = 1;
        TCLK        = 1;
        EXEN2        = 1;
        C_T2        = 0;
        LocUSta.isBusy        = 0;
        LocUSta.Fun                = pFun;
//        DECN        = 0;        
//        T2OE        = 1;        //定时器2输出
}
void UART_open()
{
        TI        = 0;        //接收标志位清空
        RI        = 0;        //发送标志位清空
        REN        = 1;        //允许串口接收
        ES        = 1;        //打开串口中断
        EA        = 1;        //使能全局中断
        TR2        = 1;        //定时器2开始运行
}
void UART_close()
{
        TR2        = 0;        //定时器2停止
        REN        = 0;        //禁止串口接收
        ES        = 0;        //禁止中断
}

UCHAR UART_isBusy()
{
        return LocUSta.isBusy;
}

void UART_send(UCHAR D)
{
        SBUF                        = D;
        LocUSta.isBusy        = 1;
}

UCHAR UART_get(UCHAR *D)
{
        *D        = LocUSta.RxD;
        return LocUSta.RxCnt;
}

void UART_Interrupt_Receive(void) interrupt 4 using 1
{
        if(TI)
        {
                LocUSta.isBusy        = 0;
                TI        = 0;
        }
        if(RI)
        {        
                LocUSta.RxD        = SBUF;
                LocUSta.RxCnt++;
                RI = 0;
                if(LocUSta.Fun)
                {
                        LocUSta.Fun();
                }
        }
}

##########################################myreg.h########################
/*--------------------------------------------------------------------------
REG52.H

Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/


/*
Data Type                 Bits         Bytes         Value Range
bit                                1                                 0 to 1
signed char         8                 1                 -128 to +127
unsigned char         8                 1                 0 to 255
enum                         16                 2                 -32768 to +32767
signed short         16                 2                 -32768 to +32767
unsigned short         16                 2                 0 to 65535
signed int                 16                 2                 -32768 to +32767
unsigned int         16                 2                 0 to 65535
signed long         32                 4                 -2,147,483,648 to +2,147,483,647
unsigned long         32                 4                 0 to 4,294,967,295
float                         32                 4                 ±1.175494E-38 to ±3.402823E+38
sbit                         1                                 0 to 1
sfr                         8                 1                 0 to 255
sfr16                         16                 2                 0 to 65535
*/


#ifndef _MYREG_H_
#define _MYREG_H_

// redefine
typedef signed char         SCHAR;        //8
typedef unsigned char         UCHAR;        //8
typedef unsigned short        USHORT;        //16

// system parameter
#define SYSFREQ        (22118400)


/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;


/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr T2MOD  = 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;

sfr IAP_CONTR        = 0xE7;
/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX  = P1^1; // 8052 only
sbit T2    = P1^0; // 8052 only

/*  T2CON  */
sbit TF2    = T2CON^7;
sbit EXF2   = T2CON^6;
sbit RCLK   = T2CON^5;
sbit TCLK   = T2CON^4;
sbit EXEN2  = T2CON^3;
sbit TR2    = T2CON^2;
sbit C_T2   = T2CON^1;
sbit CP_RL2 = T2CON^0;

/* T2MOD */
//sbit T2OE        = T2MOD^1;
//sbit DECN        = T2MOD^0;

#endif

###########################tool.h#####################################
#ifndef _TOOL_H_
#define _TOOL_H_

extern void delay();
extern void soft_reset_to_ISP_Monitor();

#endif
##############################tool.c#################################
#include "tool.h"
#include "myreg.h"
void delay()
{
        volatile unsigned long CNT = 0;
        while(10000>CNT++);
}


void soft_reset_to_ISP_Monitor(void)
{
        IAP_CONTR = 0x60; //0110,0000 soft reset system to run ISP monitor
}


以上是个例子,利用STC_ISP_V483是可以的,其他版本未证实
无法上传照片
记得把0 1 2 3 4 5 6 7 8 9 A B C D E F 10拷贝到自定义下载中。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多