📄 dcfv1.c
字号:
/*-----------------------设计人:王兴刚--------------------*/
/*-----------------------日期:2007年1月9日----------------*/
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr CCON=0X0D8;
sfr CMOD=0X0D9;
sfr CL =0x0E9;
sfr CH =0x0F9;
sfr CCAP0L=0x0EA;
sfr CCAP1L=0x0EB;
sfr CCAP0H=0x0FA;
sfr CCAP1H=0x0FB;
sfr CCAPM0=0x0DA;
sfr CCAPM1=0x0DB;
sbit CR=0x0DE;
sfr PCA_PWM0=0X0F2;
sfr PCA_PWM1=0x0F3;
sfr isp_data=0xe2; //数据
sfr isp_addrh=0xe3; //地址高
sfr isp_addrl=0xe4; //地址低
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
uchar data receive_register[8]={0};
uchar data receive_counter;
uchar data eeprom1;
uchar data eeprom2;
uchar data eeprom;
uchar bdata tx;
sbit tx0=tx^0;
sbit tx1=tx^1;
sbit tx2=tx^2;
sbit key1=P3^2;
sbit key2=P3^3;
/*------------------------delay---------------------------*/
void delay(uint x)
{
uint i;
uchar j;
for(i=x;i>0;i--)
{
for(j=110;j>0;j--)
;
}
}
/*------------------------通信函数------------------------*/
void communicatiom(void) interrupt 4 using 1 /*serial port interrupt servise function*/
{
if(RI==1)
{
if(tx0==0)
{
receive_register[receive_counter]=SBUF;
if(receive_counter>8)
{tx0=0;}
else;
receive_counter+=1;
}
else;
RI=0;
}
else
;
}
/*-----------------*/
unsigned char eeprom_read(unsigned int addres);
void eeprom_write(unsigned int address,unsigned char wdata);
void eeprom_eares(unsigned int addres);//扇区擦除。
void eeprom_eares(unsigned int addres)//扇区擦除。
{unsigned i;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x03; //扇区命命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
/*-------------------------------------------------------*/
void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。
{unsigned char i;
isp_data=write_data; //要写入的数据。
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x02; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
unsigned char eeprom_read(unsigned int addres)
{unsigned char i,z;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x01; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
z=isp_data;
return(z);
}
/*------------------------主程序--------------------------*/
void main(void)
{
CMOD=0X02; //定时器溢出方式可以实现可调频PWM输出
CCON=0X00;
CL=CH=0x00;
CCAP0L=CCAP0H=0X0C0;
CCAP1L=CCAP1H=0X0C0;
CCAPM0=0X42;
CCAPM1=0X42;
PCA_PWM0=0X00;
PCA_PWM1=0X00;
CR=1;
eeprom1=eeprom_read(0x1200);
eeprom2=eeprom_read(0x1000);
TMOD=TMOD|0x20;
ET1=0; //现在波特率9600,待调。
TR1=1;
SCON=SCON|0x70; //d8
TH1=0x0fd;
TL1=0x0fd;
PCON=0x80;/*波特率 19200,无奇偶校验,8位数据位。80 */
ES=1;
EA=1;
CCAP0H=0;
while(1)
{
/*
CCAP0H=eeprom1;
CCAP1H=eeprom2;
*/
CCAP0H+=1;
delay(500);
CCAP1H+=1;
while(key1==0)
{
delay(200);
CCAP0H+=10;
tx1=1;
}
if(tx1==1)
{
tx1=0;
eeprom_eares(0x1000);
eeprom_write(0x1000,CCAP0H);
CCAP0H=0;
}
else;
while(key2==0)
{
CCAP1H+=10;
delay(200);
tx2=1;
}
asm mov a,#00h;
if(tx2==1)
{
eeprom_eares(0x1200);
eeprom_write(0x1200,CCAP1H);
CCAP1H=0;
tx2=0;
}
else;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -