#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0xFF32);
uint initnum; //定义一个溢出中断的变量
uchar receive;
uchar SJ; //eeprom数据
bit flag;
bit flag_write;
//-------------------------------------------------------
//延时子程序
void delay(uint dat)
{
unsigned int k;
for(k=0;k<dat;k++);
}
//--------------------------------------------------------------------------------
void init()
{
ADCON0=0X00;
ADCON1=0X06; //PORTA口设置为I/O口
CMCON=0x07; //比较器关闭,RA0-RA3为IO
CVRCON=0x00; //比较器电源关闭
TRISA=0X00;
TRISB=0x00;
TRISC=0XCF; //串口用时 RC7/RC6必须是输入
TRISD=0X00;
TRISE=0X00;
PORTA=0X3F;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
PORTE=0X07;
INTCON=0xc0; //设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
PIE1=0x01; //使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
TMR1L=(65536-50000)%256; //装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
TMR1H=(65536-50000)/256; //又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
T1CON=0x01; //00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
flag=0;
SJ=0xFF;
flag_write=0;
SPBRG=71; //设置波特率为9600BPS
TXSTA=0X24; //使能串口发送,选择高速波特率 //0010 0100
RCSTA=0X90; //使能串口工作,连续接收 //1001 0000
RCIE=1; //使能接收中断 //0000 0001
RC5=0;
receive=0xff;
}
//---------------------写EEPROM-------------------------------------------------
void WRITEEE(uchar EEadd,uchar EEdata)
{
while(WR); //等待写完成
EEADR=EEadd; //写入地址信息
EEDATA=EEdata; //写入数据信息
EEPGD=0; //操作数据EEPROM
GIE=0;
WREN=1; //写EEPROM允许
EECON2=0x55; //写入特定时序
EECON2=0xaa;
WR=1; //执行写操作
while(WR); //等待写完成
WREN=0; //禁止写入EEPROM
GIE=1;
}
//---------------------读写EEPROM-------------------------------------------------
uchar READEE(uchar EEadd)
{
uchar vaule;
while(RD); //等待读完成
EEADR=EEadd; //写入要读的址址
EEPGD=0; //操作EEPROM
RD=1; //执行读操作
while(RD); //等待读完成
vaule=EEDATA;
return vaule; //返回读取的数据
}
//------------------------------------------------------------------------------
void interrupt time1() //定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{
if(TMR1IF)
{
TMR1IF=0; //先清零,同时知道是用TMR1定时器
TMR1L=(65536-50000)%256; //也要重新装一次初值,从这个初值的基础上加
TMR1H=(65536-50000)/256;
initnum++; //加一
if(initnum==60) //它每50ms产生溢出中断,20次则是一秒
{
initnum=0; //到了1s后清零
flag=1; //取反,再到第二次溢出又取反电平
}
}
if(RCIE&&RCIF) //判断是否为串口接收中断
{
RCIF=0;
receive=RCREG; //接收数据并存储
flag_write=1;
RC5=1;
TXREG=receive;
while(!TRMT);
RC5=0;
}
}
//-------------------------------------------------------------------------------
void main()
{
init();
SJ=READEE(0);
RC4=0;
delay(10000);
RC4=1;
while(1)
{
PORTB=SJ;
if(flag_write==1)
{
flag_write=0;
WRITEEE(0,receive);
// SJ=READEE(0);
RC4=0;
delay(10000);
RC4=1;
}
if(flag==1)
{
flag=0;
PORTA=~PORTA;
// PORTB=~PORTB;
PORTD=~PORTD;
}
}
}
以上是程序,PIC初学者,当串口发送数据后,写入EEPROM后,马上读可以读到,但停电后,数据就没有了,什么问题,请大侠们指点!注释有问题 不理会! |