📄 wxbj.c
字号:
}
if(!T1_endflag) P0_7=1;
else P0_7=0;
P2=act[m];
}
/****************************************/
void dis_adjT2_st(uchar m) //显示T3调整及设定
{
switch(m)
{case 0:{P0=SEG7[T2min_st%10];}break;
case 1:{P0=SEG7[T2min_st/10];}break;
case 2:{P0=SEG7[T2hou_st%10];}break;
case 3:{P0=SEG7[T2hou_st/10];}break;
case 4:{P0=0x00;}break;
case 5:{P0=0x00;}break;
case 6:{P0=SEG7[3];}break;
case 7:{P0=0x31;}break;
default:break;
}
if(!T2_startflag) P0_7=1;
else P0_7=0;
P2=act[m];
}
/**************************************/
void dis_adjT2_end(uchar m) //显示T4调整及设定
{
switch(m)
{case 0:{P0=SEG7[T2min_end%10];}break;
case 1:{P0=SEG7[T2min_end/10];}break;
case 2:{P0=SEG7[T2hou_end%10];}break;
case 3:{P0=SEG7[T2hou_end/10];}break;
case 4:{P0=0x00;}break;
case 5:{P0=0x00;}break;
case 6:{P0=SEG7[4];}break;
case 7:{P0=0x31;}break;
default:break;
}
if(!T2_endflag) P0_7=1;
else P0_7=0;
P2=act[m];
}
/***************************************/
void dis_adjALMtime(uchar m) // 显示报警时间调整1~59及设定
{
switch(m)
{case 0:{P0=SEG7[ALMmin%10];}break;
case 1:{P0=SEG7[ALMmin/10];}break;
case 2:{P0=0x00;}break;
case 3:{P0=0x00;}break;
case 4:{P0=0x00;}break;
case 5:{P0=0x00;}break;
case 6:{P0=0X38;}break;
case 7:{P0=0x77;}break;
default:break;
}
P0_7=1;
P2=act[m];
}
/************************************/
/*时、分、秒计时单元转换*/
void conv()
{
if(deda<=5)d_05s=0;
else d_05s=1;
if(deda>=10){sec++;deda=0;}
if(sec>=60){min++;sec=0;if(ALMstart)ALMmin--;}//若报警标志启动,则报警时间递
//减
if(ALMmin==0){ALMstart=0;rdflag=0;}// 若报警时间减为0,则关闭报警标志
if(min>=60){hou++;min=0;}
if(hou>=24){day++;hou=0;}
switch(mon)
{case 1:if(day>31){mon++;day=1;}break;// 万年历计算
case 2:if(day>28){mon++;day=1;}break;
case 3:if(day>31){mon++;day=1;}break;
case 4:if(day>30){mon++;day=1;}break;
case 5:if(day>31){mon++;day=1;}break;
case 6:if(day>30){mon++;day=1;}break;
case 7:if(day>31){mon++;day=1;}break;
case 8:if(day>31){mon++;day=1;}break;
case 9:if(day>30){mon++;day=1;}break;
case 10:if(day>31){mon++;day=1;}break;
case 11:if(day>30){mon++;day=1;}break;
case 12:if(day>31){mon++;day=1;}break;
default:break;
}
if(mon>12)mon=1;
}
/****************主程序*******************/
void main()
{ init();//初始化
while(1)// 无限循环
{
scankey();//扫描按键
reset()//看门狗复位
conv();//时间计算及转换
IO_fnc();//报警触发处理
pdT();}//判断定时输出
}
/************************/
void pdT(void)// 判断定时输出子函数
{reset()
//---------------------------------
if(T1_startflag){// 若T1标志启动
if((T1min_st==min)&&(T1hou_st==hou)) {out_P3_1=0;}// 若定时时与分到
P3_1=out_P3_1;}// 输出激活
if(T1_endflag){// 若T2标志启动
if((T1min_end==min)&&(T1hou_end==hou)) {out_P3_1=1;}// 若定时时与分到
P3_1=out_P3_1;}// 输出关闭
//---------------------------------------------
if(T2_startflag){// 若T3标志启动
if((T2min_st==min)&&(T2hou_st==hou)) {out_P1_2=0;}// 若定时时与分到
P1_2=out_P1_2;}// 输出激活
if(T2_endflag){// 若T4标志启动
if((T2min_end==min)&&(T2hou_end==hou)) {out_P1_2=1;}// 若定时时与分到
P1_2=out_P1_2;}// 输出关闭
//---------------------------------------------
if(ALMstart){if(ALMmin>0)P3_0=0;}// 启动报警喇叭
else P3_0=1;
}
/**********************************/
void scankey()//扫描按键子函数
{
if((MS==0)||(MS==10))EX0=1;else EX0=0;// 若模式为0或10,打开外中断0
if(MS<7)// 若模式小于7
{
if(!MSKEY){MS++;delay(300);if(MS==7)MS=0;}// 调整模式
if(MS==1){
if(!MONKEY){mon++;if(mon>12)mon=1;delay(300);}// 调整月
if(!DAYKEY){day++;if(day>31)day=1;delay(300);}// 调整天
if(!HOUKEY){hou++;if(hou>23)hou=0;delay(300);}// 调整时
if(!MINKEY){min++;if(min>=60)min=0;delay(300);}// 调整分
}
if(MS==2){// 调整定时T1
if(!HOUKEY){T1hou_st++;if(T1hou_st>23)T1hou_st=0;delay(300);}
if(!MINKEY){T1min_st++;if(T1min_st>=60)T1min_st=0;delay(300);}
if(!CHECKKEY){T1_startflag=!T1_startflag;delay(300);}// 启动T1
}
if(MS==3){// 调整定时T2
if(!HOUKEY){T1hou_end++;if(T1hou_end>23)T1hou_end=0;delay(300); }
if(!MINKEY){T1min_end++;if(T1min_end>=60)T1min_end=0;delay(300);}
if(!CHECKKEY){T1_endflag=!T1_endflag;delay(300);}// 启动T2
}
if(MS==4){// 调整定时T3
if(!HOUKEY){T2hou_st++;if(T2hou_st>23)T2hou_st=0;delay(300);}
if(!MINKEY){T2min_st++;if(T2min_st>=60)T2min_st=0;delay(300);}
if(!CHECKKEY){T2_startflag=!T2_startflag;delay(300);}// 启动T3
}
if(MS==5){// 调整定时T4
if(!HOUKEY){T2hou_end++;if(T2hou_end>23)T2hou_end=0;delay(300); }
if(!MINKEY){T2min_end++;if(T2min_end>=60)T2min_end=0;delay(300);}
if(!CHECKKEY){T2_endflag=!T2_endflag;delay(300);}// 启动T4
}
if(MS==6){// 调整报警时间
if(!rdflag){ALMmin=rd_24c01(6);rdflag=1;}// 若尚未从24C01中6号单元读出
//报警时间,则读一次
if(!MINKEY){delay(30);if(!MINKEY)ALMmin++;if(ALMmin>59)ALMmin=1;delay(300);}
if(!CHECKKEY){ ALMmin_iicflag=1;delay(300);}// 将调整后的报警时间再写
//入6号单元
if(ALMmin_iicflag){EA=0;P0_7=0;wr_24c01(6,ALMmin);delay_iic(250);EA=1;
delay(2000);ALMmin_iicflag=0;}else P0_7=1;
}
}
}
/**************查询报警的历史记录子函数****************/
void extern_zd0(void) interrupt 0 using 0
{EA=0;
MS=10;P0=0x00;P2=0xff;// 置模式10
if(!checkflag){iic_cnt=rd_24c01(5);delay_iic(250);
y=iic_cnt;x=y*4;checkflag=1;}
ALMadd=rd_24c01(x);delay_iic(250);
temp_day=rd_24c01(x+1);delay_iic(250);
temp_hou=rd_24c01(x+2);delay_iic(250);
temp_min=rd_24c01(x+3);delay_iic(250);
y--;
memoryoverflag=rd_24c01(7);delay_iic(250);
if(y==1){if(memoryoverflag==55)y=31;else y=iic_cnt;}
x=y*4;EA=1;delay(500);
}
/************************************************************************/
/**********以下为24C01的读写子函数*************/
/*************************************************************************/
#include <AT89X55.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P1^0;
sbit SCL=P1^1;
//sfr WDT=0xa6;
//#define reset() {WDT=0x1e;WDT=0xe1;}
bdata char com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
uchar data display_buffer[10];
void delay_iic(int n);
uchar rd_24c01(char a);
void wr_24c01(char a,char b);
//***************************
//***************************************
void start()//启动读写时序
{
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
//*****************************************
void stop()//停止操作
{
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
}
//***********************
void ack()//应答
{
SCL=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
//***********************
void shift8(char a)//8位移位输出
{
data uchar i;
com_data=a;
for(i=0;i<8;i++)
{
SDA=mos_bit;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
com_data=com_data*2;
}
}
//******************
uchar rd_24c01(char a)//读24C01A中a地址单元的数据
{
data uchar i,command;
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
start();
command=161;
shift8(command);
ack();
SDA=1;_nop_();_nop_();_nop_();_nop_();
for(i=0;i<8;i++)
{
com_data=com_data*2;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
low_bit=SDA;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
stop();
return(com_data);
}
//*****************
void wr_24c01(char a,char b)//将RAM中b地址单元的数据写入24C01A中a地址单元中
{
data uchar command;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
shift8(b);
ack();
stop();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//***************
void delay_iic(int n)// 延时
{
int i;
for(i=1;i<n;i++){reset();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -