?? p89cxx編程器控制cpu接收和控制程序1.c
字號(hào):
/*P89CXX編程器控制CPU接收和控制程序*/
#include <reg52.h>
#include <intrins.h>
unsigned char time,b_break,b_break_3;
//35.555ms
void int_t0(void) interrupt 1 {
TH0=0;
if ((++b_break_3)>2) b_break=1;
time++;
}
void wait20us(void) {
TL0=210;TH0=0xff;
time=0;
while (!time) {}
}
void wait35ms(void) {
TH0=0;time=0;
while (!time) {}
}
void wait1s(void) {
time=0;
while (time<30) {}
}
unsigned char rec(void) {
TH0=0;b_break_3=0;b_break=0;
while (RI==0) {
if (b_break) return(1);
}
RI=0;
SBUF=SBUF;
return(SBUF);
}
/*返回1表示失敗*/
bit sen(unsigned char d) {
SBUF=d;
TH0=0;b_break_3=0;b_break=0;
while (RI==0) {
if (b_break) return(1);
}
RI=0;
if (SBUF!=d) return(1);
return(0);
}
#define b_init 0
#define b_erase 1
#define b_erase_block 2 //P89C51RC+、P89C51RD+特有
#define b_erase_sbyte_bvec 3 //P89C51RC+、P89C51RD+特有
#define b_read 4
#define b_program_byte 5
#define b_program_sbyte 6 //P89C51RC+、P89C51RD+特有
#define b_program_boot_vector 7 //P89C51RC+、P89C51RD+特有
#define b_lock1 8
#define b_lock12 9
#define b_lock123 10
#define b_cpu 12 //定義需要編程的cpu類型,0:P89C51 1:P89C52 2:P89C54 3:P89C58 4:P89C51RC+ 5:P89C51RD+
sbit p_oe=P3^2;
sbit p_we=P3^3;
//輸入控制模式
void mode(unsigned char m) {
P3=(m<<4)|0xf;
}
void out_adds(unsigned int adds) {
P0=adds;
P2=adds/256;
}
unsigned char in_data(void) {
P1=0xff;
p_oe=0;
return(P1);
p_oe=1;
}
//判別cpu類型
unsigned char code un_cpu[]={0xf4,0xff,0xfb,0xf9,0x89,0x80};
unsigned char read_id(void){
unsigned char d;
mode(0xf);
//讀Mft ID
out_adds(0);d=in_data();
if (d!=0x15) return(0);
//讀Mft ID1
out_adds(1);d=in_data();
if (d!=0xc2) return(0);
//讀Mft ID2
out_adds(2);d=in_data();
return(d); //返回Mft ID2
}
//芯片初始化
bit init(void) {
unsigned char b_error=0,time_calc;
mode(0xe);
wait35ms(); //防止電腦處理不過(guò)來(lái)
p_we=0;
time=0; //等待0.5秒
time_calc=time;
while (1) {
while (time==time_calc) {}
time_calc=time;
if (sen(0xf)) return(1); //發(fā)送“正在初始化”標(biāo)志:0xf
if (time>15) break;
}
wait35ms();//test
p_we=1;
//抽樣檢查擦除是否成功
mode(0x4);
out_adds(0);if (in_data()!=0xff) b_error=1;
out_adds(1);if (in_data()!=0xff) b_error=1;
out_adds(0xff);if (in_data()!=0xff) b_error=1;
out_adds(0xfff);if (in_data()!=0xff) b_error=1;
out_adds(0x1fff);if (in_data()!=0xff) b_error=1;
sen(b_error); //跟據(jù)b_error發(fā)送
return(b_error);
}
bit program_byte(void) {
unsigned char d,n;
unsigned int adds;
do {
d=rec();
if (!b_break) {
out_adds(adds);
P1=d;
n=0;
while (1) {
mode(0x3);
p_we=0;
wait20us();
p_we=1;
mode(0x5);
if (in_data()!=d) n++; else break;
if (n>2) return(1); //編程校驗(yàn)3次失敗
}
adds++;
} else return(0); //pc通信超時(shí)或編程完成。在此不會(huì)區(qū)分,但無(wú)所謂
} while (adds);
return(1); //地址超過(guò)64k
}
bit lock123(void) {
unsigned char i,b_error=0;
unsigned int adds;
wait20us();
for (i=0;i<3;i++) {
mode(0x6);
out_adds(i);
p_we=0;
wait20us();
p_we=1;
}
//檢查前4kb是否加密成功(為了節(jié)省時(shí)間,只檢查前4kb)
mode(0x0);
for (adds=0;adds<4096;adds++) {
out_adds(adds);
if (in_data()!=0xff) {b_error=1;break;}
}
sen(b_error);
return(b_error);
}
void main(void) {
unsigned char cpu;
unsigned char i,start;
EA=1;
SCON=0xd8;PCON=0x80;
TMOD=0x21;
TL1=TH1=0xff;TR1=1;
TH0=0;ET0=TR0=1;
while (1) {
REN=1;
start=rec();
if ((!b_break)&&(start==0x0)) {
i=rec();
if (!b_break) {
switch (i) {
case b_cpu:
i=rec();
if (!b_break) cpu=i;
wait35ms(); //防止電腦處理不過(guò)來(lái)
if (un_cpu[i]!=read_id()) sen(1); else sen(0);
break;
case b_init:
if (init()) wait1s(); //初始化錯(cuò)誤或通信錯(cuò)誤等待1秒,讓pc程序超時(shí)并報(bào)告錯(cuò)誤
break;
case b_program_byte:
if (program_byte()) wait1s(); //編程錯(cuò)誤或通信錯(cuò)誤等待1秒,讓pc程序超時(shí)并報(bào)告錯(cuò)誤
break;
case b_lock123:
if (lock123()) wait1s(); //加密錯(cuò)誤或通信錯(cuò)誤等待1秒,讓pc程序超時(shí)并報(bào)告錯(cuò)誤
break;
}
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -