《电子工程训练》报告.docx
- 文档编号:30184741
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:13
- 大小:305.20KB
《电子工程训练》报告.docx
《《电子工程训练》报告.docx》由会员分享,可在线阅读,更多相关《《电子工程训练》报告.docx(13页珍藏版)》请在冰豆网上搜索。
《电子工程训练》报告
大连理工大学本科实验报告
题目:
基于51单片机的点阵显示及直流电机控制
课程名称:
《电子工程训练》
学院(系):
电子科学与技术学院
专业:
集成电路设计与集成系统
班级:
电集1001
学号:
201081086
学生姓名:
陈朝吉
成绩:
2012年9月28日
题目:
基于51单片机的点阵显示及直流电机控制
1设计要求
以51单片机为核心,设计、焊接并调试一个实际单片机控制系统,实现点阵显示姓名及学号,并利用系统实现驱动直流电机控制玩具挖掘机。
系统设计具体要求:
(1)电源电路(交、直流供电)。
(2)51单片机最小系统。
(3)单个LED灯闪烁。
(4)点阵显示(三极管驱动),分流动态和闪动态两种显示方式。
(5)三路直流电机驱动电路。
(6)按键控制电机转动并在点阵同步显示。
2设计分析及系统方案设计
基于51单片机最小系统实现,这里分为硬件和软件俩部分进行设计。
(1)硬件部分:
a.设计绘制电路原理图
b.焊接实物电路
c.电路测试
硬件系统框图如下:
(2)软件部分:
a.编写系统源程序
b.系统程序调试(结合硬件电路)
3各功能模块硬件电路设计
(1)电源电路
a.直流供电
b.交流供电
(2)51单片机最小系统
(3)点阵驱动电路
(4)直流电机驱动电路(H桥电路)
4系统软件设计
(1)流程图为:
(2)程序源代码为:
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitmetor1_a=P1^0;
sbitmetor1_b=P1^1;
sbitmetor2_a=P1^2;
sbitmetor2_b=P1^3;
sbitmetor3_a=P1^4;
sbitmetor3_b=P1^5;//3个电机控制
sbitkey_metor1=P3^0;//3个按键控制3个电机
sbitkey_metor3=P3^1;
sbitkey_metor2=P3^2;
sbitled=P3^7;//led位声明
ucharcnta;//列选
ucharcntb;//行选
ucharcntc;
ucharcntd;
uchara,b,c,d;
ucharflag0,flag1;//流动标志,自加1为向左移一位
uinttimecount0,timecount1,timecount,t;//计数控制流动速度
ucharcodetab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//列扫描数组
ucharcodedigittab[10][8]={//行显数组
{0x40,0x57,0x55,0xf5,0x55,0x57,0x40,0x00},//吉
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//2
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0
{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//1
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},//8
{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//1
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},//8
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00},//6
};
ucharcodemetor_printf[8][8]={//行显数组(三路电机,初始默认为+++)
{0x20,0x70,0x24,0x0e,0x24,0x70,0x20,0x00},//+++
{0x20,0x70,0x24,0x0e,0x24,0x20,0x20,0x00},//++-
{0x20,0x70,0x24,0x04,0x24,0x70,0x20,0x00},//+-+
{0x20,0x70,0x24,0x04,0x24,0x20,0x20,0x00},//+--
{0x20,0x20,0x24,0x0e,0x24,0x70,0x20,0x00},//-++
{0x20,0x20,0x24,0x0e,0x24,0x20,0x20,0x00},//-+-
{0x20,0x20,0x24,0x04,0x24,0x70,0x20,0x00},//--+
{0x20,0x20,0x24,0x04,0x24,0x20,0x20,0x00},//---
};
voidinit();
voiddelay_ms(ucharm);
voidkey_scan();//函数声明
voidmain()
{P1=0xd5;//初始化,默认010101为三个电机正向
init();
while
(1)
{
key_scan();//调用键盘检测函数
}
}
voidinit()//初始化化函数
{cnta=0;
cntb=0;
cntb=0;
a=0;
b=0;
c=0;
flag0=0;//显示切换标志
flag1=0;
timecount0=0;//计数
timecount1=0;//计数
t=80;//流动显示移位计数
TMOD=0x11;//中断工作方式设置
TH0=(65536-3000)/256;//定时器0赋初值
TL0=(65536-3000)%256;//定时器0赋初值,约为3ms扫描时间
TH1=(65536-50000)/256;//定时器1赋初值
TL1=(65536-50000)%256;//定时器1赋初值,约为50ms扫描时间
EA=1;//开启总中断
ET0=1;//开启定时器/计数器0中断
ET1=1;//开启定时器/计数器1中断
TR0=1;//定时0启动
TR1=1;
}
voiddelay_ms(ucharm)//延迟函数(精确到毫秒)
{uchari,j;
for(i=m;i for(j=122;j>0;j--); } voidkey_scan()//按键检测函数 { if(key_metor1==0) {delay_ms(10);//消抖 if(key_metor1==0)//确实有按键按下 {while(! key_metor1);//等待按键释放 metor1_a=! metor1_a; metor1_b=! metor1_b;//取反,电机反向 a=! a; ET0=0;//关闭开启定时器0 P0=0xff;//点阵消影 flag0=2;//进入电机状态显示 ET0=1;//重现开启定时器0 } } if(key_metor2==0) {delay_ms(10); if(key_metor2==0) {while(! key_metor2); metor2_a=! metor2_a; metor2_b=! metor2_b; b=! b; ET0=0; P0=0xff; flag0=2; ET0=1; } } if(key_metor3==0) {delay_ms(10); if(key_metor3==0) { while(! key_metor3); metor3_a=! metor3_a; metor3_b=! metor3_b; c=! c; ET0=0; P0=0xff; flag0=2; ET0=1; } } d=(a*4+b*2+c*1);//通过a、b、c三位算出点阵行显数组(电机) } voidt0(void)interrupt1//定时器0中断服务程序 {TH0=(65536-3000)/256;//定时器高位装载数据 TL0=(65536-3000)%256;//定时器低位装载数据 if(flag0==0)//流动动显示,flag0为标志 { P0=tab[cnta];//列选 P2=~digittab[cntc][cntb];//行选 if(++cnta>=8-flag1)cnta=0; if(++cntb>=8)cntb=flag1; if(++timecount0>=t)//流动延迟时间约为 {timecount0=0; flag1++; t=t-10; cntb=flag1; P0=0xff; if(flag1>=8) {flag1=0;t=80; if(++cntc>=10) {cntc=0; flag0=1; } } } } if(flag0==1)/闪动显示,flag0为标示 {P0=tab[cnta];//列选 P2=~digittab[cntd][cnta];//行选,显示单个数字 if(++cnta>=8)cnta=0; if(++timecount>=333)//单个数字显示延迟计数,延迟时间约333*3ms=1s { timecount=0; if(++cntd>=10)//单个数字显示延迟后,cntb自加1,进入下个数 //字扫描显示 {cntd=0;flag0=2; } } } if(flag0==2)//进入直流电机显示 {P0=tab[cnta];//列选 P2=~metor_printf[d][cnta]; if(++cnta>=8)cnta=0; } } voidt1(void)interrupt3//定时器1中断服务程序 {TH1=(65536-50000)/256;//定时器1赋初值 TL1=(65536-50000)%256;//定时器1赋初值 if(++timecount1>=20) {led=! led;//led每隔50ms*20=1s闪烁 timecount1=0; } } 5系统调试运行结果说明计分析 (1)系统运行的硬件环境: winXP电脑一台 (2)系统运行的软件环境: MedWin(集成开发环境),SuperPro/Z(编程器),软件仿真KeilC51(C51编译器)。 (3)系统运行结果: a.单个LED灯在系统控制下以约1s的时间间隔实现闪烁。 b.点阵闪动显示中,以约1s的时间间隔闪动显示“吉201081086”。 c.点阵流动显示中,点阵实现流动速度可控从右往左流动显示出“吉201081086”。 d.直流电机控制部分,三个按键分别控制三个电机转动方向,每按下一次按键,相对应的电机实现反转,实现控制挖掘机工作。 e.综合以上模块功能后,系统成功实现LED以一秒时间闪烁(独立于其他模块),而点阵在系统上电后先流动后闪动显示出“吉201081086”,然后显示三个电机初始的默认状态“+++”,若有按键按下,则相应的电机反转,同时点阵上对应的“+”变成“-”。 若先初始阶段(还没完成流动或者闪动显示)即有按键按下,则点阵立即切换显示相应的三个电机的状态。 若按下系统复位键,则系统重复上述程序运行过程。 注: 上述所付源程序为综合各个模块功能后的控制程序,这里略去各个独立模块的单独源程序。 6结论 本次实践电子电路系统基本成功实现题目设计要求功能。 硬件电路焊接部分,总体布线整体性相对较好,不足之处是在焊接过程中不注意板子的磨损导致氧化,使得电机驱动电路扩展到另一块板上,在安装原理电路图焊接实物电路的过程中,深有体会一点便是先对布线进行规划再具体焊接,可节省后续布线的检查和电路调试验证大量时间,且易发现错误,同时布线也达到美观。 软件部分,基于51单片机采用C语言编程,更加简易明了。 系统中采用单片机P0和P2作为点阵的列选和行选控制端口。 LED灯采用P3.7口控制,控制电机的三个按键分别接到P3.0、P3.1、P3.2口。 点阵显示电路和LED闪烁分别应用51单片机自带的两个定时器中断进行控制,这样可以实现精确地控制点阵显示和led闪烁的时间控制。 三个按键为独立按键,满足任意控制三个电机的转动,达到驱动小挖掘机工作。 参考文献 《新概念51单片机C语言教程——入门、提高、开发、扩展全攻略》电子工业出版社,郭天祥著。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子工程训练 电子 工程 训练 报告