目 录
1 引言 1
2 总体设计方案 2
2.1 系统设计原理 2
2.2 总体设计框图 2
3系统硬件模块的组成 3
3.1单片机控制模块 3
3.1.1 STC89C52主要结构 3
3.1.2 STC89C52功能特性描述 3
3.1.3 时钟电路 6
3.1.4复位电路 6
3.2 步进电机模块 7
3.2.1 步进电机简介 7
3.2.2步进电机的结构 8
3.2.3 28BYJ-48步进电机工作原理 8
3.3 ULN2003芯片概述与特点 9
3.4 红外线发射接收模块 10
3.4.1 红外线遥控的介绍 10
3.4.2红外通信基本原理 10
3.4.3 红外遥控发射系统 12
3.4.4 红外遥控接收系统 12
3.4.5 TL1838与单片机的接口 14
3.5 12864显示模块 14
3.5.1 12864液晶的特点 14
3.5.2 12864液晶的引脚说明 15
3.5.3 12864液晶的读写操作 17
3.5.4 12864液晶的控制指令 17
3.5.5 12864液晶接口电路 20
3.6 蜂鸣器模块 20
3.6.1 蜂鸣器介绍 20
3.6.2 蜂鸣器的接口电路 21
4 软件设计与调试 22
4.1 主程序流程图 22
4.2程序设计思路 23
4.2.1 遥控器的解码 23
4.2.2 步进电机的控制 23
4.2.3 显示屏的控制 24
4.2.4 蜂鸣器的控制 24
4.2.5 模块中的通信 24
5 编程与下载软件 25
5.1 Keil软件 25
5.2 STC-ISP下载软件 26
6 硬件电路制作 27
6.1 原理图的绘制 27
6.2 电路实现的基本步骤 27
7 结 论 30
谢 辞 31
参考文献 32
附 录 33
2 总体设计方案
2.1 系统设计原理
单片机STC89C52是整个系统关键部分,通过对遥控器上键盘的命令输入,经遥控器编码后发出红外信号,TL1838接收到信号并在单片机中解码。本文提出的采用38KHZ的遥控器为核心控制器件的步进电机控制系统, 根据输出信号的不同可以控制步进电机的转动状态,其中采用了28BYJ-48的步进电机,以ULN2003为驱动芯片,并通过单片机程序控制和处理, 从而实现了步进电机的状态控制及相应状态显示。
本系统采用STC89C52单片机为核心处理器,遥控器为命令输入模块,由ULN2003及28BYJ-48步进电机组成的转动模块、12864液晶的输出模块共同组成的基于单片机的步进电机控制系统。
2.2 总体设计框图
本设计采用STC89C52单片机为核心处理器,利用载波为38KHZ的遥控器为输入模块键盘输入模块,控制步进电机的正转和反转,并以三种不同的速度进行转动,并且转动状态在12864液晶上显示。系统构成如图2-1所示。

图2-1 系统框图
由系统框图可知,遥控器和TL1838为输入装置,步进电机、12864液晶、蜂鸣器为输出装置,单片机为中心处理装置,ULN2003为驱动器。

 3系统硬件模块的组成

3.1单片机控制模块
主控电路中,以单片机为主体,通过分析遥控输入的指令,改变步进电机的运行参数和显示参数。它是系统的大脑。
单片机(Micro Controller,又称微控制器)是在一块硅片上集成了各种部件的微型机算计,这些部件包括中央处理器CPU、数据存贮器RAM、程序存贮器ROM、定时器/计数器和多种I/O接口电路[3]。
3.1.1 STC89C52主要结构
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口[4]。
3.1.2 STC89C52功能特性描述
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用宏晶公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。STC89C52具有以下标准功能:8k字节Flash、256字节RAM、32 位I/O 口线、看门狗定时器、2个数据指针、三个16 位定时器/计数器、一个6向量2级中断结构、全双工串行口、片内晶振及时钟电路。另外,STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下个中断或硬件复位为止[5]。STC89C52的引脚结构如图3-1所示。

       #include<reg51.h>#include<stdlib.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define DataPort P1
