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