?? 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 + -