?? main.c
字號:
/********************************************************************
匯誠科技
實現功能:繼電器通、斷時間都可調控制程序(eeprom)
使用芯片:STC12C5204AD
晶振:11.0592MHZ
編譯環境:Keil
硬件環境:四位數顯兩路輸入三按鍵
作者:yang
QQ:790244909
網站:www.ourhc.cn
物聯網測試網站:http://hualongelectron.eicp.net/
日期:2013-05-08
淘寶店:
華龍電子直銷:http://hlelectrony.taobao.com
電子開發直銷:http://shop63233873.taobao.com
匯誠科技網路購物:http://shop36330473.taobao.com
【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
/********************************************************************
/********************************************************************
功能說明:繼電器循環通斷控制程序
繼電器通、斷時間可調,
key1功能鍵:調節模式與實時顯示模式轉換
keynum=0:實時顯示計時模式
keynum=1:調整繼電器設定閉合秒
keynum=2:調整繼電器設定閉合分
keynum=3:調整繼電器設定斷開秒
keynum=4:調整繼電器設定斷開分
以上四個設定值設定好后都存入eeprom,掉電可記憶
上電時,繼電器吸合,數顯開始計時,到達設定閉合時間后斷開;數顯清零,
數顯開始計時,到設定時間,繼電器閉合,數顯清零。。。
循環下去。。
設定斷開時間最大是10分59秒
設定閉合時間最大是10分59秒
********************************************************************/
#include<STC12C5A60S2.H> //庫文件
#include <intrins.h>
#include"eprom.h"
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
#define DUAN P2 //P0口控制段
#define WEI P1 //P2口控制位
sbit jdq= P3^7;
sbit key1=P3^2; //功能按鍵
sbit key2=P3^3; //增加
sbit key3=P3^4; //減小
/********************************************************************
初始定義
*********************************************************************/
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
uchar wei[4]={0X01,0X02,0X04,0X08}; //位的控制端
uchar numb[4]; //定義字符串
uchar cnt,keynum;
uchar setfen,setmiao;
uchar setdf,setdm;
uchar miao,fen;
void IapEraseSector(uint addr);
void IapProgramByte(uint addr,uchar dat);
uchar IapReadByte(uint addr);
bit flag=1; //閉合斷開標志位
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar x) //延時程序 0.1秒
{
uchar m,n,s;
for(m=x;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
顯示函數
*********************************************************************/
void display(uchar a ,uchar b) //顯示函數
{
WEI&=0XF0;
DUAN=seg7code[a/10];
WEI=wei[0];
delay(2);
WEI&=0XF0;
DUAN=seg7code[a%10]&0x7f;
WEI=wei[1];
delay(2);
WEI&=0XF0;
DUAN=seg7code[b/10];
WEI=wei[2];
delay(2);
WEI&=0XF0;
DUAN=seg7code[b%10];
WEI=wei[3];
delay(2);
WEI&=0XF0;
}
/********************************************************************
按鍵掃描
*********************************************************************/
void keyscan(void)
{
if(key1==0)
{ delay(1);
if(key1==0)
{
while(!key1);
keynum++;
TR0=0;
jdq=0;
if(keynum>=5)
{
keynum=0;
miao=fen=0;
TR0=1;
jdq=1;
}
}
}
switch(keynum)
{
case 1: if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2)display(setfen,setmiao);
setmiao++;
if(setmiao>59)
setmiao=59;
IapEraseSector(0);
IapProgramByte(0,setmiao); //寫入函數
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)display(setfen,setmiao);
setmiao--;
if(setmiao==0||setmiao>=250)
setmiao=0;
IapEraseSector(0);
IapProgramByte(0,setmiao); //寫入函數
}
}
display(setfen,setmiao);
break;
case 2: if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2)display(setfen,setmiao);
setfen++;
if(setfen>99)
setfen=99;
IapEraseSector(512);
IapProgramByte(512,setfen); //寫入函數
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)display(setfen,setmiao);
setfen--;
if(setfen==0||setfen>=250)
setfen=0;
IapEraseSector(512);
IapProgramByte(512,setfen); //寫入函數
}
}
// display(setfen,setmiao);
break;
case 3:
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2)display(setdf,setdm);
setdm++;
if(setdm>59)
setdm=59;
IapEraseSector(0);
IapProgramByte(0,setmiao); //寫設定閉合時間秒
IapProgramByte(1,setdm); //寫設定斷開時間秒
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)
display(setdf,setdm);
setdm--;
if(setdm==0||setdm>=250)
setdm=0;
IapEraseSector(0);
IapProgramByte(0,setmiao); //寫設定閉合時間秒
IapProgramByte(1,setdm); ////寫設定斷開時間秒
}
}
break;
case 4:if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2)
display(setdf,setdm);;
setdf++;
if(setdf>10)
setdf=10;
IapEraseSector(512);
IapProgramByte(512,setfen); //寫設定閉合時間分
IapProgramByte(513,setdf); //寫設定斷開時間秒
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)
display(setdf,setdm);
setdf--;
if(setdf==0||setdf>=250)
setdf=0;
IapEraseSector(512);
IapProgramByte(512,setfen); //寫設定閉合時間分
IapProgramByte(513,setdf); //寫設定斷開時間分
}
}
//
break;
default : break;
}
}
/********************************************************************
定時器T0初始化*********************************************************************/
void cshh()
{
TMOD|=0X01; //定義定時器工作方式
TH0=0Xa6;
TL0=0X01;
ET0=1;
TR0=1; //開定時器
EA=1; //開中斷
}
/********************************************************************
初始化函數
*********************************************************************/
void init_all(void)
{
P2M1=0;
P2M0=0xff;
P1M1=0;
P1M0=0x0f;
P3M1&=0x7f;
P3M0|=0x80;
P3=0xff;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
init_all();
setfen=IapReadByte(512); //讀設定閉合秒
setdf= IapReadByte(513); //讀設定斷開秒
setmiao=IapReadByte(0); //讀設定閉合分
setdm=IapReadByte(1); //讀設定斷開秒
cshh(); //定時器初始化
while(1)
{
if(keynum==0) //實時計時模式
{
display(fen,miao);
}
if(keynum>0&&keynum<3) //設定閉合分和秒模式
display(setfen,setmiao);
if(keynum>=3&&keynum<5) //設定斷開分和秒模式
display(setdf,setdm);
keyscan();
}
}
/********************************************************************
定時器中斷函數
*********************************************************************/
void timer1(void)interrupt 1
{
TH0=0Xa6; //定時初值
TL0=0X01; //定時初值
cnt++;
if(cnt>=40)
{
cnt=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
}
}
if((fen>=setfen)&&(miao>=setmiao)&&flag)
{
flag=0;
jdq=0;
miao=0;
fen=0;
}
if((fen>=setdf)&&(miao>=setdm)&&(flag==0))
{
jdq=1;
miao=0;
fen=0;
flag=1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -