- 积分
- 10608
- 在线时间
- 15508 小时
- 最后登录
- 2022-3-31
- 阅读权限
- 150
- 精华
- 6
- UID
- 13663
- 帖子
- 13726
- 精华
- 6
- 经验
- 10608 点
- 金钱
- 8449 ¥
- 注册时间
- 2006-10-21
|
楼主 |
发表于 2014-8-15 17:57
|
显示全部楼层
本帖最后由 ahao 于 2014-8-18 11:29 编辑
电原理,程序过几天更新
C程序如下红字部分,水平有限写的比较繁琐效率不高,可能有一些不合理的地方,仅供初学者参考。
头文件参考这个帖子3楼http://bbs.hifidiy.net/forum.php ... 48&pid=21285825
#include "STC15F104E.H" //头文件
#define uint unsigned int
#define uchar unsigned char //两个宏定义
sbit key=P3^0;
sbit deng=P3^1;
//位声明
sbit speak=P3^2;
sbit out=P3^3;
sbit ok=P3^4;
sbit star=P3^5;
uchar bz_key,tt_key,linshi,bz_ok,stop,tt_sp1,tt_sp2,tt0,tt_huxi,abc,biaoshi,tt_js,temp1,tt_led,tt00,miao,fen,shi,tt01; //定义变量
uint tt02;
void main() //主程序
{
TMOD=0x10; //设定定时器0工作模式为16位自动重装模式
TH0=0xff; //(65536-10)/256 定时器0装初值 10us
TL0=0xf6; //(65536-10)%256
ET0=1; //打开定时器0
// TR0=1;
TH1=0x3c; //(65536-50000)/256 定时器1装初值 50ms
TL1=0xb0; //(65536-50000)%256
ET1=1; //打开定时器1
TR1=1; //启动定时器1
EA=1; //打开总中断
P3M0=0x0e; //0000 1110 P3.1/2/3口为强推挽输出
deng=1;
bz_ok=1;
linshi=0;
tt00=miao=fen=shi=0;
speak=0;
while(1) //大循环
{
if(star==0) //室外电动车充电线插上
{
TR0=0;
abc=100;
biaoshi=1;
tt_sp2=0;
if(tt_sp1<15) //室外线插上后蜂鸣器响2次
speak=1;
else
speak=0;
if(tt01>60) //插上大于3秒
{
if(shi<12) //充电时间小于12小时
{
if(bz_ok) //充满标志
{
if(ok) //并且没充满时开始充电
{
out=1;
tt02=0;
stop=0; //满停标志
}
else //充满后延时20分钟断电
{
if(tt02>24000)
{
out=0;
stop=1;
linshi=shi; //临时数据记录当前小时数
bz_ok=0; //充满标志置零,目的是只运行一次此if语句
}
}
}
else //充满后
{
if(key==0)
{
if(tt_key>40) //延时消抖 长按2秒后led用闪亮方式显示充满共用了几个小时
{
bz_key=1; //键盘标志置1
stop=0; //满停标志置零,led显示方式为2秒一组闪烁
}
}
else
{
tt_key=0;
bz_key=0;
stop=1;
out=0;
}
}
}
else
{
out=0; //充电时间大于12小时强制断电
stop=1;
}
}
}
else //室外线被拔掉后
{
tt_sp1=0;
if(tt_sp2<45) //室外线拔掉后蜂鸣器响4次
speak=1;
else
speak=0;
bz_ok=1;
biaoshi=0; //标示、变量全置零
miao=0;
fen=0;
shi=0;
temp1=0;
tt00=0;
tt01=0;
tt02=0;
out=0; //输出关闭
stop=0;
TR0=1; //定时器0启动,指示灯呼吸显示
}
}
}
void timer0() interrupt 1 //定时器0的服务程序 0.1ms
{
if(tt0<100)
tt0++;
else
tt0=0;
if(tt0<abc) //led 调光
deng=1;
else
deng=0;
}
void timer1() interrupt 3 //定时器1的服务程序 50ms
{
TH1=0x3c; //(65536-50000)/256 定时器1装初值 50ms
TL1=0xb0; //(65536-50000)%256
if(tt_huxi) //待机时呼吸灯效果
{
abc+=2;
if(abc>=70)
tt_huxi=0;
}
else
{
abc-=2;
if(abc<=1)
tt_huxi=1;
}
if(biaoshi)
{
if(tt02<30000)
tt02++;
if(tt01<200)
tt01++;
if(tt_sp1<200)
tt_sp1++;
if(tt_key<100)
tt_key++;
tt00++;
if(tt00>=20)
{
miao++;
tt00=0;
if(miao>=60)
{
fen++;
miao=0;
if(fen>=60)
{
if(shi<24)
shi++;
fen=0;
}
}
}
if(stop)
{
tt_led++;
if(tt_led>=10) //充满断电后指示灯1秒闪一次
{
deng=~deng;
tt_led=0;
}
}
else //未充满时指示灯点闪一次表示1小时内
{
if(tt_led<40)
{
tt_led++;
if(bz_key) //按键标志为1时led闪烁为充满用了几个小时
temp1=linshi;
else //按键标志为0时led闪烁为正在充电几个小时内
temp1=shi;
}
else //2s到 新一轮闪灯动作
{
tt_js++;
if(tt_js<4) //200ms内灯亮
deng=1;
else //之后灯灭
{
if(tt_js<10) //500ms时间段内亮200ms,灭300ms实现闪亮效果。
deng=0;
else
{
tt_js=0;
if(temp1==0) //充电时间在1小时内闪亮1次,同理5小时内闪亮5次。
tt_led=0;
else
temp1--;
}
}
}
}
}
else
{
if(tt_sp2<200)
tt_sp2++;
}
}
|
|