|
本帖最后由 NH6496 于 2017-2-23 17:36 编辑
从年前开起学C到现在1个多月了。
给大家分享我这几天的第一个实际开发项目(一商业产品)。也为以后自己翻阅,1年后,会否莞尔如今的笨拙?
任务要求:按下起动,水泵通电一段时间;到气泵通1段时间;2段时间可预置及寄忆,下次开机按预置时间。
选件:利用V2.0开发板(现成而已),触摸用SC12A.先开发程序。以后再选1体单片机。
调试总结:1,EEPROM读写真慢:2,有许多意外,需灵活处理。3,到处放小灯调程序有时比用KEIL还好用。
源文件:(红色部分调试硬加才达到目的)
/**************************************************************************************
* *
实现现象:倒计时1不到0,P2,6亮 。 倒计时1到0,P2,6灭;
倒计时2倒计时 ,P2,5亮。倒计时2到0 ,P2,5也 灭。
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "i2c.h"
#define KEY P1
typedef unsigned int uint; //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char addr;
unsigned char dat;
int s,m=2,sa,ma=1,num;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit OUTa=P2^5;
sbit OUT=P2^6;
sbit LE=P2^7;//预留以防显示要求闪动
uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
uint sg,ss,mg,ms,sga,ssa,mga,msa;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
while(i--);
}
/*******************************************************************************
* 函数名 :Keypros()
* 函数功能 :按键处理函数
* 输入 : 无
* 输出 : 键值
*******************************************************************************/
int Keypros()
{
if((KEY&0x0f)==0x05)
{
m--;
delay(30000);//这个值浪费1天才找到原因并设好
if(m<0)
m=0;
}
if((KEY&0x0f)==0x06)
{
m++;
delay(30000);
if(m>30)
m=30;
}
if((KEY&0x0f)==0x08)
{
ma--;
delay(30000);
if(ma<0)
ma=0;
}
if((KEY&0x0f)==0x09)
{
ma++ ;
delay(30000);
if(ma>30)
ma=30;
}
if((KEY&0x0f)==0x0a)
{
delay(1000); //消抖处理
if((KEY&0x0f)==0x0a)
{
At24c02Write(1,m); //在地址1内写入数据
delay(1000); // 等待写完。
At24c02Write(2,ma); //在地址2内写入数据
}
}
if((KEY&0x0f)==0x0c)
{
delay(1000); //消抖处理
if((KEY&0x0f)==0x0c)
{
num=At24c02Read(1); //读取EEPROM地址1内的数据保存在num中
m=num;
delay(1000);
num=At24c02Read(2);
ma=num;
}
}
}
/***************************************************
动态置LEDCOM口低电平
**********************/
void DigDisplay()
{
u8 i;
sg=s%10;
ss=s/10;
mg=m%10;
ms=m/10;
sga=sa%10;
ssa=sa/10;
mga=ma%10;
msa=ma/10;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=a[sg]; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=a[ss]; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; P0=a[mg]; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; P0=a[ms];break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; P0=a[sga]; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; P0=a[ssa];break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; P0=a[mga];; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; P0=a[msa]; break;//显示第7位
}
delay(101); //间隔一段时间扫描 可增减亮度。
P0=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器1中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static uint i;
TH0=0X3c; //给定时器赋初值,定时50ms
TL0=0Xb0;
i++;
if((s||m)!=0)
{
if(i==20) //中断次数
{
{
i=0;
s--;
}
if(s<=-1&&(m!=0))
{
s=59;
m--;
}
}
}
else
{
if((sa||ma)!=0)
{
if(i==20)
{
{
i=0;
sa--;
}
if(sa<=-1&&(ma!=0))
{
sa=59;
ma--;
}
else{ ma-=0; if(ma<=-1) { ma=0; flagb=1; }}
}
else{ sa-=0; if(sa<=-1) { sa=0; flaga=1; }}
if((sa||ma)!=0)
{
OUTa=0; OUT=1;
}
if((sa||ma)==0)
{OUTa=1; OUT=1;TR0=0;}
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
if((KEY&0x0f)!=0x01)
{
delay(100);
if((KEY&0x0f)!=0x01)
Keypros();
DigDisplay();
}
else
{
if((KEY&0x0f)==0x01)
delay(100);
if((KEY&0x0f)==0x01)
{
num=At24c02Read(1); //读取EEPROM地址1内的数据保存在num中
m=num;
delay(1000);
num=At24c02Read(2);
ma=num;
OUT=0;
DigDisplay();
Timer0Init(); //定时器0初始化
}
}
}
}
"i2c.h"。i2c.c.参考例程,论坛不许发太多字。
|
|