本帖最后由 STC89C51 于 2023-10-29 17:30 编辑
.
频率计 89C52
.....................................................................................
/*
P1->address low ADL P2=1,PBYTE[0]
P2->address High ADH P2=2,PBYTE[0]
Pmod P2=4 PBYTE[0]
PROG-> Pmod0
P3.6-> Pmod1
P3.6-> Pmod2
VPP->P3_2
READY->P3_7
*/
#define VPP(x) P3_2=!x
#include <mcs51/at89x52.h>
#include <mcs51/BitMem.h>
typedef union {
unsigned char c;
struct {
unsigned char d0:1;
unsigned char d1:1;
unsigned char d2:1;
unsigned char d3:1;
unsigned char d4:1;
unsigned char d5:1;
unsigned char d6:1;
unsigned char d7:1;
};
} BITCH;
BITCH ADL,ADH,Pmod;
//BITCHAR(ADL,13)
//BITCHAR(ADH,14)
//BITCHAR(Pmod,8)
void d10us(){unsigned char c=10;while(--c);}
void d10ms(){unsigned char c=250;while(--c)d10us();c=120;while(--c)d10us();}
void d100ms(){unsigned char c=10;while(--c)d10ms();}
void initsio()
{
T2CON=0x34;
RCAP2L=0xfa;
RCAP2H=0xff;
SCON=0x5A;
TR2=1;
ES=0;
EA=0;
}
char getch(){
while(!RI);
RI=0;
return SBUF;
}
void putchar(char c){
TI=0;
SBUF=c;
while(!TI);
}
void prog(){
Pmod.d0=0;
P2=4;
PBYTE[0]=Pmod.c;
d10us();
Pmod.d0=1;
PBYTE[0]=Pmod.c;
}
void mode(__bit a, __bit c,__bit d){
ADH.d6=a;
P2=2;
PBYTE[0]=ADH.c;
Pmod.d1=c;
Pmod.d2=d;
P2=4;
PBYTE[0]=Pmod.c;
}
void enable(__bit c){
ADH.d7=c;
P2=2;
PBYTE[0]=ADH.c;
}
void erase(){
mode(1,0,0);
enable(0);
VPP(1);
d10us();
P2=4;
Pmod.d0=0;
PBYTE[0]=Pmod.c;
d10ms();
Pmod.d0=1;
PBYTE[0]=Pmod.c;
d10us();
VPP(0);
enable(1);
mode(0,1,1);
}
void addr(unsigned int a){
ADL.c=a&0xff;
ADH.c=ADH.c&0xe0|(a>>8)&0x1f;
P2=1;
PBYTE[0]=ADL.c;
P2=2;
PBYTE[0]=ADH.c;
}
char read(unsigned int a){
char c;
P1=0xff;
enable(1);
addr(a);
enable(0);
c=P1;
enable(1);
Pmod.d5=1; //2051 XTAL1
P2=4;
PBYTE[0]=Pmod.c;
Pmod.d5=0; //2051 XTAL1
PBYTE[0]=Pmod.c;
return c;
}
void power(__bit c){
Pmod.d0=1;
Pmod.d3=1; //2051 RST
Pmod.d5=0; //2051 XTAL1
P2=4;
PBYTE[0]=Pmod.c;
d10ms();
VPP(0);
P3_3=!c;
d10ms();
Pmod.d3=0;
PBYTE[0]=Pmod.c;
}
/*void readSig(){
mode(0,0,0);
printf("%b02XH,%b02XH,%b02XH\n",read(0x30),read(0x31),read(0x32));
printf("%b02XH,%b02XH,%b02XH\n",read(0xa),read(0xb),read(0xc));
mode(0,1,1);
}*/
char write(int a,char ch){
enable(1);
addr(a);
P1=ch;
VPP(1);
d10us();
prog();
d10us();
VPP(0);
while(!P3_7);
return read(a);
}
__code char hexChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void putByteHex(char c){
putchar(hexChar[(c>>4)&0xf]);
putchar(hexChar[c&0xf]);
}
void putWordHex(unsigned int i){
char c=4,k;
while(c--){
k=i>>12;
putchar(hexChar[k]);
i<<=4;
}
}
void putstr(const char *s){
while(*s){putchar(*s++);}
}
char menu(){
char c;
mode(0,0,0);
while(1){
power(1);d10ms();
putstr("\n\n\tAT89C(20)51/52 Programmer\n"
"\t Chip ID: ");putByteHex(read(0x30));putstr("H,");
putByteHex(read(0x31));putstr("H,");
putByteHex(read(0x32));
putstr("H\n"
"\t1.Erase chip.\n"
"\t2.Write 1K data(1051) from 1000H.\n"
"\t3.Write 2K data(2051) from 1000H.\n"
"\t4.Write 4K data(51/4051) from 1000H.\n"
"\t5.Write 8K data(52) from 1000H.\n"
"\t6.Read 1K data.\n"
"\t7.Read 2K data.\n"
"\t8.Read 4K data.\n"
"\t9.Read 8K data.\n"
"\n"
"\t Choice[1-9]:");
power(0);
c=getch();
putchar(c);
if(c>='1'&&c<='9'){
mode(0,1,1);
return c;
}
}
}
void readData(unsigned int len){
unsigned int i;
power(1);d10ms();
for(i=0;i<len;i++){
if(i%16==0){
putchar('\n');putWordHex(i);putstr("H:");
}
putchar(' ');putByteHex(read(i));
}
power(0);
putstr("\nPress any key to continue.");
getch();
}
void writeData(int len){
int i;
char c,d;
putstr("\nThe chip will be written, (c)ancel?");
if(getch()=='c')return;
putstr("\nWriting...\n");
power(1);d100ms();
for(i=0;i<len;i++){
if(i%16==0){
putchar('\n');
putWordHex(i);
putstr("H: ");
}
c=CBYTE[0x1000+i];
d=write(i,c);
if(c==d){
putByteHex(d);
putchar(' ');
}else{
putstr("\nError! ");
putWordHex(i);putstr("H: ");
putByteHex(c);putstr("->");
putByteHex(d);
break;
}
}
d100ms();
power(0);
putstr("\nPress any key to continue.");getch();
}
void main(void)
{
power(0);
ADH.c=ADL.c=0;
initsio();
TI=1;
while(1){
switch(menu()){
case '1':
putstr("\nThe chip will be erased,are you sure(Y/N)?");
if(getch()=='Y'){
putstr("\nErasing...");
power(1);
d100ms();
erase();
power(0);
putstr("\nErased.\nPress any key to continue.");
getch();
}
break;
case '2':
writeData(0x400);
break;
case '3':
writeData(0x800);
break;
case '4':
writeData(0x1000);
break;
case '5':
writeData(0x2000);
break;
case '6':
readData(0x400);
break;
case '7':
readData(0x800);
break;
case '8':
readData(0x1000);
break;
case '9':
readData(0x2000);
break;
}
}
}
复制代码
..............................................................................................................
.