微控制器课程设计报告.docx

上传人:b****5 文档编号:7271442 上传时间:2023-01-22 格式:DOCX 页数:62 大小:3.12MB
下载 相关 举报
微控制器课程设计报告.docx_第1页
第1页 / 共62页
微控制器课程设计报告.docx_第2页
第2页 / 共62页
微控制器课程设计报告.docx_第3页
第3页 / 共62页
微控制器课程设计报告.docx_第4页
第4页 / 共62页
微控制器课程设计报告.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

微控制器课程设计报告.docx

《微控制器课程设计报告.docx》由会员分享,可在线阅读,更多相关《微控制器课程设计报告.docx(62页珍藏版)》请在冰豆网上搜索。

微控制器课程设计报告.docx

微控制器课程设计报告

 

前言

1.单片机应用介绍:

1.1、什么是单片机:

将微处理器(CPU)、存储器(ROM和RAM等)、输出/输入口(I/O口)、定时/计数器、中断系统等集成在一块集成电路芯片上。

称之为单片微型计算机,简称单片机(MCU)。

1.2、单片机的应用领域:

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹:

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机,更不用说自动控制领域的机器人、智能仪表、医疗器械了。

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。

2.MCS-51单片机简单介绍:

MCS-51系列单片机是美国Intel公司开发的8位单片机,又可以分为多个子系列。

MCS-51系列单片机共有40条引脚,包括32条I/O接口引脚、4条控制引脚、2条电源引脚、2条时钟引脚。

 

1数码管显示系统

1.1设计任务

利用动态显示方式实现在数码管上稳定显示123456。

1.2设计思路

通过编程设置单片机的I/O口分别作为数码管的位选和段选控制端,控制数码管的动态显示。

1.3工作原理及参考连线

如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。

否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。

LED灯的显示原理:

通过同名管脚上所加电平的高低来控制发光二极管是否点量而显示不同的字形如SP,g,f,e,d,c,b,a管角上加上7FH所以SP上为0伏,不亮其余为TTL高电平,全亮则显示为8。

键盘扫描及数码管显示单元原理图

硬件接线图如下:

 

图8255内部结构及外部引脚图

图8255控制字格式

 

芯片8255介绍

芯片说明:

8255A是Intel公司生产的可编程输入输出接口芯片,它具有3个8位的并行I/O口,具有三种工作方式,可通过程序改变其功能,因而使用灵活,通用性强,可作为单片机与多种外围设备连接时的中间接口电路。

8255有三种基本工作方式, 三种工作方式由工作方式控制字决定,方式控制字由CPU通过输入/输出指令来提供.三个端口中PC口被分为两个部分,上半部分随PA口称为A组,下半部分随PB

口称为B组.其中PA口可工作与方式0、1和2,而PB口只能工作在方式0和1。

8255共有40个引脚,采用双列直插式封装,各引脚功能如下:

D0--D7:

三态双向数据线,与单片机数据总线连接,用来传送数据信息。

CS:

片选信号线,低电平有效,表示芯片被选中。

RD:

读出信号线,低电平有效,控制数据的读出。

WR:

写入信号线,低电平有效,控制数据的写入。

Vcc:

+5V电源。

PA0--PA7:

A口输入/输出线。

PB0--PB7:

B口输入/输出线。

PC0--PC7:

C口输入/输出线。

RESET:

复位信号线。

A1、A0:

地址线,用来选择8255内部端口。

GND:

地线

1.4软件设计

源程序:

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[]=//段选代码

