当前位置:首页 > 基于AT89C51单片机的电机控制综合课程设计 - 图文
3.5 按键电路
图3.5 按键电路 按键电路如上图3.5所示。当任意一个按键KEY被按下时,P2.0~P2.2引脚会对应的的产生一个低电平。
4 软件设计
4.1程序要求
我们使用C语言对AT89C51进开始 行控制程序的编写。程序中使用到的资源有两个定时器资源,T0工作在16位外部计数模式,用于速度的LCD初始化 反馈和计算等数据处理。T1工作在8位定时器自动重载模式,引脚P3.4接计数信息输入端口。在T1的定显示预处理 时溢出中断程序中进行速度的产生及对电机的控制操作。系统使用到5
开启中断 个普通I/O口资源。P1.6和P1.7初值设定 为控制电机转动的两路控制信号。P2.0作为加速按键信息输入端口,P2.1作为减速按键信息输入端口,P按键处理 2.2作为方向控制键信息输入端口。
程序运行时,先进行LCD控制程序的初始化并对显示进行预处速度计算 理。然后读预设速度初值,由T1中断服务程序产生PWM速度控制信号,T0反馈速度信息并进行速度的计算数据处理 处理。KEY1和KEY2可对速度进行加减操作。KEY3可对电机进行正反转的控制操作。 返回 程序的编写要遵循性保证系统稳定性的前提下消耗尽量少消耗资图4.1 程序流程图 源的原则,并要考虑实际的可操作
性和满足系统在各种工作环境下能稳定正常运行的要求。
中断服务 电机控制 11
4.2 程序流程图 4.3 程序清单
4.3.1 LCD驱动程序
/*
LCD.C
128×64 LCD驱动程序头文件 */
#ifndef LCD_H_ #define LCD_H_
#include
sbit LCD_BL=P1^4; //定义背光控制信号 void LcdLightOn(); //点亮背光灯 void LcdLightOff(); //熄灭背光灯 void LcdClear(); //清屏 void LcdInit(); //初始化
void LcdPutChar(unsigned char c); //显示ASCⅡ码 void LcdPuts(unsigned char*s); //显示字符串
#endif //LCD_H_ /*
LCD.C
128×64 LCD驱动程序 */
#include
unsigned char LcdCursor; //定义屏幕光标(取值0~63,光标本身不可见)int i,j;
void LcdLightOn() //功能:点亮背光灯 {
LCD_BL = 1; }
void LcdLightOff() //功能:熄灭背光灯 {
LCD_BL = 0; }
12
/*
函数:LcdGetBF() 返回:
BF=1,表示忙,不可进行任何操作 BF=0,表示不忙,可以进行正常操作 */
bit LcdGetBF()//功能:读出状态位BF {
unsigned char dat;
dat = XBYTE[0xD002]; //XBYTE的定义见
void LcdWriteCmd(unsigned char cmd) //功能:向LCD发送命令 {
while ( LcdGetBF() ); XBYTE[0xD000] = cmd; }
void LcdWriteDat(unsigned char dat) // 功能:向LCD写入数据 {
while ( LcdGetBF() ); XBYTE[0xD001] = dat; }
unsigned char LcdReadDat() //功能:从LCD读出数据 {
volatile unsigned char dat; while ( LcdGetBF() ); dat = XBYTE[0xD003];
dat = XBYTE[0xD003]; //需要连续执行两次才能够读出真正的数据 return dat; } /*
函数:LcdSetAC()
功能:设置DDRAM(显示数据RAM)的AC(地址计数器)值 */
13
void LcdSetAC(unsigned char ac) {
ac &= 0x3F; ac |= 0x80;
LcdWriteCmd(ac); }
void LcdClear() //功能:LCD清屏,并使光标回到0 {
LcdWriteCmd(0x01); //清屏命令 LcdCursor = 0; }
void LcdDelay(unsigned char t) //功能:延时(t*100)个机器周期 {
unsigned char n; do {
n = 49;
while ( --n != 0 ); } while ( --t != 0 ); }
void LcdInit() //功能:LCD初始化 {
LcdWriteCmd(0x30); //设置基本指令集 LcdDelay(3);
LcdWriteCmd(0x30); //设置基本指令集(需要再执行一次) LcdDelay(1);
LcdWriteCmd(0x0C); //开启显示 LcdDelay(3);
LcdClear(); //清屏 LcdDelay(250);
LcdWriteCmd(0x06); //设置进入点 LcdDelay(10); }
void LcdCheckAC() //功能:根据光标位置调整AC {
switch ( LcdCursor )
14
共分享92篇相关文档