标题:
一个电机+蓝牙+按键+PWM控制的小作品,大家看看可以给我什么建议
[打印本页]
作者:
221
时间:
2017-6-3 20:12
标题:
一个电机+蓝牙+按键+PWM控制的小作品,大家看看可以给我什么建议
无标题.png
(231.84 KB, 下载次数: 105)
下载附件
2017-6-3 20:12 上传
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar ch,temp=0;
uchar news[]="gdmec--G1-717";
uchar speed[14]="Speed: r/s";
sbit K1=P1^1;//减速
sbit K2=P1^2;//加速
sbit K3=P1^3;//启动
sbit K4=P1^4;//停止
sbit RS=P2^0; //指示命令、状态或数据的引脚
sbit RW=P2^1; //读写引脚
sbit EN=P2^2; //使能引脚
sbit LED=P1^0;
sbit motor=P2^4;
uchar motornum=50;
bit stratflag;
//----------------------------------------------
void delay(uchar x)
{
while(x--);
}
void delay_ms(uchar x)
{
uchar i,y;
for(i=0;i<x;i++)
for(y=0;y<200;y++);
}
//----------------------------------------------
bit lcd1602_read_status()
{//读取LCD1602的状态,结果为0说明不忙,可以对LCD1602写入数据或命令
uchar temp;
RW = 1; //RW=1为读操作:单片机将LCD1602中的数据读出来
delay(2);
RS = 0; //RS=0为读写命令或状态,=1读写数据
delay(2);
EN = 1; //使能LCD1602
delay(2);
temp = P0;//将从LCD1602读到的信息存入临时变量temp中
delay(2);
EN = 0; //关LCD1602
delay(2);
return (bit)(temp&0x80);//返回读到数据的最高位也即状态位
}
//----------------------------------------------
void lcd1602_write_cmd(uchar cmd)
{//对LCD1602写入命令的函数
while(lcd1602_read_status()!=0);
RW = 0;
delay(2);
RS = 0;
delay(2);
EN = 1;
delay(2);
P0 = cmd;
delay(2);
EN = 0;
delay(2);
}
//---------------------------------------------
void lcd1602_write_dat(uchar dat)
{//对LCD1602写入数据的函数
while(lcd1602_read_status()!=0);
RW = 0;
delay(2);
RS = 1;
delay(2);
EN = 1;
delay(2);
P0 = dat;
delay(2);
EN = 0;
delay(2);
}
//---------------------------------------------
void lcd1602_init()
{
lcd1602_write_cmd(0x38);//设置LCD1602的数据位数
lcd1602_write_cmd(0x0c);//设置LCD1602的显示开关和光标
lcd1602_write_cmd(0x01);//清屏,将光标置于第1行第1列
lcd1602_write_cmd(0x06);//设置光标移动的方式并确定整体显示是否移动
delay(200); //仿真中这里的延时要足够长,否则有可能出错
}
void motor_init(uchar num)
{
motor=1;
delay_ms(num);
motor=0;
delay_ms(100-num);
}
/*串口初始化程序*/
void Uart_init()
{
PCON|=0X80;
TMOD=0X20;
SCON = 0x50; //8位数据,可变波特率
TL1 = 0xFA; //设定定时初值 0xFA为11.0592MHz的晶振频率
TH1 = 0xFA; //设定定时初值 0xFD为12MHz的晶振频率
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
uchar key_init()
{
if(stratflag)
{
if(K1==0)
{
delay_ms(2000);
if(K1==0)
{
delay_ms(2000);
motornum=motornum-5;
if((motornum<1)||(motornum>230))
motornum=1;
}
}
if(K2==0)
{
delay_ms(2000);
if(K2==0)
{
delay_ms(2000);
motornum=motornum+5;
if(motornum>=99)
motornum=99;
}
}
}
if(K3==0)
{
delay_ms(2000);
if(K3==0)
{
delay_ms(2000);
stratflag=1;
}
}
if(K4==0)
{
delay_ms(2000);
if(K4==0)
{
delay_ms(2000);
stratflag=0;
}
}
return motornum;
}
/*液晶显示函数*/
void display()
{
uchar i;
speed[6]=temp/100+'0';
speed[7]=temp%100/10+'0';
speed[8]=temp%10+'0';
lcd1602_write_cmd(0x80+1);
for(i=0;i<14;i++)
{
lcd1602_write_dat(news[i]);
}
lcd1602_write_cmd(0xC0+1);
for(i=0;i<14;i++)
{
lcd1602_write_dat(speed[i]);
}
}
/*主函数*/
void main()
{
lcd1602_init();
Uart_init();
while(1)
{
key_init();
if(stratflag)
{
LED=0;
temp=key_init();
display();
motor_init(temp);
}
else
{
LED=1;
display();
motor=1;
}
}
}
/*串口外部中断函数*/
void Uart_server() interrupt 4
{
if(RI==1)
{
ch=SBUF;
RI=0;
}
switch(ch)
{
case'a':
if(stratflag)
{
motornum=motornum-5;
if((motornum<1)||(motornum>230))
motornum=1;
};break;
case's':
if(stratflag)
{
motornum=motornum+5;
if(motornum>=99)
motornum=99;
};break;
case'd':stratflag=1;break;
case'f':stratflag=0;break;
temp=motornum;
}
}
复制代码
作者:
lovesbboy
时间:
2017-12-12 14:18
大哥,有成品吗
作者:
lovesbboy
时间:
2017-12-12 14:18
大哥,有成品吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1