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

📄 wxbj.c

📁 C 语言硬件编程的一点基本语法及程序设计流程!
💻 C
📖 第 1 页 / 共 2 页
字号:
}
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 + -