sbit RS  =  P3^0;            //寄存器选择输入
sbit RW  =  P3^1;            //液晶读/写控制
sbit E  =  P3^3;            //液晶使能控制
sbit PSB =  P3^4;sbit IR=P3^2;sbit BEEP=P0^0;uchar code mottor1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};uchar code mottor2[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};unsigned char a[4];unsigned char b=0xF8;unsigned char c=0xF4;unsigned char d=0xF0;unsigned char f=0xEC; unsigned char g=0xE8;unsigned char ga=0x1c;unsigned char gb=0x17;   //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度 uint num;uint num1=0;uint num2=1;uchar num3=0;uchar num4=0;uint i;void DelayUs2x(unsigned char t)
{   while(--t);
}      void delay_1ms(uint x)
{
uint i,j;
for(j=0;j<x;j++)  for(i=0;i<110;i++);
}       void delay1ms(){                          unsigned char i,j;    for(i=0;i<10;i++)for(j=0;j<33;j++);      }void Delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}void beep()     //蜂鸣器响一声函数
{unsigned char i;for (i=0;i<100;i++){delay1ms();BEEP=!BEEP;       //BEEP取反} BEEP=1;           //关闭蜂鸣器Delay(250);       //延时
}void Check_Busy()
{  RS=0;RW=1;E=1;DataPort=0xff;while((DataPort&0x80)==0x80);//忙则等待E=0;
}void Write_Cmd(unsigned char Cmd)
{Check_Busy();RS=0;RW=0;E=1;DataPort=Cmd;DelayUs2x(5);E=0;DelayUs2x(5);
}void Write_Data(unsigned char Data)
{Check_Busy();RS=1;RW=0;E=1;DataPort=Data;DelayUs2x(5);E=0;DelayUs2x(5);
}
void LCD_init()
{  Delay(40);           //大于40MS的延时程序PSB=1;                 //设置为8BIT并口工作模式Delay(1);            //延时//RES=0;                 //复位Delay(1);            //延时//RES=1;                 //复位置高Delay(10);Write_Cmd(0x30);       //选择基本指令集DelayUs2x(50);         //延时大于100usWrite_Cmd(0x30);       //选择8bit数据流DelayUs2x(20);         //延时大于37usWrite_Cmd(0x0c);       //开显示(无游标、不反白)DelayUs2x(50);         //延时大于100usWrite_Cmd(0x01);       //清除显示,并且设定地址指针为00HDelay(15);           //延时大于10msWrite_Cmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50);         //延时大于100us
}
void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
{ switch(y){case 1: Write_Cmd(0x80+x);break;case 2: Write_Cmd(0x90+x);break;case 3: Write_Cmd(0x88+x);break;case 4: Write_Cmd(0x98+x);break;default:break;}while(*s>0){ Write_Data(*s);s++;DelayUs2x(50);}
}
/*------------------------------------------------清屏
------------------------------------------------*/
void LCD_clear()
{ Write_Cmd(0x01);Delay(15);
}bit DeCode(void)
{unsigned char  i,j;unsigned char temp;    //储存解码出的数据for(i=0;i<4;i++)      //连续读取4个用户码和键数据码{for(j=0;j<8;j++)  //每个码有8位数字{temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                  TH0=0;         //定时器清0TL0=0;         //定时器清0TR0=1;         //开启定时器T0while(IR==0)   //如果是低电平就等待;          //低电平计时TR0=0;         //关闭定时器T0LowTime=TH0*256+TL0;    //保存低电平宽度TH0=0;         //定时器清0TL0=0;         //定时器清0TR0=1;         //开启定时器T0while(IR==1)   //如果是高电平就等待;              TR0=0;        //关闭定时器T0HighTime=TH0*256+TL0;   //保存高电平宽度if((LowTime<370)||(LowTime>640))return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码           if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1}                        a[i]=temp; //将解码出的字节值储存在a[i]                                                                                    }                           if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码return 1;     //解码正确,返回1
}void init(){EX0=1;       //开外中断0ET0=1;       //定时器T0中断允许IT0=1;       //外中断的下降沿触发  TR0=0;       //定时器T0关闭TMOD=0x11;TH1=(65536-2500)/256;TL1=(65536-2500)%256;EA=1;ET1=0;  TR1=1; }void xianshi(){LCD_PutString(0,1,"步进电机控制系统");LCD_PutString(0,4,"  方向:");if(num3==1) LCD_PutString(4,4,"RIGHT");else LCD_PutString(4,4,"LEFT ");    if(num2==0) {LCD_PutString(0,2,"  速度:15 t/m");LCD_PutString(0,3,"  速度ONE     ");}else if(num2==2){LCD_PutString(0,2,"  速度: 4t/m ");LCD_PutString(0,3,"  速度TWO     ");}else {LCD_PutString(0,2,"  速度: 2t/m");LCD_PutString(0,3,"  速度THREE   ");}}void main(){init();LCD_init();PT1=1;ET1=1; xianshi();TR1=1;while(1);}void Int0(void) interrupt 0{       ET0=0;EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号TH0=0;      //定时器T0的高8位清0TL0=0;      //定时器T0的低8位清0TR0=1;        //开启定时器T0    while(IR==0);          //如果是低电平就等待,给引导码低电平计时TR0=0;                //关闭定时器T0     LowTime=TH0*256+TL0;  //保存低电平时间TH0=0;      //定时器T0的高8位清0TL0=0;      //定时器T0的低8位清0TR0=1;     //开启定时器T0while(IR==1);  //如果是高电平就等待,给引导码高电平计时TR0=0;        //关闭定时器T0HighTime=TH0*256+TL0;   //保存引导码的高电平长度if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700)){  //如果是引导码,就开始解码,否则放弃,引导码的低电平计时//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.if(DeCode()==1) // 执行遥控解码功能{   ET1=1;PX1=1;if(!(a[0]^ga))LCD_PutString(7,3,"A ");else if(!(a[0]^gb))LCD_PutString(7,3,"B ");else LCD_PutString(7,3,"NO");if(!(a[2]^b)){num2=0;beep();}else if(!(a[2]^c)){num2=2;beep();}else if(!(a[2]^d)){num2=6;beep();}else if(!(a[2]^f)){ if(num3==0)num3=1;else num3=0;beep();}else  if(!(a[2]^g)){TR1=~TR1;beep();}xianshi(); }}EX0=1;   //开启外中断EX0}void T1_tim() interrupt 3{TH1=(65536-1000)/256;TL1=(65536-1000)%256;// keysc();if(i>7)i=0;if(num1>num2){    num1=0;if(num3==0)P2=mottor1[i++];else P2=mottor2[i++];     }   num1++;    }














基于单片机的步进电机控制系统设计与实现相关推荐

  1. 步进电机的计算机控制系统设计,基于.51单片机的步进电机控制系统设计.doc

    基于51单片机的步进电机控制系统设计 中文摘要 步进电机是一种受,并且能将相应的或者的电动机.由于步进电机具有步距误差不积累.运行可靠.结构简单.惯性小.成本低等优点,因此,被广泛使用于计算机外围电路 ...

  2. 基于51单片机霍尔测速直流电机控制设计(含源码+原理图+论文+PCB封装)、基于STM32闭环步进电机控制系统设计(仿真,程序,说明)-转发分享

    设计思路: 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法.本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理.产生方法以及如何通过软件编 ...

  3. 【分享】基于单片机嵌入式的家用智能节水淋浴控制器的设计-基于单片机的电子贺卡控制系统设计-基于单片机的倒计时牌控制系统设计-基于单片机的彩灯控制器系统设计-多模式彩灯-单片机的八路路数字电压表控制设计

    1334基于单片机嵌入式的家用智能节水淋浴控制器的设计-全套毕设课设设计资料 三个ds18b20分别采集进水口热水  冷水 和温水的水温,然后分别显示出来,按下开始按键,系统初始化,自动设置出水温度为 ...

  4. 基于单片机的水壶自动加热系统_基于单片机智能电水壶控制系统设计毕业设计(论文).doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp人工智能 基于单片机智能电水壶控制系统设计毕业设计(论文).do ...

  5. 简易交通灯控制系统设计c语言,基于单片机交通灯控制系统设计毕业设计.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 基于单片机交通灯控制系统设计毕业设计.doc30页 本 ...

  6. 【设计方案分享】基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-基于单片机乒乓球游戏机控制系统设计-基于单片机温度监测监控报警系统设计-基于单片机矩阵键盘的电子密码锁设计

    820基于单片机温度监测监控报警系统设计-设计资料 温度监测器功能描述: 1.主控芯片用的是51单片机(STC89C51). 2.使用温度传感器DS18b20采集温度. 3.用1602液晶显示显示温度 ...

  7. 基于单片机乒乓球游戏机控制系统设计-基于单片机矩阵键盘的电子密码锁设计-基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-设计资料【转发分享】

    819基于单片机乒乓球游戏机控制系统设计-设计资料下载 乒乓球游戏机设计任务为: (1)使用乒乓游戏机的甲乙双方各在不同的位置发球或击球. (2)乒乓球的位置和移动方向由灯亮及依次点燃的方向决定,球移 ...

  8. c语言怎么实现电梯控制系统设计,基于单片机的电梯控制系统设计.doc

    PAGE 本科生毕业论文(设计) 题 目: 基于单片机的电梯控制系统设计 姓 名: 学 院: 工学院 专 业: 自动化 班 级: 学 号: 指导教师: 职称: 副教授 2012 目 录 TOC \o ...

  9. 基于单片机家具窗帘控制系统设计、基于单片机路灯教室灯光家具智能控制设计-基于单片机简易电饭煲电饭锅仿真系统设计、基于单片机酒精检测控制系统仿真设计-设计资料

    1426基于单片机酒精检测控制系统仿真设计-全套资料 (1)  学习气体测量传感器的原理和使用,并完成数据采集.调理电路的设计: (2)  学习单片机系统的设计及编程,完成系统整体设计: (3)  通 ...

最新文章

  1. POJ 2481 Cows POJ 2352 Stars(树状数组妙用)
  2. 各种安卓对话框代码合集
  3. MarkdownPad2基础语法
  4. 移动Web开发图片自适应两种常见情况解决方案
  5. python中numeric_Python中的Numeric
  6. SpringBoot_web开发-扩展与全面接管SpringMVC
  7. 八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件
  8. POJ 1088----滑雪(DP)
  9. [动画工具] Animations
  10. centos6配置mysql远程访问_Linux服务器配置-VSFTP服务配置(六)
  11. 一种极端思维引起的幻觉
  12. 小谈android/Linux rootkit(基于LKM)
  13. sensenet的编译调试
  14. mapxtreme 查找指定位置的图元
  15. Himall商城普通帮助类(四)
  16. win10无法装载iso文件_iso镜像安装失败无法安装Windows10解决教程
  17. 安卓性能优化全面总结(友盟性能优化大赛获奖作品)
  18. C# 特性类[笔记]
  19. (附源码)node.js游戏网站 毕业设计 031726
  20. YOLOv6又快又准的目标检测框架 已开源

热门文章

  1. Mac Javascript开发环境搭建
  2. ArcSDE 日志文件表(一)
  3. docker容器/etc/hosts文件
  4. Cluster Docker
  5. 基于统计生成相似句(同义句),再用神经网络rnn语言模型判断句子的通顺性!
  6. Windows服务器部署前端vue项目
  7. 微信公众号开发账号申请以及菜单配置。
  8. 从A到Z, 这份区块链术语词典据说80%的人都认不全 | 科普
  9. Note_Logistics_Day14 ClickHouse 快速入门
  10. C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账