###############################main.c#############################
#include <intrins.h>
#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拷贝到自定义下载中。
|