全套资料下载地址:https://download.csdn.net/download/sheziqiong/86772168
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86772168
目 录
第一部分 毕业设计概述 4
1.1 毕业设计的目的与任务 4
1.2 毕业设计题目 4
1.3 设计功能要求 4
1.4 毕业设计的内容与要求 4
1.5 实验仪器设备及器件 4
第二部分 设计方案工作原理 5
2.1 预期实现目标定位 5
2.2 技术方案分析 5
2.2.1系统框图 5
2.2.2电路工作原理 5
2.2.3控制算法原理 6
2.3 功能指标实现方法 7
2.3.1 实现方案分析 7
2.3.2 基本模块原理 7
第三部分 核心部件电路设计 9
3.1 关键器件性能分析 9
3.2 电路工作原理 9
3.3 电路驱动接口说明 9
第四部分 系统软件设计分析 10
4.1 系统总体工作流程 10
4.2 程序设计思路 10
4.3 关键模块程序清单 11
4.3.1编码器测速 11
4.3.2五向按键检测 11
4.3.3 OLED显示 12
4.3.4 PID控制 13
4.4 调试分析 14
4.4.1 总体说明 14
4.4.2 PID算法调节分析 14
第五部分 心得体会 16
第六部分 附录 17
Ⅰ参考文献 17
Ⅱ电路原理图 17
Ⅲ源代码 18
第一部分 毕业设计概述
1.1 毕业设计的目的与任务
《单片机应用系统设计》毕业设计是运用“应用系统设计”这门毕业所学的应用系统设计的各方面知识,进行综合设计的一门毕业。设计者要熟练掌握 Keil C 软件编程环境和 STC 单片机的片上资源,并通过查文献资料了解掌握相关外围器件的用法,综合运用进行设计。本毕业是配合单片机原理和应用系统设计及模拟、数字电路,传感器原理等多门毕业教学的一个重要实践环节,本文转载自http://www.biyezuopin.vip/onews.asp?id=15131能帮助学生应用课堂学习到的知识,加强综合能力,提高系统设计水平。
1.2 毕业设计题目
直流电机控制系统
1.3 设计功能要求
(1)焊接电机控制电路板,调试后电路功能正常; (30 分)
(2)可以通过 5 向按键左右控制电机正反转、侧向按键控制电机启动/停止;(10 分)
(3)通过旋纽电阻控制电机转速或角度(可二选一);(20 分)
(4)相关电机转速或角度,转动方向信息在 LCD1602 或 OLED 上显示; (20 分)
(5)通过 PID 调节,通过旋纽控制转速或转动角度(可二选一),数据通过串口,在电脑上显示曲线(可借助匿名地面站工具),相应的在显示器上显示目标转速或角度。(15 分)
(6)其他。(5 分)
1.4 毕业设计的内容与要求
(1)设计制作硬件电路;
(2)编写单片机系统软件;
(3)软硬件调试;
(4)写毕业设计报告
1.5 实验仪器设备及器件
1)PC机;
2)Keil C51软件;
3)STC15F2K60S2增强型单片机,TB6612电机驱动芯片,直流电机,OLED显示屏;
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//中景园电子
//******************************************************************************/。
#include "oled.h"
#include
#include "oledfont.h"
#include "bmp.h"
#include "intrins.h"
#define nop _nop_();
//#include "delay.h"
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set() ;
// OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
void IIC_Wait_Ack()
{
//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为上拉输入模式
//GPIOB->CRH |= 0x00080000;
// OLED_SDA = 1;
// delay_us(1);
//OLED_SCL = 1;
//delay_us(50000);
/* while(1)
{
if(!OLED_SDA) //判断是否接收到OLED 应答信号
{
//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为通用推免输出模式
//GPIOB->CRH |= 0x00030000;
return;
}
}
*/
OLED_SCLK_Set() ;
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
// OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else {
Write_IIC_Command(dat);
}
}
/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<8;m++)
{
OLED_WR_Byte(0xb0+m,0); //page0-page1
OLED_WR_Byte(0x00,0); //low column start address
OLED_WR_Byte(0x10,0); //high column start address
for(n=0;n<128;n++)
{
OLED_WR_Byte(fill_Data,1);
}
}
}
///***********************Delay****************************************/
//void Delay_50ms(unsigned int Del_50ms)
//{
// unsigned int m;
// for(;Del_50ms>0;Del_50ms--)
// for(m=6245;m>0;m--);
//}
//void Delay_1ms(unsigned int Del_1ms)
//{
// unsigned char j;
// while(Del_1ms--)
// {
// for(j=0;j<123;j++);
// }
//}
//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{ OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f),OLED_CMD);
}
//开启OLED显示
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}
//关闭OLED显示
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
unsigned char i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
} //更新显示
}
void OLED_On(void)
{
unsigned char i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
} //更新显示
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
{
unsigned char c=0,i=0;
c=chr-' ';//得到偏移后的值
if(x>Max_Column-1){x=0;y=y+2;}
if(Char_Size ==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else {
OLED_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
//m^n函数
unsigned int oled_pow(unsigned char m,unsigned char n)
{
unsigned int result=1;
while(n--)result*=m;
return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
{
unsigned char t,temp;
unsigned char enshow=0;
for(t=0;t120){x=0;y+=2;}
j++;
}
}
//显示汉字
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
{
unsigned char t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86772168
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86772168