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