📄 51.prj
字号:
/////////////////////////////// ////////////////////////////////////////////////////////////////////
//FID=02:AT89S51系列编程器
//实现编程的读,写,擦等细节
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <iom8v.h>
#include <macros.h>
#include<signal.h>
#include<stdio.h>
#define uchar unsigned char
uchar nAddress=0;
uchar OutBuf[4];//发送命令缓冲
uchar InBuf[4];//接收缓冲
void SendInstrc(uchar nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
{
uchar n=0;
DDRB=(1<<PB5)|(1<<PB3)|(1<<PB2);
PORTB&=~BIT(PB5);
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
for (n=0;n<nByte;n++)
{
SPDR=OutBuf[n];
while (!(SPSR&(1<<SPIF)))
;
InBuf[n]=SPDR;
}
}
void InitPro02()//编程前的准备工作
{
DDRC=0x01;
PORTC=0x00;
Delay_ms(10);
PORTC=0x01;
Delay_ms(10);
nAddress=0x0000;
OutBuf[0]=0xac;//正好在这里可以安排DataSheet上所规定的
OutBuf[1]=0x53;//Eanable Programming命令
OutBuf[2]=0;
OutBuf[3]=0;
SendInstrc(4);
}
void ProOver02()//编程结束后的工作,设置合适的引脚电平
{
PORTC=0x00;
DDRB=0x00;
}
uchar ComBuf[18];
uchar Read02()
{
OutBuf[0]=0x20;
OutBuf[1]=((uchar*)&nAddress)[0];
OutBuf[2]=((uchar*)&nAddress)[1];
SendInstrc(4);
return InBuf[3];
}
void ReadSign02()//读特征字
{
InitPro02();//先设置成编程状态
//-----------------------------------------------------------------------------
//根据器件的DataSheet,设置相应的编程控制信号
OutBuf[0]=0x28;
OutBuf[1]=0x00;
OutBuf[2]=0x00;
OutBuf[3]=0x00;
SendInstrc(4);
ComBuf[2]=InBuf[3];
OutBuf[1]=0x01;
SendInstrc(4);
ComBuf[3]=InBuf[3];
OutBuf[1]=0x02;
SendInstrc(4);
ComBuf[4]=InBuf[3];
//-----------------------------------------------------------------------------
ProOver02();
}
void Erase02()//擦除器件
{
InitPro02();
//-----------------------------------------------------------------------------
//根据器件的DataSheet,设置相应的编程控制信号
OutBuf[0]=0xac;
OutBuf[1]=0x80;
SendInstrc(4);
Delay_ms(500);
//-----------------------------------------------------------------------------
ProOver02();
}
void Write02(uchar Data)
{
OutBuf[0]=0x40;
OutBuf[1]=((uchar*)&nAddress)[0];
OutBuf[2]=((uchar*)&nAddress)[1];
OutBuf[3]=Data;
SendInstrc(4);
nTimeOut=0;
while(Read02()!=Data)//效验:循环读,直到读出与写入的数相同
{
nTimeOut++;
if(nTimeOut>6000)//超时了
{
return 0;
}
return 1;
}
}
void Lock02()//写锁定位
{
//-----------------------------------------------------------------------------
//根据器件的DataSheet,设置相应的编程控制信号
if(ComBuf[2]>=1)//ComBuf[2]为锁定位
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe1;
SendInstrc(4);
Delay_ms(1);
}
if(ComBuf[2]>=2)
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe2;
SendInstrc(4);
Delay_ms(1);
}
if(ComBuf[2]==3)
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe3;
SendInstrc(4);
Delay_ms(1);
}
//-----------------------------------------------------------------------------
ProOver02();
}
/*void PreparePro02()//设置pw中的函数指针,让主程序可以调用上面的函数
{
pw.fpInitPro=InitPro02;
pw.fpReadSign=ReadSign02;
pw.fpErase=Erase02;
pw.fpWrite=Write02;
pw.fpRead=Read02;
pw.fpLock=Lock02;
pw.fpProOver=ProOver02;
}
[Compiler Options]
Edit1=D:\PROGRA~1\icc\icc\include\
Edit2=D:\PROGRA~1\icc\icc\lib\
Edit8=
CheckBox1=0
CheckBox2=1
Edit3=
Edit4=
Edit11=16
Edit13=
ComboBox1=0
Edit9=8192
Edit10=1024
ComboBox2=5
RadioGroup1=0
Edit15=
CheckBox6=0
Edit12=0x13
CheckBox7=0
CheckBox8=1
RadioGroup2=0
Edit5=
Edit6=
ComboBox3=-1
Edit14=
Edit17=
Edit7=
CheckBox3=0
Edit16=
Edit18=0x60
CheckBox4=0
RadioGroup4=4
ComboBox5=-1
ComboBox6=-1
CheckBox10=0
ComboBox8=-1
CheckBox5=1
RadioGroup5=0
ComboBox4=0
CheckBox9=0
Edit19=
Edit20=512
ChangeState=0
Edit21=0
DeviceString=ATMega8
Edit23=
CheckBox13=0
Edit24=6.31A
Edit25=
RadioGroup3=0
ComboBox10=0
ComboBox9=0
RadioGroup6=0
Edit26=5
RadioGroup7=0
CheckBox15=0
Edit27=
CheckBox17=0
CheckBox18=0
RadioGroup8=2
CheckBox11=0
Edit22=0.0x1FFFF
CheckBox12=0
CheckBox14=1
SalvoRadioGroup=6
RadioGroup9=0
SalvoPathEdit=
CheckBox16=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -