#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x09e4); //选内部震荡 //1110 1101 1111 00
__CONFIG(0x18ff); //0110 0011 1111 11
//装载1年定时值 2×365×24=17520(10进制)0X4470(16进制)小时,在EEPROM的0单元填写 “0x2238”
//装载1小时定值 填写 01H,00H
__EEPROM_DATA(0x38,0x22,0x00,0x00,0x00,0x00,0x00,0x00); //初始化EEPROM的8个字节
void init(); //初始化函数 声明
void delay(uint x); //延时函数 声明
//******************
//******************
unsigned uint SSD; //闪烁灯
unsigned uchar sw1t;
unsigned uchar sw1th;
unsigned uchar DSL; //一年定时低字节
unsigned uchar DSH; //一年定时高字节
unsigned uchar A_L; //EEPROM低字节 数据变量 声明
unsigned uchar A_H; //EEPROM高字节 数据变量 声明
unsigned uint AA; //EEPROM高字节 数据变量 声明
///////////////////////////定义1位的变量
bit MIN_F;
bit fsw0A;
bit fsw1;
///////////////////////////////
void main()
{
while(1)
{
A_L=EEPROM_READ(0); //读EEPROM单元0的00字节内容,赋于A_L
A_H=EEPROM_READ(1); //读EEPROM单元0的01字节内容,赋于A_H
AA=(A_H<<8)+A_L; //EEPROM高低字节,组装成双字节变量
if(AA==0) //从左到右赋值
{
while(1)
{
CLRWDT();
RA2=0;
}
}
if(MIN_F==1) //一小时定时标志位
{
MIN_F=0; //清一小时标志位
A_L=EEPROM_READ(0); //读EEPROM单元0的00字节内容,赋于A_L
if(A_L==0) //PIC16F877A有256个字节的EEPROM
{ //有32个单元
A_H=EEPROM_READ(1); //读EEPROM单元0的01字节内容,赋于A_H
if(A_H==0) //每个单元有8个字节(00,01,02,03,04,05,06,07)
{
RA2=0;
}
else
{
A_H--;
EEPROM_WRITE(1,A_H); //A_H减一后写入EEPROM的0单元的01字节
while(EECON1bits.WR); //while语句检查是否写完,写完后自动退出
}
}
else
{
A_L--;
EEPROM_WRITE(0,A_L); //A_L减一后写入EEPROM,0单元的00字节
while(EECON1bits.WR); //while语句检查是否写完,写完后自动退出
}
//定时60分钟=60分钟*60秒+16*1000000uS/65536=55175.78125(十进制)D787(十六进制
//DS1=0x87; //16f1939只有30分钟
//DS2=0xd7;
//fsw0A=1;
}
}
}
///////////////////////////////////
///////////////////////////////////
void init() //初始化
{
ANSELA=0; // |设为数字IO口
TRISA=0x0; //0000 1000
PORTA=0x00; //0000 0100
OPTION_REG=0xc6; //1100 0110 分频比1:128 *分频器给TIMER0
EECON1=0x07; //使能读写操作
OSCCON=0x73; //选择内部震荡8M
//OSCSTAT=0;
//LATA=0;
//ANSELA=0;
//INTCON=0xe0; //启动TMR0 1110 0000
MIN_F=0;
fsw1=0;
//定时60分钟=60分钟*60秒+16*1000000uS/65536=55175.78125(十进制)D787(十六进制
//DSL=0x98; //16f1939只有30分钟
//DSH=0x00;
//fsw0A=1;
}
/////////////////////////
/////////////////////////
void interrupt com(void) //中断接收函数
{
T0IF=0; //清TMR0中断标志位
////////////////////////////闪烁灯函数
if(SSD==0)
{
SSD=0x20;
RA4^=1;
RA2^=1;
RA1^=1;
RA0^=1;
}
SSD--;
//////////////////
//////////////////
//定时60分钟=60分钟*60秒+16*1000000uS/65536=55175.78125(十进制)D787(十六进制
if(fsw0A==1)
{
DSL--;
if(DSL==0) //定时60分钟
{
DSH--;
if(DSH==0)
{
fsw0A=0;
MIN_F=1;
}
}
}
}
///////////////////////////
///////////////////////////
void delay(uint x) //延时函数
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
|