|
#i nclude <reg51.h> #define inbuf_len 4 //數(shù)據(jù)長度 #define anbuf_len 2 sbit cs=p3^4; sbit sk=p3^3; sbit di=p3^5; sbit do=p3^6; void delay(void); unsigned char inbuf1[inbuf_len],anbuf[anbuf_len]; unsigned char checksum,count3,count2; bit read_flag=0,flag=0; void init_serialcomm(void) { tmod=0x21;//設(shè)置定時器1的工作方式與初值,9600kb/s th0=0xf8; tl0=0xcd;//` // tr0=1; // et0=1; th1=0xfd; tl1=0xfd; scon=0x50; pcon=0x00; tr1=1; es=1;//打開串口中斷。 ea=1; } //向串口發(fā)送一個字符 void send_char_com(unsigned char ch) { sbuf=ch; while(ti==0); ti=0; } //向串口發(fā)送一個字符串,strlen為該字符串長度 void send_string_com(unsigned char *str,unsigned int strlen) { unsigned int k=0; do { send_char_com(*(str + k)); k++; } while(k < strlen); } //串口接收中斷函數(shù) void serial () interrupt 4 using 3 { if(ri) { unsigned char ch; ri = 0; ch=sbuf; if(ch>97) { anbuf[count2]=ch; count2++; if(count2==anbuf_len) { flag=1; //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個,且校驗(yàn)沒錯, count2=0; //就置位取數(shù)標(biāo)志 } } else { inbuf1[count3]=ch; checksum ^= ch; count3++; if(count3==inbuf_len) { read_flag=1; //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個,且校驗(yàn)沒錯, count3=0; //就置位取數(shù)標(biāo)志 } } } } /* extern unsigned char readchar(unsigned char address); extern void writechar(unsigned char address,unsigned char indata); extern void readstring(unsigned char data *ramaddress,unsigned char romaddress,unsigned char number); extern void writestring(unsigned char data *ramaddress,unsigned char romaddress,unsigned char number); */
// write enable must precede all programming modes. void ewen(void) { unsigned char temp,indata; cs=0; sk=0; cs=1; indata=0x98; // 10011xxxx for(temp=9;temp!=0;temp--) { // 9 di=indata&0x80; sk=1; sk=0; indata<<=1; } cs=0; } // disables all programming instructions. void ewds(void) { unsigned char temp,indata; cs=0; sk=0; cs=1; indata=0x80; // 10000xxxx for(temp=9;temp!=0;temp--) { // 9 di=indata&0x80; sk=1; sk=0; indata<<=1; } cs=0; } // reads data stored in memory, at specified address. unsigned int read(unsigned char address) { unsigned char temp; unsigned int result; ewen(); sk=0; di=1; // 110 a5-a0 cs=0; cs=1; sk=1; sk=0; // 1 address=address&0x3f|0x80; for(temp=8;temp!=0;temp--) { // 8 di=address&0x80; sk=1; sk=0; address<<=1; } do=1; for(temp=16;temp!=0;temp--) { // 16 sk=1; result=(result<<1)|do; sk=0; } cs=0; ewds(); return(result); } // writes memory location an - a0. void write(unsigned char address,unsigned int indata) { unsigned char temp; ewen(); sk=0; di=1; // 101 a5-a0 cs=0; cs=1; sk=1; sk=0; // 1 address=address&0x3f|0x40; for(temp=8;temp!=0;temp--) { // 8 di=address&0x80; sk=1; sk=0; address<<=1; } for(temp=16;temp!=0;temp--) { // 16 di=indata&0x8000; sk=1; sk=0; indata<<=1; } cs=0; do=1; cs=1; sk=1; while(do==0) { // busy test sk=0; sk=1; } sk=0; cs=0; ewds(); } unsigned char readchar(unsigned char address) { unsigned char temp=address>>1; if(address&0x01) return((unsigned char)(read(temp)>>8)); else return((unsigned char)(read(temp))); }
void writechar(unsigned char address,unsigned char indata) { unsigned char temp=address>>1; if(address&0x01) write(temp,(unsigned int)(read(temp)&0x00ff|(indata<<8))); else write(temp,(unsigned int)(read(temp)&0xff00|indata)); } void readstring(unsigned char data *ramaddress,unsigned char romaddress,unsigned char number) { while(number!=0) { *ramaddress=readchar(romaddress); ramaddress++; romaddress++; number--; } } void writestring(unsigned char data *ramaddress,unsigned char romaddress,unsigned char number) { //*ramaddress 要寫入93c46的值的地址 unsigned int temp; //romaddress 93c46的地址 if(number==0) return; // number 數(shù)據(jù)長度 if(romaddress&0x01) { writechar(romaddress,*ramaddress); ramaddress++; romaddress++; number--; } if(number==0) return; while(number>>1) { temp=*ramaddress; ramaddress++; temp=temp|(*ramaddress)<<8; ramaddress++; write(romaddress>>1,temp); romaddress++; romaddress++; number--; number--; } if(number) writechar(romaddress,*ramaddress); } void main() { unsigned char data ramaddress[3]={1,9,0x12}; unsigned char romaddress; unsigned char number; init_serialcomm(); romaddress=0x20; number=0x03; writestring(ramaddress,romaddress,number); while(1) { if(flag) { // romaddress=0x20; // number=0x03; readstring(ramaddress,romaddress,number); send_string_com(ramaddress,3); flag=0; } } }
|