建议用MOS管作为充放电。按图用51单片机外部中断下降沿触发,运放当作电压比较用。原理图和程序不一定能够正常运行,但逻辑关系已很清楚。
- #include "reg51.h"
- sbit key=P1^0; //充放电开关
- sbit recharge =P1^1; //充电管
- sbit discharge=P1^2; //放电管
- unsigned int num,num1;//定时器计数变量
- unsigned int count=0; //消抖计数变量
- long time; //时间变量us
- bit flag=0;//放电结束标志
- bit sign=0;//开关状态标志
- void main()
- {
- TMOD= 0x01;
- TH0 = 0x00;
- TL0 = 0x00;
- TR0 = 0;//关闭定时器
- ET0 = 1;
- EA = 1;
- IT0 = 1;
- EX0 = 1;
- while (1)
- {
- if(!key) //放电
- {
- if(++count>=500 && sign==0) //放电
- {
- sign=1; //操作记忆
- recharge =0;//关充电
- discharge=1;//开放电
- num=0; //清0
- num1=0; //清0
- time=0; //清0
- TR0 = 1; //启动定时器
- while(!flag);//等待放电结束
- flag=0; //清0
- time=(long)(num1*65536)+num;//单位us
- }
- }
- else
- {
- count=0; //清0
- sign=0; //复位
- recharge =1;//开充电
- discharge=0;//关放电
- }
- }
- }
- void t0int() interrupt 1
- {
- num1++;//累加
- }
- void exint0() interrupt 0
- {
- TR0 = 0; //关闭定时器
- num=TH0<<8|TL0; //读取寄存器值
- flag=1; //放电结束
- }
复制代码
|