求助单片机对管脚的定时开关
目的:让直流马达正转一次,一小时后反转一次,一直循环,实现转轮一小时工作,一小时不能工作
具体要求是:起始给1和2管脚高电平,3和4低电平,维持一秒(正转一次),然后1,2,3,4均调为低电平,等待1小时后,3和4给高电平,1和2给低电平,维持一秒(反转一次),全部恢复低电平,持续一小时。以此循环。
先谢谢了!
/******************************************************************************************
使用STC15F101W单片机,使用内部时钟11.0592MHz,如果使用51单片机改换头文件
功能:OUT1、OUT2高电平1秒,停1小时,OUT3、OUT4高电平1秒,停1小时,周而复始。
*******************************************************************************************/
#include "STC15Wxxxx.H" //STC15单片机通用头文件
//#include <AT89X52.H> //8951/52单片机头文件
#define uint unsigned int //宏定义uint为无符号整型数据(0-65535)
sbit OUT1=P3^0; //OUT1端口定义
sbit OUT2=P3^1; //OUT2端口定义
sbit OUT3=P3^2; //OUT3端口定义
sbit OUT4=P3^3; //OUT4端口定义
bit Z_sign=0; //正转标志
bit F_sign=1; //反转标志
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式(用51单片机去掉此条代码)
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void main()
{
OUT1=0; //初始化输出端口
OUT2=0; //
OUT3=0; //
OUT4=0; //
Timer0Init(); //初始化定时器
while(1);
}
void timer0() interrupt 1 //定时器0中断服务程序
{
static uint Cnt1ms=0; //毫秒计数变量
static uint Cnt1min=0; //分计数变量
static bit Enable=1; //使能标志
TL0 = 0x66; //设置重载值
TH0 = 0xFC; //设置重载初值
if(Z_sign==0) //正转标志为0
{
Cnt1ms++; //毫秒自+1
if(Enable==1) //电机使能为1
{
OUT1=1; //电机正转
OUT2=1;
OUT3=0;
OUT4=0;
}
if(Cnt1ms>=1000) //达到1秒
{
Enable=0; //电机使能清0
OUT1=0; //电机停
OUT2=0;
OUT3=0;
OUT4=0;
if(Cnt1ms>=60000) //60000=1分钟
{
Cnt1ms=1000; //重新计数
Cnt1min++; //分钟自+1
if(Cnt1min>=61) //1小时到
{
Cnt1ms=0; //毫秒计数变量清0
Cnt1min=0; //分钟计数变量清0
Enable=1; //电机使能置1
Z_sign=1; //正转标志置1
F_sign=0; //反转标志清0
}
}
}
}
if(F_sign==0) //反转标志为0
{
Cnt1ms++; //毫秒自+1
if(Enable==1) //电机使能为1
{
OUT1=0; //电机反转
OUT2=0;
OUT3=1;
OUT4=1;
}
if(Cnt1ms>=1000) //达到1秒
{
Enable=0; //电机使能清0
OUT1=0; //电机停
OUT2=0;
OUT3=0;
OUT4=0;
if(Cnt1ms>=60000) //60000=1分钟
{
Cnt1ms=1000; //重新计数
Cnt1min++; //分钟自+1
if(Cnt1min>=61) //1小时到
{
Cnt1ms=0; //毫秒计数变量清0
Cnt1min=0; //分钟计数变量清0
Enable=1; //电机使能置1
Z_sign=0; //正转标志清0
F_sign=1; //反转标志置1
}
}
}
}
}
小编前后表述的不一致,貌似要求马达正转一秒停止一小时,再反转一秒停止一小时,如此重复。普通直流电机是卡不住的,步进电机才有锁定功能。
转轮自身是没有动力的,小鼠只有在转轮里面爬才可以带动转轮,相当于人的跑步机一样,我的直流马达上面接了一根直角棍,马达正转就能把棍塞到转轮的缝隙里,从而卡住转轮不在转动了,反转就会把这个棍抽出,小鼠就又能在转轮上跑了。
转轮的构造就像这里的http://www.instrument.com.cn/netshow/sh101886/C210263.htm
我这里不需要锁定直流电机,只要能够把它上面接的一个棍塞入或抽出小鼠的转轮里就行了
代码给你写好了,回复需要审核通过,耐心等待。
厉害!真没想到你能回复这么快,下载到单片机试了,就是我想要的效果!万分感谢!!