标题:
现在的单片机电机程序,只能通过输入才能停,现想使它运行30s后自动停
[打印本页]
作者:
6789thy
时间:
2019-7-9 00:38
标题:
现在的单片机电机程序,只能通过输入才能停,现想使它运行30s后自动停
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "XPT2046.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 receiveData;
sbit led=P2^4; //手动运行指示灯
sbit xcg=P3^2; //左行程开关
sbit xck=P3^3; //右行程开关
u8 tab[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
u8 a=0,b=1;//用于记忆行程开关状态
void delay(u16 i)//延时函数
{
while(i--);
}
void UsartConfiguration()
{
/* SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置定时器1工作方式2
PCON = 0x00;
TH1=0XFD; //定时器装初值(波特率为9600)
TL1=0XFD;
ES=1; //开串行中断
EA=1; //开总中断
TR1=1; //启动定时器1
*/
/*
PCON |= 0x80; //使能波特率倍速位SMOD 12M 9600
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF9; //设定定时初值
TH1 = 0xF9; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
*/
PCON &= 0x7F; //波特率不倍速 12M 2400
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
/* PCON &= 0x7F; //波特率不倍速 11.0592M 9600
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1*/
ES=1; //开串行中断
EA=1; //开总中断
}
void motor1()//关窗帘
{
u8 i;
for(i=0;i<8;i++)
{
P1=tab[i];
delay(180);
}
}
void motor2()//开窗帘
{
char i;
for(i=7;i>=0;i--)
{
P1=tab[i];
delay(180);
}
}
void xcg1()
{
if(xcg==0) //检测按键是否按下
{
delay(600); //消除抖动 一般大约10ms
if(xcg==0) //再次判断按键是否按下
{
a=0;
b=1;
}
}
}
void xck1()
{
if(xck==0) //检测按键是否按下
{
delay(600); //消除抖动 一般大约10ms
if(xck==0) //再次判断按键是否按下
{
a=1;
b=0;
}
}
}
u8 SS='s';
u8 ZZ='z';
u8 TT='t';
u8 KK='k';
u8 GG='g';
void main()
{
u16 light,mode=1;//开机进入自动模式(mode=1)
UsartConfiguration();
while(1)
{
while(mode==1)//自动模式
{
led=1;
light=Read_AD_Data(0xA4);//读取光敏电阻值
if(receiveData==SS){mode=0;break;}//手动模式
while (a==1&&light<150)//关窗帘
{
if(receiveData==SS){mode=0;light=150;break;}
while(receiveData==TT){P1=0xFF;}
motor1();
xcg1();
b=1;
}
while (b==1&&light>200)//开窗帘
{
if(receiveData==SS){mode=0;light=200;break;}
while(receiveData==TT){P1=0xFF;}
motor2();
xck1();
a=1;
}
P1=0xFF;//电机断电停止
// delay(100);
}
while(mode==0)//手动模式
{
led=0;//手动控制指示灯
if (receiveData==ZZ){mode=1;break;}
while (a==1&&receiveData==GG)//关窗帘
{
motor1();
b=1;
xcg1();
while(receiveData==TT){P1=0xFF;}
}
while (b==1&&receiveData==KK)//开窗帘
{
motor2();
a=1;
xck1();
while(receiveData==TT){P1=0xFF;}
}
P1=0xFF;
// delay(100);
}
}
}
void Usart() interrupt 4 //串行口中断
{
if(RI)
{
receiveData=SBUF; //接收数据
RI = 0; //清除接收中断标志位
}
}
复制代码
作者:
xianfajushi
时间:
2019-7-9 09:00
char jishi=0;
158.void Usart() interrupt 4 //串行口中断
159.{
if(++jishi>=30秒)P1=0xFF;//电机断电停止
160. if(RI)
161. {
162. receiveData=SBUF; //接收数据
163. RI = 0; //清除接收中断标志位
164. }
165.}
之上只给大概思路,具体实现语句就不写了
作者:
yzwzfyz
时间:
2019-7-9 09:23
提出这个问题,说明你对单片机的运行原理还未弄清楚。
你是如何定义或理解单片机的“停”的呢?
作者:
lfc315
时间:
2019-7-9 10:33
打开电机后进行计时,达到30秒就关闭电机
作者:
鹏博士PBs
时间:
2019-7-9 10:45
单片机控制电机驱动吧
作者:
rodius
时间:
2019-7-9 11:22
搞一个定时器,在程序时查询定时到了就关闭
作者:
YXun
时间:
2019-7-9 11:31
启动电机之后, 延时30s让他关闭啊
作者:
witheMe
时间:
2019-8-11 20:19
这个问题本不是问题。
整一个定时器中断,到时间进入一个while(1)就可以了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1