- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-01-17 10:51:10
已绑定手机
新手上路
- 积分
- 11
|
#include "all.h"
#define LVDF 0x20 //PCON.5,低压检测中断标志位
bit AT24c02_flag_W=0;
bit AT24c02_flag_R=0;
uint t_data=0;
volatile uchar anjiangzhuantai_flag=0;//按键状态标志
void Timer0_Isr(void) interrupt 1//定时0 中断
{
t_data++;
if(t_data>999)
{
P02=~P02;
t_data=0;
aa++;
if(aa>59)
{
aa=0;
time++;
}
}
}
void Timer0_Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
}
void INT0_Init(void) //1毫秒@11.0592MHz
{
IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中断
EA = 1;
}
void INT1_Init(void) //1毫秒@11.0592MHz
{
IT1 = 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1 = 1; //使能INT1中断
EA = 1;
}
void INT2_Init(void) //1毫秒@11.0592MHz
{
INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中断
EA = 1;
}
void INT3_Init(void) //1毫秒@11.0592MHz
{
INT_CLKO |= 0x20; //(EX3 = 1)使能INT3中断
EA = 1;
}
void exint3() interrupt 11 //INT3中断入口
{
anjiangzhuantai_flag=0;
}
void exint2() interrupt 10 //INT2中断入口, 显示数据--
{
if(anjiangzhuantai_flag==1)
{
if(dingshi3<1)
{
dingshi3=0;
}
else
{
dingshi3--;
}
}
if(anjiangzhuantai_flag==2)
{
if(dingshi2<1)
{
dingshi2=0;
}
else
{
dingshi2--;
}
}
if(anjiangzhuantai_flag==3)
{
if(dingshi1<1)
{
dingshi1=0;
}
else
{
dingshi1--;
}
}
if(anjiangzhuantai_flag==4)
{
if(dingshi0<1)
{
dingshi0=0;
}
else
{
dingshi0--;
}
}
}
void LVD_ISR() interrupt 6 //低压中断函数, 当单片机发生断电的情况下对数据进行保存处理, 中断主函数运行
{
PCON &= ~LVDF; //向PCON.5写0清LVD中断
AT24c02_flag_W=1;
write24c02(0,aa);//将显示数据分别存到那24c02中
// write24c02(1,TmData);//将显示数据分别存到那24c02中
write24c02(2,time);//将显示数据分别存到那24c02中
// AT24C02Write(1,num1); //存贮当前数值
// AT24C02Write(2,num2); //存贮当前数值
P2M0 = 0x00; //将tm1620通讯端口设置为高阻, 关掉数码管,省电,延长24c02保存数据时间
P2M1 = 0xff; //将tm1620通讯端口设置为高阻, 关掉数码管,省电,延长24c02保存数据时间
AT24c02_flag_W=0;
}
void exint0() interrupt 0 //INT0中断入口,控制数码管闪烁
{
anjiangzhuantai_flag++;
if(anjiangzhuantai_flag>4)
{
anjiangzhuantai_flag=0;
}
}
void anzhuangtaipanduan()
{
if(anjiangzhuantai_flag==0)
{
display4();
}
if(anjiangzhuantai_flag==1)
{
display0();
}
if(anjiangzhuantai_flag==2)
{
display1();
}
if(anjiangzhuantai_flag==3)
{
display2();
}
if(anjiangzhuantai_flag==4)
{
display3();
}
}
void exint1() interrupt 2 //INT1中断入口,显示数据++
{
if(anjiangzhuantai_flag==1)
{
dingshi3++;
if(dingshi3>9)
{
dingshi3=0;
}
}
if(anjiangzhuantai_flag==2)
{
dingshi2++;
if(dingshi2>9)
{
dingshi2=0;
}
}
if(anjiangzhuantai_flag==3)
{
dingshi1++;
if(dingshi1>9)
{
dingshi1=0;
}
}
if(anjiangzhuantai_flag==4)
{
dingshi0++;
if(dingshi0>9)
{
dingshi0=0;
}
}
}
void main()
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
aa=read24c02(0); //上电开始用地址0单元存储num十六进制表示时的低两位, 读取24c02中的数据
// TmData=read24c02(1); //用地址0单元存储num十六进制表示时的高
time=read24c02(2); //用地址0单元存储num十六进制表示时的高
P02=0;
Timer0_Init() ;
INT0_Init();
EA=1;
INT1_Init();
INT2_Init();
INT3_Init();
while (1)
{
ET0 = 1; //使能定时器0中断
TR0 = 1; //定时器0开始计时
anzhuangtaipanduan();
display();
}
}
|
|