📄 test.c
字号:
//库文件
#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];
//检测串行通信是否正常
//通信超时
//错误
;
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
//循环判断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
TL2=RCAP2L;
TR2=1;
}
//串口通信检测
void RecDataCheck(void)
{
uint delay;
RI=0;
TimerOut=0;
// 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
TR0=1; //打开定时器T0中断,从Idle模式唤醒MCU
PCON=0x01; // enter idle mode
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -