使用51单片机控制直流电机转动与停止,主控是STC89C52,使用ULN2003A驱动直流电机。在0到5秒时电机转动,在5到10秒时电机停止,大于10秒时电机转动。
- 秒表计时:通过定时器0实现中断服务程序,实现秒表计时。
- 电机控制:根据秒表计时的秒数,控制电机的启停。
- 数码管显示:将当前秒数通过数码管显示出来。
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit MOTOR=P1^1; // 定义P1^1用于控制电机
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u16 time;
u16 miao;
void delay(u16 i)
{
while(i--);
}
void Timer0_init()
{
TMOD=0x01; // 设置定时器0为16位定时模式
TH0=(65535-10000)/256; // 设置TH0为定时器的高位初值
TL0=(65535-10000)%256; // 设置TL0为定时器的低位初值
EA=1; // 开启全局中断
ET0=1; // 使能定时器0中断
TR0=1; // 启动定时器0
}
void Display()
{
P2=0x00; // 设置P2口为0x00,显示个位数
P0=smgduan[miao%10]; // 将数组中对应miao个位数的段码输出到P0口
delay(100);
P0=0x00; // 清空P0口,防止残影
P2=0x04; // 设置P2口为0x04,显示十位数
P0=smgduan[miao/10%10]; // 将数组中对应miao十位数的段码输出到P0口
delay(100);
P0=0x00;
}
void run()
{
if(((miao>=0)&&(miao<=5))||(miao>10)) // 当秒数在0到5或10以上时,电机开启
{
MOTOR=1; //电机转动
}
}
void stop()
{
if((miao>5)&&(miao<=10)) // 当秒数在5到10时,电机关闭
{
MOTOR = 0; //电机停止
}
}
void main()
{
Timer0_init();
while (1)
{
Display();
run();
stop();
}
}
void Timer0() interrupt 1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
time++;
if(time==100)
{
miao++;
time=0;
}
if(miao>=60)
{
miao=0;
}
}