新买了块P89V51,用Flash magic烧了一次程序后就再也烧不进了。原以为是因为烧了是UART通信程序(pc机与单机通信,用Comdebug模拟串口),把单片机的通信口烧坏了,同学也说UART通信很容易烧单片机。后来偶然想到,是不是因为通信口复用了,即在用Flash magic烧程序是也是用了TX和RX口,因此单片机以为是在通信,程序烧不进了。因此我再用Comdebug模拟,串口还能通信,说明串口是好的。在看看是不是我的程序的原因,使串口“冲突“了。 程序说明:单片机先接收从PC发来的一个数据并在数码管高位显示,然后单片机将收到的数据回发给PC机。 #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code ledw[4]={0x07,0x0b,0x0d,0x0e};//数码管位选高位在前 uchar code ledD[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管段码 uchar rdata[4]={0x30,0x30,0x30,0x30}; /*****串行初始化函数****/ void serial_init() { TMOD=0x20; TH1=0xFD;//比特率9600 TL1=0XFD; TR1=1; EA=1; ES=1; } /***延时k毫秒***/ void delay(uint k) { uint m,n; for(m=0;m<k;m++) for(n=0;n<121;n++); } /****单片机以中断方式接收从pc传来的数据****/ void serial() interrupt 4 { RI=0; rdata[0]=SBUF; EA=0; } /******单片机以查询的方式传数据给pc*****/ void TI_FIND() { SBUF=rdata[0]; while(!TI); TI=0; EA=1; } /******数码管显示函数*******/ void display() { uchar p; for(p=0;p<4;p++){ P2=ledw[p]; if(rdata[p]>0x39) P1=ledD[(rdata[p]-0X40)+10];//显示字母 else P1=ledD[(rdata[p]-0x30)];//显示数字 delay(1); } }
void main() { serial_init(); while(1){ display(); if(EA==0) TI_FIND(); } } 在用Flash magic 时提醒Erasing block 0,并且数码管高位乱码显示,估计是单片机在接收数据并显示了(我程序设定即是受到一个字节并在数码管高位显示)。 所以现在想的办法是用什么方法能不通过UART通信口烧程序,把原先的通信程序覆盖了。 各位高手帮忙支支招…… |