📄 test.c.svn-base
字号:
//库文件
#include <stdio.h>
#include "W78E516B.H" //本地目录中,W78E516B头文件
#include "APROM.H" //本地目录中,自定义头文件
//定时中断0
void Timer0 (void) interrupt 1 using 1
{
TR0=0; //关中断
TF0=0;
}
//串口处理程序
void Serial(void) interrupt 4 using 3
{
uint i,j,CodeTemp; //CodeTemp为指令临时变量,i为Index,j为串口数据
//未接收到数据
if(RI==0)
{
TI=0;
}
//接收到数据,做判断
else
{
JmpLDROM=1;
i=0; //i从0~8,目前上位机使用9个字符作为升级指令SYNTEC001
while(1)
{
j=SBUF; //接收串口数据
CodeTemp=UpdateCommandCode[i];
//不是升级指令
if(j!=CodeTemp)
{
JmpLDROM=0;
goto ERROR; //不是升级指令出口
}
//判断Index是否为最后一个字符,即判断完毕
while(i==UpdateCommandCodeTotalNumber)//i=8
{
goto OK; //通信正常,并且接收完毕,并且为升级指令出口
}
RecDataCheck(); //检测串行通信是否正常
//通信超时
if(TimerOut==1)
{
JmpLDROM=0;
goto ERROR; //通信错误出口
}
i++;
}
}
OK: //成功
;
ERROR: //错误
;
RI=0;
TR0=0;
}
//主程序
void main(void)
{
int i,k; //i为Index,8ms的循环使用,k为查询串口次数index,
k=0;
InitialProgram(); //初始化程序
JmpLDROM=0; //跳转LDROM状态位,1跳转,0不跳转
while(1)
{
if(JmpLDROM==1) //跳转 LDROM状态位为1
{
ES=0; //关串口
ChangeAPtoLD(); //跳转LDROM
}
for(i=0;i<8000;i++); //8ms循环判断一次JmpLDROM
{
;
}
k++;
if(k==25) //循环判断25次后如果还是不能接收正确并跳转LDROM,则说明不用升级直接执行用户应用程序,根据需要可以修改
{
goto UserApplication;
}
}
//用户应用程序
UserApplication:
P2 = 0xaa; //测试进入用户程序
; //
}
//初始化程序
void InitialProgram(void)
{
IE=0x00;
ET0=1; // timer0 interrupt enable
ES=1; // RS-232 interrupt enable
EA=1; // all interrupt enable
// Timer2BaudRate();
SCON=0x50; // mode=mode1 ,ren=enable
T2CON=0x30; // Timer2=BaudRate CLK
RCAP2H = 0xff; //Fosc = 11.0592M
RCAP2L = 0xdc; //BaudRate = 9600
TH2=RCAP2H;
TL2=RCAP2L;
TR2=1;
}
//串口通信检测
void RecDataCheck(void)
{
uint delay;
RI=0;
TimerOut=0;
TMOD=0x11; //工作方式1,16位定时器
TR0=1;
for(delay=50; delay>0; delay--) //50*1ms=50ms
{ //11.0592M
TH0 = 0xfc; // th0=(65536-(1000*(Fosc/12000000)))/256, delay x 1ms
TL0 = 0x66; // tl0=65536-(1000*(Fosc/12000000)), delay x 1ms
for(TF0=0; TF0==0; ) //处理定时器未溢出时,判断接收位
{
while(RI==1) //正常
{
goto OK ;
}
}
}
TimerOut=1; //通信超时
OK: ; //通信正常
}
//APROM 跳转 LDROM ,即ISP模式
void ChangeAPtoLD(void)
{
//单片机重启,软复位
CHPENR=0x87; // write enable
CHPENR=0x59; // write enable
CHPCON=0x03; // bank=4k,flash mode
TL0=0xfe;
TH0=0xff;
TR0=1; //打开定时器T0中断,从Idle模式唤醒MCU
PCON=0x01; // enter idle mode
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -