微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助单片机对管脚的定时开关

求助单片机对管脚的定时开关

时间:10-02 整理:3721RD 点击:
学生物的 ,实验中需要做一个定时开关来控制一个小鼠转轮的转动,开关的硬件是用一个直流马达转动来操控的,用四个三极管H桥电路来控制马达的正转和反转从而对转轮进行卡住和松开,考虑用51单片机来给定时控制信号,但之前没接触过,求助各位这方面的大神:
目的:让直流马达正转一次,一小时后反转一次,一直循环,实现转轮一小时工作,一小时不能工作
具体要求是:起始给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

我这里不需要锁定直流电机,只要能够把它上面接的一个棍塞入或抽出小鼠的转轮里就行了

代码给你写好了,回复需要审核通过,耐心等待。

厉害!真没想到你能回复这么快,下载到单片机试了,就是我想要的效果!万分感谢!!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top