基于STC89C52单片机红外遥控步进电机 - 图文

更新时间:2024-06-18 00:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目名称:基于STC89C52单片机红外遥控步进电机

一、摘要>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 二、关键词>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 三、STC89S52概述>>>>>>>>>>>>>>>>>>>>>> 1. 概述>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. 主要性能>>>>>>>>>>>>>>>>>>>>>>>>>> 3. 单片机引脚分布图>>>>>>>>>>>>>>>>>>> 四、功能描述及分析>>>>>>>>>>>>>>>>>>>>>> 五、软件描述>>>>>>>>>>>>>>>>>>>>>>>>>>>

1.程序流程图>>>>>>>>>>>>>>>>>>>>>>>> 2.判断编码电平流程图>>>>>>>>>>>>>>>>> 六、操作说明>>>>>>>>>>>>>>>>>>>>>>>>>>> 七、实施步骤>>>>>>>>>>>>>>>>>>>>>>>>>>> 1.步骤>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2.PCB制作流程>>>>>>>>>>>>>>>>>>>>>>> 3.原理图及电路分析>>>>>>>>>>>>>>>>>>>> 八、项目制作原件清单>>>>>>>>>>>>>>>>>>>> 九、项目程序>>>>>>>>>>>>>>>>>>>>>>>>>>>> 十、毕业作品实物照>>>>>>>>>>>>>>>>>>>>>>> 十一、毕业设计总结>>>>>>>>>>>>>>>>>>>>>>>

一、摘要

随着我国工业化、信息化进程的高速发展,电子信息产业蓬勃发展,国内对单片机及其外围设备研究越来越深入,实用也越来越广泛。无论是工业用品,还是民用产品,基本上都设计到单片机的设计和使用。

本设计介绍了一种基于STC89S52单片机的红外遥控步进电机的设计,系统分为红外遥控编解码和驱动步进电机两个模块,设计的系统能通过红外遥控器发射不同的码值来控制步进电机的正反转,加速减速以及启动停止,本报告对该系统的工作原理、硬件电路和软件进行了详细介绍。

二、关键词

红外遥控;51单片机;步进电机

三、STC89S52概述

1.STC89S52是一种低功耗、高性能CMOS8位微控制器、具有

8K在系统可编程Flash储存器。实用Atmel公司高密度非易失性储存器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序储存器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使STC89S52为众多嵌入式控制应用系统提供高灵活,超有效地解决方案。

2.主要性能

(1)、与MCS_51单片机产品兼容 (2)、8K字节在系统可编程Flash存储器

(3)、1000次擦写周期 (4)、全静态操作:0Hz~33Hz (5)、三级加密程序存储器 (6)、32个可编程I/O口线 (7)、三个16位定时器、计数器 (8)、八个中断源

(9)、全双工UART串行通道 (10)、低功耗空闲和掉电模式 (11)、掉电后中断可唤醒 (12)、看门狗定时器 (13)、双数据指针 (14)、掉电标识符

3. 单片机引脚分布图

四、功能描述及分析

红外接收 步进驱动 STC89S52 复位电路

1.红外发射模块:遥控发射器采用SC6121编码芯片进行红外遥控发射电路的搭建。SC6121是一块用于红外遥控系统中得虹鳟用发射继承电路,采用CMOS公益制造,它可外接32个按键。 通过遥控器发射不同的码值,红外接收电路将接收到的信号送给单片机的外部中断0,单片机接收到信号后通过解码程序对接收到的信号进行处理,使得性和谐信号成为相应的码值。经过处理后这些信号就可以去控制步进电机的正转反转、加速减速以及启动停止。具体的遥控发射应用电路图如图所示

基本构架原理框图

红外发送 晶振电路

红外遥控器:

2.红外接收模块:本系统采用的接收模块其核心是与SC6121相对应的LFN0038红外接收头。LFN0038是一颗集接收电路、调制解调电路、低通滤波、放大电路和控制电路为一体的集成接收

头,一共有三个引脚输出其中一个是电源一个是接地另一个则是输出,这样就大大方便了我们的使用。LFN0038内部结构如图

由于LFN0038内部集成了强大的信号处理功能,所以在本系统中使用这个LFN0038的接收的时候我们只需要在外部嘉盛一个滤波电路即可,这个RC滤波电路是为了滤除电源端的干扰信号。下图为LFN0038应用电路及遥控器 红外接收头电路:

3.步进电机驱动模块:本系统采用额定电压5VDC,相数为四相

步进电机。一共6根连接线,其中两根红色的为电源线。采用单极性直流电源供电。只要对不仅电机的各项绕组按合适的时序通电,就能使不仅电机步进转动。由于单片机P口输出地电流比较弱不能驱动不仅电机,所以要价一个ULN2003芯片来放大电流使之能驱动步进电机工作。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003的每一对达林顿管都串联一个ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高 负载电流并行运行。步进电机驱动电路如图:负载电流并行运行。步进电机驱动电路如图:

五、软件描述 (1)程序流程图

主程序 系统初始化 INT0外部中断设置 有没有按下? UP键按下? DOWN按下? 正转 反转 中断子程序 (红外译码) 收集四字节数据保存到IRCOM[] 关闭中断 用户码比较接收数据比较 INTR=0?跳过9ms的前导低电平信号 数据比较正确吗? 数据处理 INIR=1?跳过4.5ms的前导高电平信重新开中断返回

(2)判断编码电平流程图

六、操作说明

(1)、接上5V电源线,按下开关按钮,系统初始化。 (2)、按下UP按键,单片机调用正转程序指令,步进电机开始做时针运动。

按下DOWN按键,单片机调用反转程序指令,步进电机开始顺时针运动。

(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);

}

while(IRIN) //等IR变为低电平,跳过4.5ms的前导高电平信号 {

delay(1); }

for (j=0;j<4;j++) // 收集四组数据 {

for(k=0;k<8;k++)//每组数据有8位 {

while(IRIN)//等IR变为低电平 {

delay(1); }

while(!IRIN)//等IR变为高电平 {

delay(1); }

while(IRIN)//计算IR高电平时长 {

delay(1); Num++; if(Num>=15) {

EX0=1;//0.14ms计数过长自动离开 return; }

}//高电平计数完毕

IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0” if(Num>=8)

IRCOM[j]=IRCOM[j]|0x80;//数据最高位补“1” Num=0; } }

if(IRCOM[0]!=0x00)//比较用户码 {EX0=1; //开INT0中断 return;//退出 }

if(IRCOM[2]!=~IRCOM[3])//接收数据是否正确 {

EX0=1;//开INT0中断 return;//退出 }

else beep(); flag=1;

if(IRCOM[2]==0x09)//“+”键 {

if(rate>4) rate--; else rate=4; }

if(IRCOM[2]==0x15) {

if(rate<15) rate++; else

rate=15; }

EX0=1;//重新开INT0中断 }

/*******************************************************************

定时器0中断服务子函数

*******************************************************************/

void motor_onoff() interrupt 1 {

TL0=0xcc;//2ms定时常数 TH0=0xf8; count1++;

if(count1

return; } else

{

count1=0;

if(direction==1) //运行方向标志 {

if(count2<8)

P0=FFW[count2]&0x1f; //取数据,正转 count2++; //取数据次数加1 if(count2==8) count2=0; } else {

if(count2<8)

P0=REV[count2]&0x1f; //取数据,反转 count2++; //取数据次数加1 if(count2==8) count2=0; } } }

十、毕业作品实物照

本文来源:https://www.bwwdw.com/article/0dn3.html

Top