《电子工程训练》报告.docx
《《电子工程训练》报告.docx》由会员分享,可在线阅读,更多相关《《电子工程训练》报告.docx(13页珍藏版)》请在冰豆网上搜索。
![《电子工程训练》报告.docx](https://file1.bdocx.com/fileroot1/2023-8/5/b10f3075-6252-4bb3-beef-9ab8d8eda7fd/b10f3075-6252-4bb3-beef-9ab8d8eda7fd1.gif)
《电子工程训练》报告
大连理工大学本科实验报告
题目:
基于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;ifor(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语言教程——入门、提高、开发、扩展全攻略》电子工业出版社,郭天祥著。