{0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

ucharcodeaddress[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选代码

voiddelay(uint);

voidmain()

{

ucharm=0;

while

(1)

{

if(m==6)m=0;//选六位

P2=address[m];//送位选信号,确定要显示的数码管

P1=table[m++];//送段选信号,确定要显示的数字

delay(500);

}

}

voiddelay(uintm)//延时函数

{

while(m--);

}

1.5实验调试结果

在数码管上稳定显示123456

1.6实验心得体会

刚下载这个程序的时候,没有显示成功,是因为所给程序的位选数码管是8位,而实验箱的数码管个数是6位修改后,实验成功。

但是下次还是应该注意段选和位选的问题。

 

2步进电机控制系统

2.1设计任务

通过单片机的I/O口控制步进电机运转,实现正转和反转。

2.2设计思路

通过编程设置单片机的P1口分别作为四相步进电机的电流输入信号,控制达林顿驱动芯片连接的步进电机的转动。

2.3工作原理及参考连线

使用开环控制方式能对步进电机的方向、速度和角度进行调节。

所谓步进,就是指每给步进电机一个递进脉冲,步进电机各绕组的通电顺序就改变一次,即电机转动一次。

根据步进电机控制绕组的多少可以将电机分为三相、四相和五相。

课程设计中所使用的步进电机为四相八拍电机,电压为DC5V,其励磁线圈及其励磁顺序如图及表所示。

图励磁线圈表励磁顺序

步进电机控制参考线路图

表P0端口引脚的电平在各步中的情况

注意:

步进电机在不使用时请断开连接,以免误操作使电机过分发热。

步进电机的主要特性:

1)步进电机必须加驱动才可以运转,驱动型号必须为脉冲信号,没有脉冲的时候,步进电机静止,如

果加入适当的脉冲信号,就会以一定的角度(称为步角)转动。

转动的速度和脉冲的频率成正比。

2)腾龙版步进电机的步进角度为7.5度,一圈360度,需要48个脉冲完成。

3)步进电机具有瞬间启动和急速停止的优越特性。

4)改变脉冲的顺序,可以方便的改变转动的方向。

2.4软件设计

源程序:

#include"sst89x5x4.h"

sbitK1=P3^0;//控制正转

sbitK2=P3^1;//控制反转

sbitK3=P3^2;//控制停止

unsignedcharL_value[8]={0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06};//电机旋转对应的代码

voiddelay()

{

unsignedinti;

for(i=0;i<30000;i++);

}

voidmain()

{

unsignedcharm,n;

P0=0x0;

while

(1)

{

if(K1==1)

for(n=0;n<12;n++)//正转一周

{

for(m=0;m<8;m++)

{

P0=L_value[m];

delay();

}

}

elseif(K2==1)

for(n=0;n<12;n++)//反转一周

{

for(m=8;m>0;m--)

{

P0=L_value[m-1];

delay();

}

}

elseif(K3==1)P1=0;//停止

}

}

2.5实验调试结果

2.6实验心得体会

原来所给程序异步电机的正转和反转都是在一个主程序中,先正转在自动反转,而我们组后来加以改进通过开关控制按键,实现了主动控制异步电机的正转,反转和停止。

 

3直流电机PWM调速系统

3.1设计任务

利用单片机控制直流电机,掌握脉宽调制直流调速的方法。

通过调节脉冲宽度,改变占空比,从而改变输出,达到改变直流电机转速的目的。

3.2设计思路

通过编程设置单片机的I/O口分别作为直流电机的一极控制端,另一极与+12V直流电源的正极相连,通过单片机的P1.7口来模拟PWM输出,经过驱动电路来驱动直流电机,实现脉宽调速。

3.3工作原理及参考连线

直流电机单元由DC12V、1.1W的直流电机、小磁钢、霍尔元件及输出电路构成。

PWM的示意图如图所示。

通过调节T1的脉冲宽度,可以改变T1的占空比,从而改变输出,达到改变直流电机转速的目的。

PWM脉冲示意图

通过单片机的P1.7口来模拟PWM输出,经过驱动电路来驱动直流电机,实现脉宽调速。

将P1.7直接与驱动电路的A端连接,驱动单元的输出A’连接直流电机单元的2端。

直流电机接线图

3.4软件设计

源程序:

#include

#defineT_value(unsignedchar)0x80//T周期值

#defineT1_value(unsignedchar)0x20//T周期中高电平周期T1值

#defineTH0_value(unsignedchar)0xFE//定时器T0计数值(高)

#defineTL0_value(unsignedchar)0x00//定时器T0计数值(低)

sbitDRV=P1^7;//设端口

unsignedcharT_Count;//延时次数

voidinit_tim0()//定时器0初始化,定时基数

{

TMOD=0x01;

TH0=TH0_value;

TL0=TL0_value;

TR0=1;

ET0=1;

EA=1;

}

voidint_tim0()interrupt1

{

TH0=TH0_value;

TL0=TL0_value;//越小,计数初值越大

T_Count--;

}

voidmain()

{

unsignedcharTx;

DRV=0;

init_tim0();

T_Count=T1_value;

Tx=T1_value;

while

(1)

{

if(T_Count==0)

{

DRV=~DRV;

Tx=T_value-Tx;

T_Count=Tx;

}

}

}

3.5实验调试结果

3.6实验心得

这个程序利用定时/计数器0来控制P17输出方波的占空比。

通过改变占空比,来实现直流电机的调速。

若P17输出方波的占空比越小,电机的转速越快。

 

4键盘显示设计

4.1:

设计内容:

利用8255单元与键盘及数码管显示单元连接,扫描键盘输入,并将扫描结果送数码管显示。

当按下其中一个键时,将对应的编号在一个数码管上显示,当再按下时,将这个按键的编号显示在下一个数码管上,数码管可显示最近几次按下的按键编号。

4.2工作原理:

8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,用+5V单电源供电,能在以下三种方式下工作:

方式0--基本输入/输出方式、方式1--选通输入/输出方式、方式2--双向选通工作方式。

8255的内部结构及引脚如图所示,8255工作方式控制字和C口按位置位/复位控制字格式如图所示。

图8255内部结构及外部引脚图

图8255控制字格式

键盘扫描及数码管显示单元原理图

4.3原理图

芯片说明:

8255A是Intel公司生产的可编程输入输出接口芯片,它具有3个8位的并行I/O口,具有三种工作方式,可通过程序改变其功能,因而使用灵活,通用性强,可作为单片机与多种外围设备连接时的中间接口电路。

8255有三种基本工作方式, 三种工作方式由工作方式控制字决定,方式控制字由CPU通过输入/输出指令来提供.三个端口中PC口被分为两个部分,上半部分随PA口称为A组,下半部分随PB口称为B组.其中PA口可工作与方式0、1和2,而PB口只能工作在方式0和1。

8255共有40个引脚,采用双列直插式封装,各引脚功能如下:

D0--D7:

三态双向数据线,与单片机数据总线连接,用来传送数据信息。

CS:

片选信号线,低电平有效,表示芯片被选中。

RD:

读出信号线,低电平有效,控制数据的读出。

WR:

写入信号线,低电平有效,控制数据的写入。

Vcc:

+5V电源。

PA0--PA7:

A口输入/输出线。

PB0--PB7:

B口输入/输出线。

PC0--PC7:

C口输入/输出线。

RESET:

复位信号线。

A1、A0:

地址线,用来选择8255内部端口。

GND:

地线。

键盘扫描及数码显示接线图

4.4实验源程序:

#include"Absacc.h"

#defineC8255_AXBYTE[0x7F00]//8255端口地址定义

#defineC8255_BXBYTE[0x7F01]

#defineC8255_CXBYTE[0x7F02]

#defineC8255_CONXBYTE[0x7F03]

//数码管显示编码

unsignedchara[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//显示缓冲

unsignedcharb[]={0x00,0x00,0x00,0x00,0x00,0x00};

unsignedcharkey_down;

unsignedcharkey_value;

unsignedcharkey_count;

voiddelay(unsignedinttime)

{

unsignedinti;

for(i=0;i

}

voidkeyscan()//按键扫描函数

{

unsignedcharcc;

C8255_A=0x00;//X1~X4置0

cc=C8255_C;//得到Y1~Y4的值

key_down=(~cc)&0x0f;

}

voiddisplay()//显示函数

{

unsignedchari,j=0xDF;//选位

for(i=0;i<6;i++)

{

C8255_A=0xFF;//11111111

C8255_B=a[b[i]];//查表输出显示

C8255_A=j;//X选择

delay(0x100);

j=(j>>1)|(j<<7);//右移1位

}

}

voidclear()//清屏

{

C8255_B=0x00;//屏幕显示0

}

voidwritebuffer()

{

b[key_count]=key_value;//

key_count--;

if(key_count==-1)

key_count=5;

display();

clear();

keyscan();

while(key_down)//键盘消抖

{

display();

clear();

keyscan();

}

}

voidgetkey()//得到按键值

{

unsignedcharvalue;

unsignedchari,j=0xFE;

for(i=0;i<4;i++)

{

C8255_A=j;

value=C8255_C;

if(!

(value&0x01))//行1

{

key_value=i+0;

writebuffer();

return;

}

if(!

(value&0x02))//行2

{

key_value=i+4;

writebuffer();

return;

}

if(!

(value&0x04))//行3

{

key_value=i+8;

writebuffer();

return;

}

if(!

(value&0x08))//行4

{

key_value=i+12;

writebuffer();

return;

}

j<<=1;

}

}

voidmain()

{

C8255_CON=0x81;//8255初始化

key_count=5;

while

(1)

{

display();//显示

clear();//清屏

keyscan();//按键扫描

if(key_down)//判是否有键按下

{

display();

delay(0x80);

clear();

keyscan();

if(key_down)

{

getkey();//得到按键值

}

}

}

}

 

提高部分:

设计内容1:

利采用4*4键盘,将键盘进行标号,记做0~F,当按下其中一个按键时,将该按键对应的编号在一个数码管显示出来。

#include"Absacc.h"

#defineC8255_AXBYTE[0x7F00]//8255端口地址定义

#defineC8255_BXBYTE[0x7F01]

#defineC8255_CXBYTE[0x7F02]

#defineC8255_CONXBYTE[0x7F03]

//数码管显示编码

unsignedchara[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//显示缓冲

unsignedcharb[]={0x00,0x00,0x00,0x00,0x00,0x00};

unsignedcharkey_down;

unsignedcharkey_value;

unsignedcharkey_count;

voiddelay(unsignedinttime)//延时

{

unsignedinti;

for(i=0;i

}

voidkeyscan()//按键扫描函数

{

unsignedcharcc;

C8255_A=0x00;//X1~X4置0

cc=C8255_C;//得到Y1~Y4的值

key_down=(~cc)&0x0f;

}

voiddisplay()//显示函数

{

unsignedchari,j=0xDF;//10101111

for(i=0;i<6;i++)

{

C8255_A=0xFF;

C8255_B=a[b[i]];//查表输出显示

C8255_A=j;

delay(0x100);

j=(j>>1)|(j<<7);

}

}

voidclear()//清屏

{

C8255_B=0x00;

}

voidwritebuffer()

{

b[key_count]=key_value;

display();

clear();

keyscan();

while(key_down)//键盘消抖

{

display();

clear();

keyscan();

}

}

voidgetkey()//得到按键值

{

unsignedcharvalue;

unsignedchari,j=0xFE;

for(i=0;i<4;i++)

{

C8255_A=j;

value=C8255_C;

if(!

(value&0x01))//行1

{

key_value=i+0;

writebuffer();

return;

}

if(!

(value&0x02))//行2

{

key_value=i+4;

writebuffer();

return;

}

if(!

(value&0x04))//行3

{

key_value=i+8;

writebuffer();

return;

}

if(!

(value&0x08))//行4

{

key_value=i+12;

writebuffer();

return;

}

j<<=1;

}

}

voidmain()

{

C8255_CON=0x81;//8255初始化

key_count=3;

while

(1)

{

display();//显示

clear();//清屏

keyscan();//按键扫描

if(key_down)//判是否有键按下

{

display();

delay(0x80);

clear();

keyscan();

if(key_down)

{

getkey();//得到按键值

}

}

}

}

 

设计内容2:

实现功能:

采用4X4键盘,将键盘进行编号,记作0~F,当按下其中一个按键时,将该按键对应的编号在同时在单独1个数码管上显示出来。

源程序:

#include"Absacc.h"

#defineC8255_AXBYTE[0x7F00]//8255端口地址定义

#defineC8255_BXBYTE[0x7F01]

#defineC8255_CXBYTE[0x7F02]

#defineC8255_CONXBYTE[0x7F03]

//数码管显示编码

unsignedchara[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//显示缓冲

unsignedcharb[]={0x00,0x00,0x0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1