📄 51.c
字号:
#include <reg52.h> /*头文件的包含*/
#include "IIC.h"
#include "display.h"
#include "define.h"
#define PCF8583 0xa0 /*10100000--A0 write*/
#define PCF8583_Ctr 0x00/*control register*/
#define Sen 0x02
#define Min 0x03
#define Hour 0x04
char sen,min,hour; /*需要用到-1,不用uchar*/
uchar flag; /*进入设置时钟标志*/
uchar wflag; /*故障标志 0-正常*/
uchar id; /*故障发生点 1-8*/
uchar point; /*记录EEPROM的当前页的目前的地址*/
uchar recvflag; /*接收到串口信息标志*/
uchar EEP;
/*s1为进入和退出设置键,s2为+键,s3为-键,s4为循环键*/
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
sbit s4=P3^5;
sbit s5=P1^0;
sbit s6=P1^1;
sbit s7=P1^2;
sbit s8=P1^3;
sbit s9=P1^4;
sbit s10=P1^5;
sbit s11=P1^5;
sbit s12=P1^6;
/*
对时间进行设置
*/
void keyscan()
{
uchar roll=0; /*roll=0表示设置秒;roll=1表示设置分;roll=2表示设置时*/
//rd=0;
if(s1==0)
{
delay_ms(5); /*消抖*/
if(s1==0) /*确定键已经按下*/
{
flag=!flag; /* 1 标志进入时间设置状态*/
while(!s1); /*等待按键松开*/
if(1==flag)
{
roll=0;
light(roll); /*显示在秒设置处*/
}
else if(0==flag) /*退出时间设置状态*/
{
ISendByte(PCF8583,Sen,sen);
ISendByte(PCF8583,Min,min);
ISendByte(PCF8583,Hour,hour); /*写入新的时间到8583*/
light(4); /*全熄灭*/
}
}
}
if(flag==1) /*在设置状态下*/
{
if(s4==0) /*进入选择设置位,选择要设置的单位*/
{
delay_ms(5); /*消抖*/
if(s4==0) /*确定键已经按下*/
{
while(!s4); /*等待按键松开*/
roll++;
if(roll==3) roll=0; /*循环*/
light(roll);
}
}
if(s2==0) /*进入+状态*/
{
delay_ms(5); /*消抖*/
if(s2==0) /*确定键已经按下*/
{
while(!s2); /*等待按键松开*/
if(roll==0) /*设置秒*/
{
sen++;
if(sen==60) sen=0;
}
if(roll==1) /*设置分*/
{
min++;
if(min==60) min=0;
}
if(roll==2) /*设置时*/
{
hour++;
if(hour==24) hour=0;
}
}
}
if(s3==0) /*进入-状态*/
{
delay_ms(5); /*消抖*/
if(s3==0) /*确定键已经按下*/
{
while(!s3); /*等待按键松开*/
if(roll==0) /*设置秒*/
{
sen--;
if(sen==-1) sen=59;
}
if(roll==1) /*设置分*/
{
min--;
if(min==-1) min=59;
}
if(roll==2) /*设置时*/
{
hour--;
if(hour==-1) hour=23;
}
}
}
}
}
/*
将发生故障的时间、故障点、修复的时间写入EEPROM,记录100个故障
键按下代表发生故障,记录发生故障的时间; 写入顺序 id->sen->min->hour
键松开代表修复故障,记录修复故障的时间。
*/
void save()
{
/*为了避免代码重复,这里只给了S5发生故障的代码,s6,s7,s8,s9,s10,s11,s12类似*/
/*10101 A1 A0 0 确定页地址
00000 0 0 0 - 0页 0
00000 0 1 0 - 1页 2
00000 1 0 0 - 2页 4
00000 1 1 0 - 3页 6
*/
EEP=0xa8; /*10101000--A8 write A2,A1是页*/
if(s5==0) /*故障*/
{
delay_ms(5); /*消抖*/
if(s5==0) /*确定键已经按下 开始写入故障的时间*/
{
wflag=1; //故障标志置位
id=1;
ISendByte(EEP,point,id);
point++;
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,sen);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,min);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,hour);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
while(!s5); /*等待按键松开 开始写入回复故障的时间*/
wflag=0; //故障清除
id=1;
ISendByte(EEP,point,id);
point++;
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,sen);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,min);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
ISendByte(EEP,point,hour);
if(0xFF==point-1)
{
point=0x00; /*页内指针复位*/
EEP=EEP+2 ; /*加一页*/
}
}
}
}
void serial()
{
if(recvflag==1)
{
ES=0; //关串行中断
recvflag=0;
if(wflag==1)
{
SBUF=id;
while(!TI); //确定发送完毕
TI=0;
}
else if(wflag==0)
{
SBUF='o';
while(!TI); //确定发送完毕
TI=0;
SBUF='k';
while(!TI); //确定发送完毕
TI=0;
}
ES=1;
}
}
void main()
{
ISendByte(PCF8583,PCF8583_Ctr,0x00); /*reset*/
/*************************************************************************
NOTE: 向分0x03,向秒0x02写入0 ,向hour0x04写入0x00;
*************************************************************************/
ISendByte(PCF8583,Sen,0x00);
ISendByte(PCF8583,Min,0x00);
ISendByte(PCF8583,Hour,0x00); /*写入00 00000000 bit7,bit6=0->24小时制*/
/*设置定时器0,50ms中断,用于LED的动态显示*/
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
/*串口中断设置*/
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd; //9600bps
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1; //开串口中断
while(1)
{
keyscan();
save();
serial();
if(0==flag)
{
sen=IRcvByte(PCF8583,Sen);
min=IRcvByte(PCF8583,Min);
hour=IRcvByte(PCF8583,Hour);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
display(1,2,hour);
display_(3);
display(4,5,min);
display_(6);
display(7,8,sen);
}
void ser() interrupt 4
{
uchar a;
RI=0; //RI清零
a=SBUF;
if(a==0xaa) recvflag=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -