LM016LGND1VSSVCC2VDDVCC/V3DDVEERSRWERS4RW5E6D07D18D29D310D411D512D613D714D0D1D2D3D4D5D6D7 图7 1602显示电路接线图
5键盘输入模块电路
设计中,键盘采用非编码键盘系统中的独立式按 键结构。键盘工作方式采用定时扫描方式。采用定时 器TO定时,通过输出数据,识别按键的工作状态。键 盘主要用来提供人机接口,电路如图3所示,采用独立 式按键电路,各按键开关均采用了上拉电阻,保证在按 键断开时,各I/O有确定的高电平。按键功定义如 下:当P3.2按下时,步进电机开始加速;当P3.3按下 时,步进电机开始减速;当P3.4按下时,步进电机开始 正转;当P3.5按下时,步进电机开始反转。按键抖动的消除采用软件消抖实现。连接图如下:
起始键S1圈数键S2方向键S3S4 图8 按键接连接图
四、系统软件设计 1、软件流程图
GND速度键
图9 系统流程图
2程序代码 见附件。 五、总结
采用模块程序设计,逐个模块调好以后,再进行系统程序总调试。利用仿真软件Proteus及KeilC5l进 行调试。 系统实现了可程序设定和显示步进角、步进方向 和步进速度,支持用开关量单独控制步进电机的转向, 转速。电路简单可靠,结构紧凑,控制灵活,成本低,可 移植性强。经实验验证,本系统对步进电机的各项控 制都能达到比较理想的效果,具有较高的实用价值。通过此次课程设计,我不仅将知识融会贯通,而且在查找资
料的过程中也了解了许多课外知识,开拓了视野,使自己在专业知识方面和动手能力方面有了很大的提高,让我学会了理论到实践的转化,即如何将自己学到的运用到以后的生活和工作中,同时,也让我意识到团队精神的重要性。
此外,感谢丁老师的悉心教导以及同学的帮助,正是王老师细心的辅导和提供的一些参考资料还有同学们的互相帮助,让我顺利的完成了毕业设计,相信这对我以后的生活和工作都会有很大的帮助。
六参考文献
[1]徐薇莉,曹柱中.控制理论与设计[M].上海:上海交通大学出版 社.2003. [2]黄 坚.自动控制原理及其应用[M].北京:高等教育出版社, 2004. [3]先锋工作室.单片机程序设计实例[M].北京:清华大学出版社, 2003.’ [4]王幸之,钟爱琴.AT89系列单片机原理及接口技术[M].北京:北京航天大学出版社,2004.
[5]康华光,陈大钦.模拟电子电路[M].北京:高教育出版社,2004.
七附录
(1) 整体电路图
LCD2LM016LRP1123456789D0D1D2D3D4D5D6D7ABCD1234567U21B2B3B4B5B6B7BCOM1C2C3C4C5C6C7C916151413121110-4.81GND1VSSVCC2VDDVCC/V3DDVEERSRWERS4RW5E6D07D18D29D310D411D512D613D714D0D1D2D3D4D5D6D7ULN2004ARESPACK-821RS22RW23E242526272839D038D137D236D335D434D533D632D7101112S113S214S315S41617P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15U1起始键圈数键方向键S3S1AT89C51S2S4XTAL1XTAL2PSENALEEA19189293031ABCD12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RSTGND速度键 (2)程序代码
#include
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
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}; //正转 //unsigned char code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反转 //unsigned char code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //正转 sbit K1 = P3^2; //运行与停止 sbit K2 = P3^3; //设定圈数 sbit K3 = P3^4; //方向转换 sbit K4 = P3^5; //速率调整
sbit LCD_RS = P2^0; sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit on_off=0; //运行与停止标志 bit direction=1; //方向标志 bit rate_dr=1; //速率标志 bit snum_dr=1; //圈数标志
uchar code cdis1[ ] = {%uchar code cdis2[ ] = {%uchar code cdis3[ ] = {%uchar code cdis4[ ] = {%uchar code cdis5[ ] = {\
uchar m,v=0,q=0;
uchar number=0,number1=0;
uchar snum=20,snum1=20; //预设定圈数 uchar rate=3; //预设定速率 uchar data_temp,data_temP0,data_temp2;
/********************************************************/ /* /* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms /* /********************************************************/ void delay(uint t)
{ uchar k; while(t--) {
for(k=0; k<124; k++) { } } }
/********************************************************/
void delayB(uchar x) //x*0.14MS {
uchar i; while(x--) {
for (i=0; i<13; i++) { } } }
/********************************************************/ /* /*检查LCD忙状态 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。 /* /********************************************************/
bit lcd_busy()
{ bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();
result = (bit)(P0&0x80); LCD_EN = 0; return(result); }
/********************************************************/
/* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /* /********************************************************/
void lcd_wcmd(uchar cmd)