?? 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 + -