(3)、在正转反转状态下:连续按下+键,单片机调用加速指令,步进电机开始加速。连续按下-键,单片机调用减速指令,步进电机开始减速。 七、实施步骤 1.步骤
(1)方案确定:分析题目要求,手机资料,提出方案并论证; (2)基于STC89S52单片机红外遥控步进电机:
a) 完成基于STC89S52单片机红外遥控步进电机的原理图的设计及电路分析
基于STC89S52单片机红外遥控步进电机的原件清单;关b)键元器件选购; (3)线路板的设计与制作
1) ProtelDXP完成线路板的设计 2) 利用热转印方法完成线路板的制作
(4)基于STC89S52单片机红外遥控逼近电机的制作
1) 完成线路板的装配; 2) 简易外壳的制作;
3) 利用知道老师提供的程序完成整机的调试。
(5)程序编写、调试及仿真(使用KeilC51和Proteus开发工具软件)
(6)基于STC89S52单片机红外遥控步进电机的原理图;
八、项目清单
红外遥控步进电机耗材清单
序 号 1 2 3 4 5 6 7 8 9 10 11 12 耗材名称 碳膜电阻 瓷片电容 瓷片电容 电解电容 电解电容 晶振 桥堆 保险丝 IC IC 单片机 单片机插座 规格/型号 10K 104 30p 220uF/16V 220uF/3.5V 12MHz ULN2003A L7805CV AT89C51 DIP-40 合计数量 10 3 2 2 2 1 2 1 1 1 1 1 13 14 15 16 17 18 20 21 22 23 24 25 26 IC插座 2脚插座 4脚插座 2脚插座 变压器 电动机 碳膜电阻 电解电容 3脚插座 红外接收器 按键开关 碳膜电阻 电解电容 DIP-16 白色 白色 蓝色 AC9V 42BYGH102 15K 4.7uF 白色 SW-PB 100 22uF 1 2 1 1 1 1 1 1 1 1 1 1 1 总计
九、项目程序
#include
#define uchar unsigned char #define uint unsigned int
sbit IRIN=P3^2; //红处接收端口 sbit BEEP = P2^0; //蜂鸣器驱动线 bit direction,flag;
uchar count1=0,count2=0; uchar rate=9; uchar IRCOM[6]; unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转 unsigned char code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转 char code reserve[3]; //保留0x3b开始的3个字节
/******************************************************************* 延时子函数
*******************************************************************/
void delay(uchar x)
{
uchar i; while(x--) {
for(i=0;i<14;i++); } }
void beep(void) {
unsigned char i; for (i=0;i<100;i++) {
delay(4);
BEEP=!BEEP; //BEEP取反 }
BEEP=1; //关闭蜂鸣器 }
/******************************************************************* 主函数
*******************************************************************/
void main(void) {
BEEP=1;
P0=0xff; //端口初始化 P1=0xff;
TMOD=0x01; //Timer0工作方式1 TH0=0xf8; //2ms定时常数 TL0=0xcc;
ET0=1; //允许Timer0中断 EA=1; TR0=0; EX0=1; IT0=1;
direction=1; while(1) {
if(IRCOM[2]==0x47) //为遥控器的K1键 {
TR0=0;
P0=0xf0; //步进电机断电 }
if(IRCOM[2]==0x43) //为遥控器的up键 {
direction=1; //置运行方向标志位(正转) TR0=1; }
if(IRCOM[2]==0x40) //为遥控器的DOWN键 {
direction=0; //清运行方向标志位(反转) TR0=1; } flag=0; } }
/*******************************************************************
INT0中断服务子函数
*******************************************************************/
void IR_IN()interrupt 0 {
unsigned char j,k,Num=0;
EX0=0; //关闭INT0中断 delay(15); //延时
if(IRIN==1) //再确认IR信号是否出现 {
EX0=1; //开INT0中断 return;//退出 }
while(!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号 {
delay(1);