⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wireless_alarm.c

📁 基于8051的网络远程控制系统 本项目通过网络实现远程监控
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <AT89X55.H>//加载头文件
#define uchar unsigned char//变量类型的宏定义
#define uint unsigned int//变量类型的宏定义
uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
                0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的数码管段码*/
#define reset() {WDT=0x1e;WDT=0xe1;}//看门狗启动/复位宏定义
uchar act[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管驱动位码数组
void delay(uint k);//延时子函数声明
void dis_check1(uchar m);//显示报警时的地址、时间子函数
sfr WDT=0xa6;//看门狗寄存器定义

/*************外部函数声明************/
extern void delay_iic(int n);
extern void wr_24c01(char a,char b);
extern uchar rd_24c01(char a);
extern void shift8(char a);
extern void ack();
extern void stop();
extern void start();

/***************************/
sbit MSKEY=P1^7; /*功能键标志*/
sbit MONKEY=P1^6;//月按键
sbit DAYKEY=P1^5;//天按键
sbit HOUKEY=P1^4;//时按键
sbit MINKEY=P1^3;//分按键
sbit CHECKKEY=P3^2;//查询按键
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;

//------------------
bit d_05s=0;   /*0.5秒标志*/
bit rdflag=1;//读取标志
bit checkflag;//查询标志
bit IO_flag=0;//报警触发标志
bit T1_startflag; //第一路定时启动标志
bit T1_endflag; //第一路定时结束标志
bit T2_startflag;// 第二路定时启动标志
bit T2_endflag;//第二路定时结束标志
bit out_P1_2; //第二路继电器输出
bit out_P3_1; //第一路继电器输出
bit ALMstart;//报警时间启动标志
bit ALMmin_iicflag;//报警所用时间写入24C01标志
bit iic_rdflag;//读取24C01标志

//------------------
uchar x,y,memoryoverflag;//变量定义
uchar MS=0;//工作模式定义
uchar deda=0;   	/*100mS计数单元清零*/ 
uint cnt;
uchar ALMadd,discnt;//报警地址暂存、显示屏扫描计数器
char iic_cnt,ALMmin;//24C01单元计数、报警时间(分)
uchar sec,min,hou,day,mon;//秒、分、时、天、月
uchar temp_min,temp_hou,temp_day;//临时存放的分、时、天

/*===================*/
uchar T1min_st,T1hou_st,T1min_end,T1hou_end;//第一路定时(分、时)开始、结束时间
uchar T2min_st,T2hou_st,T2min_end,T2hou_end;//第二路定时(分、时)开始、结束时间

/*********************/
void dis_time(uchar m);//函数列表
void dis_adjtime(uchar m);
void dis_check(uchar m);
void dis_adjT1_st(uchar m);
void dis_adjT1_end(uchar m);
void dis_adjT2_st(uchar m);
void dis_adjT2_end(uchar m);
void dis_adjALMtime(uchar m);
void scankey();
void conv();
void pdT(void);
void dis_check(uchar m);

/***********************/
/*定时器T0初始化100ms*/
void init_timer0()
{
TMOD=0x11;
TH0=-(50235/256);
TL0=-(50235%256);
TR0=1;
}

/*定时器T1初始化2ms*/
void init_timer1()
{
TH1=-(1000/256);
TL1=-(1000%256);
TR1=1;
}

//***********初始化子函数************
void init(void)
{	P0=0xff;P1=0xff;P2=0xff;P3=0xff;
	ALMstart=0;reset()
	rdflag=0;
	discnt=0;
	init_timer0();         
	init_timer1();          
	IE=0x8f;PT1=1;
	IT1=1;
	EA=0;// 关总中断
x=rd_24c01(4);delay_iic(250);
if(x!=88) 
{sec=0;min=0;hou=0;day=1;mon=1; 
wr_24c01(4,88);delay_iic(250); 
wr_24c01(5,1);delay_iic(250); 
wr_24c01(6,3);delay_iic(250); 
}
x=rd_24c01(6);delay_iic(250);
if(x>59){wr_24c01(6,3);delay_iic(250);}
//-------------------------------
iic_cnt=rd_24c01(5);delay_iic(250);
//----------------------------------
ALMmin=rd_24c01(6);delay_iic(250);
EA=1; 
}

/*********延时Kx1ms子函数*****************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}reset()}
}

/*100mS定时中断服务子函数*/
void time_zd0(void) interrupt 1 using 1
{
TH0=-(50235/256);
TL0=-(50235%256);
deda++;
}

/***********外部中断1子函数,报警触发*************/
void extern_zd1(void) interrupt 2 using 2
{IO_flag=1;delay(200);}
//===========================================
void IO_fnc()
{	uchar temp;	
		if(IO_flag) 
		{	EA=0; 
			ALMadd=P3;ALMadd=ALMadd>>4; 
			ALMmin=rd_24c01(6);delay_iic(250); 
			iic_cnt=rd_24c01(5);delay_iic(250); 
			iic_cnt++;//地址指针加1
			temp=rd_24c01(7);delay_iic(250);
			if(temp!=55) 
			{if(iic_cnt==31){wr_24c01(7,55);delay_iic(250);memoryoverflag=55;}}
			if(iic_cnt>31)iic_cnt=2; 
			x=iic_cnt*4; 
			wr_24c01(x,ALMadd);delay_iic(250); 
			wr_24c01(x+1,day);delay_iic(250);
			wr_24c01(x+2,hou);delay_iic(250);
			wr_24c01(x+3,min);delay_iic(250);
			//**************************
			wr_24c01(5,iic_cnt);delay_iic(250); 
			MS=15;IO_flag=0; 
			temp_day=day;temp_hou=hou;temp_min=min;
			ALMstart=1;EA=1; 
		}
}

/**************************/
/*2mS定时中断服务子函数*/
void time_zd1(void) interrupt 3 using 3
{
	TH1=-(1000/256);// 重载定时初值
	TL1=-(1000%256);
if(discnt>7)discnt=0;// 显示为8位数码管
if(cnt>700)cnt=0;// 报警时的闪烁周期
switch(MS)
{
case 0:{dis_time(discnt);}break;// 显示走时
case 1:{dis_adjtime(discnt);}break;// 显示调时
case 2:{dis_adjT1_st(discnt);}break; //显示T1调整及设定
case 3:{dis_adjT1_end(discnt);}break;// 显示T2调整及设定
case 4:{dis_adjT2_st(discnt);}break;// 显示T3调整及设定
case 5:{dis_adjT2_end(discnt);}break;// 显示T4调整及设定
case 6:{dis_adjALMtime(discnt);}break;// 显示报警时间调整及设定
case 10:{dis_check(discnt);}break;// 查询时显示的报警历史记录(翻页)
case 15:{dis_check1(discnt);}break;// 报警触发时,显示此时的报警地点、时间
default:break;
}
discnt++;cnt++;
}

/*****************************/
void dis_check1(uchar m)// 报警触发时,显示此时的报警地点、时间
{
if(cnt<350)
{switch(m)
{case 0:{P0=SEG7[temp_min%10];}break;
case 1:{P0=SEG7[temp_min/10];}break;
case 2:{P0=SEG7[temp_hou%10];}break;
case 3:{P0=SEG7[temp_hou/10];}break;
case 4:{P0=SEG7[temp_day%10];}break;
case 5:{P0=SEG7[temp_day/10];}break;
case 6:{P0=SEG7[ALMadd%10];}break;
case 7:{P0=SEG7[ALMadd/10];}break;
default:break;
}
P2=act[m];P0_7=1;}
else
P2=0xff;
}

//===============================
void dis_check(uchar m)// 查询时显示的报警历史记录(翻页)
{
switch(m)
{case 0:{P0=SEG7[temp_min%10];}break;
case 1:{P0=SEG7[temp_min/10];}break;
case 2:{P0=SEG7[temp_hou%10];}break;
case 3:{P0=SEG7[temp_hou/10];}break;
case 4:{P0=SEG7[temp_day%10];}break;
case 5:{P0=SEG7[temp_day/10];}break;
case 6:{P0=SEG7[ALMadd%10];}break;
case 7:{P0=SEG7[ALMadd/10];}break;
default:break;
}
P2=act[m];P0_7=1;
}

/*******************************/
void dis_time(uchar m) //显示走时
{
switch(m)
{case 0:{P0=SEG7[min%10];}break;
case 1:{P0=SEG7[min/10];}break;
case 2:{P0=SEG7[hou%10];}break;
case 3:{P0=SEG7[hou/10];}break;
case 4:{P0=SEG7[day%10];}break;
case 5:{P0=SEG7[day/10];}break;
case 6:{P0=SEG7[mon%10];}break;
case 7:{P0=SEG7[mon/10];}break;
default:break;
}
if(!d_05s) {P0_7=0;}
else {P0_7=1;}
P2=act[m];
}

/****************************/
void dis_adjtime(uchar m)// 显示调时
{
switch(m)
{case 0:{P0=SEG7[min%10];}break;
case 1:{P0=SEG7[min/10];}break;
case 2:{P0=SEG7[hou%10];}break;
case 3:{P0=SEG7[hou/10];}break;
case 4:{P0=SEG7[day%10];}break;
case 5:{P0=SEG7[day/10];}break;
case 6:{P0=SEG7[mon%10];}break;
case 7:{P0=SEG7[mon/10];}break;
default:break;
}
P0_7=1;
P2=act[m];
}

/****************************/
void dis_adjT1_st(uchar m) //显示T1调整及设定
{
switch(m)
{case 0:{P0=SEG7[T1min_st%10];}break;
case 1:{P0=SEG7[T1min_st/10];}break;
case 2:{P0=SEG7[T1hou_st%10];}break;
case 3:{P0=SEG7[T1hou_st/10];}break;
case 4:{P0=0x00;}break;
case 5:{P0=0x00;}break;
case 6:{P0=SEG7[1];}break;
case 7:{P0=0x31;}break;
default:break;
}
if(!T1_startflag) P0_7=1;
else P0_7=0;
P2=act[m];
}

/************************************/
void dis_adjT1_end(uchar m) //显示T2调整及设定
{
switch(m)
{case 0:{P0=SEG7[T1min_end%10];}break;
case 1:{P0=SEG7[T1min_end/10];}break;
case 2:{P0=SEG7[T1hou_end%10];}break;
case 3:{P0=SEG7[T1hou_end/10];}break;
case 4:{P0=0x00;}break;
case 5:{P0=0x00;}break;
case 6:{P0=SEG7[2];}break;
case 7:{P0=0x31;}break;
default:break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -