基于单片机的摇摇棒课程设计 - 图文

更新时间:2023-09-25 08:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

郑州科技学院

《单片机原理及应用》课程设计

1 课程设计的目的 .................................................... 1 2 课程设计的任务与要求 ....................................... 2

2.1 设计目的 ........................................................ 2 2.2 设计要求 ........................................................ 2

3 设计方案与论证.................................................... 3

3.1 LED灯的选择 ............................................... 3 3.2 外部中断信号产生方式 ................................ 3 3.3 抗重影方案的选择 ........................................ 3 3.4 单元电路设计 ................................................ 5 3.5 主程序流程图 ................................................ 6

4 硬件电路设计 ........................................................ 8

4.1 基本原理图 .................................................... 8 4.2 各部分功能 .................................................... 9 4.3 系统硬件 ....................................................... 10 4.4 传感器系统 ................................................... 10

5 系统软件设计 ....................................................... 11

5.1 软件设计思路 ............................................... 11 5.2 主程序流程 ................................................... 12 5.3 软件实现功能的完善 ................................... 13

6 试验与仿真 ........................................................... 13

6.1 硬件调试方法 ............................................... 13 6.2 软件调试方法 ............................................... 14 7 结论 ....................................................................... 16

参考文献 ..................................................................... 18 附录1:总体电路原理图 ......................................... 19 附录2:源程序 .......................................................... 20

1 课程设计的目的

单片机是随着大规模集成电路的出现极其发展,将计算机的CPU,RAM,ROM,定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,因此单片机早期的含义称为单片微型计算机.它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果.单片机应用系统可以分为:(1)最小应用系统是指能维持单片机运行的最简单配置的系统。这种系统成本低廉,结构简单,常构成一些简单的控制系统,如开关状态的输入/输出控制等。片内有ROM/EPROM的单片机,其最小应用系统即为配有晶振,复位电路,电源的单个单片机。片内无ROM/EPROM的单片机,其最小应用系统除了外部配置晶振,复位电路,电源外,还应外接EPROM或EEPROM作为程序存储器用。(2)最小功耗应用系统是指为了保证正常运行,系统的功耗最小。(3)典型应用系统是指单片机要完成工业测控功能所必须的硬件结构系统。

本文将使用单片机对摇动显示进行实例化,设计一个LED摇动显示器来显示文字、图像等信息。掌握利用8051型单片机对发光二极管阵列进行摇动控制的方法。输出信号频率的控制通过单片机来实现,用摇动传感器检测当前摇动状态,用16个发光二极管进行不同频率的亮灭刷新,通过手动摇动可显示输出文字及图案等信息。当进行摇动时,由于人的视觉暂留原理,会在发光二极管摇动区域产生一个视觉平面,在视觉平面内的二极管通过不同频率的刷新,会在摇动区域内产生图像,从而达到在该视觉平面上传达信息的作用。LED显示棒,又称摇摇棒,是一种利用视觉暂留效应制作的“高科技”玩具。可以用“静如处子,动如脱兔”来形容它,即当静止时,它只是几个LED发光二极管(后简称

1

LED),而一旦按照一定的频率去摇晃它,它就会随着位置的变化而变化(亮或灭),最终显示一幅图片或字符串。

随着人们物质生活水平的提高,人们对精神生活的追求也愈加强烈,对信息的渴求已成为了人们必不可少的需要,更加简捷与新颖的信息传递方式无疑会给人们带来耳目一新的感受。而现代工具务求简捷化、便携化,因此,摇动显示装置的到来,必将会给人们带来一种新的方便的文化传递方式。让你的心声闪烁在夜空——LED摇摇棒横空出世!LED摇摇棒又叫摇摇棒、魔棒、闪光棒、闪字棒、闪图棒、星光棒。LED摇摇棒的诞生是闪光系列产品中的一大革命,它最大的神奇之处,是在手中左右摇晃LED摇摇棒,就会在棒子划过的轨迹上留下清析的文字或图案。目前市场上,这是最新,价格最低,可远距离观看的一款电子产品。设计具有市场前景,可满足各种大型演出、集会、游行等宣传需要,为人们的生活提供便利。

2 课程设计的任务与要求

2.1 设计目的

本次设计制作的是一个显示棒,基本要求就是要小巧、轻便,所以要将单片机的系统板简化设计。通过本次设计,加强学生对MCS-51单片机的深刻理解,提高学生的设计能力和动手能力。

2.2 设计要求

设计一个16只高亮度LED发光二极管构成的摇摇棒,通过单片机编程配合手的左右摇晃就可呈现一幅完整的画面,可以显示字符、图片。

2

LED并开始重新判断惯性开关的位置。

5.2 主程序流程

通过软件设计思路分析,得到该系统的主程序流程图3.1如下:

图4-1 主程序流程图

系统开始运行,内部进行初始化后,等待外部中断。当摇动到指定位置时,由滚珠开关出触发外部中断,再经过一段时间延时后开始显示。显示完成返回主程序,等待下一个摇动周期的到来。 经过文字取模后,系统的源程序编制参考附录2:

12

5.3 软件实现功能的完善

本次设计的一个难点是去除重影,我们的解决方法是使用外部中断让数据单程传输。

第二个难点是当显示较长字符时不能完整的显示在一次摇摆的扇形区域内。通过反复试验,我们改变了送数据方式:由一个字符接一个字符传送改为一组字符一起传送,传送结束后再延时,通过不断调试实现了完整显示的功能,同时也解决了画面连续出现没有间断的问题。

综上,只要控制好数据传输方式以及每次传输数据间的延时就可以实现多种数据的显示方法。

6 试验与仿真

单片机应用系统的硬件调试和软件调试是分不可的,许多硬件故障是在调试软件时才发现的。但通常是先排除系统中明显的硬件故障后才和软件结合起来调试的。其一般的调试过程如下:

6.1 硬件调试方法

脱机调试是在电路板加电之前,先用万用表等工具,根据硬件电气原理图和装配图仔细检查样机线路的正确性,并核对元器件的型号,规格和安装是否符合要求。应特别注意电源的走线,防止电源之间的短路和极性错误,并重点检查拓展系统总线是否存在相互间的短路或其他信号线的短路。

对于样机所用的电源事先必须单独调试,调试好后,检查其电压值,负载能力,极性等均符合要求,才能加到系统的各个部件上。在不插片子的情况下,加电检查各插件上引脚的电位,仔细检查各地点电位是否正常,尤其应注意单片机插座上的各点电位是否正常,若有高压,联机

13

时将会损坏开发机。

联机调试通过脱机调试可排除一些明显的硬件故障。有些硬件故障还

是要通过联机调试才能发现和排除。

联机前先断电,把开发系统的仿真插头插到样机的单片机插座上,检查一下开发机与样机之间的电源、接地是否良好。一切正常,即可打开电源。

通电后执行开发机读写指令,对用户机的存储器、I/O端口进行读写操作、逻辑检查,若有故障,可用示波器观察波形。通过对波形的观察分析,寻找故障原因,并进一步排除故障。可能的故障有:线路连接上的逻辑错误、有断线或短路现象、集成电路失效等。

6.2 软件调试方法

软件调试与所选用的软件结构和程序设计技术有关。如果采用模块程序设计技术,则逐个模块调试好以后,再进行系统程序总调试。如果采用实时多任务操作系统,一般是逐个任务,下面进一步予以说明。

对于模块结构程序,要一个个子程序分别调试。调试子程序时,一定要符合现场环境,即入口条件和出口条件。调试的手段可采用单步运行方式和断点运行方式,通过检查用户系统CPU的现场、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。通过检测,可以发现程序中的死循环错误、机器码错误及转移地址的错误,同时也可以发现用户系统中的硬件故障、软件算法及硬件设计错误。在调试过程中不断调整用户系统的软件和硬件,逐步通过一个个程序模块。各程序模块通过后,可以把各功能块联系起来一起进行整体程序综合调试。在这阶段若发生故障,可以考虑各子程序在运行时是否破坏现场,缓冲单元是否发生冲突,零位的建立和清除在设计上有否失误,堆栈区域有否

14

溢出,输入设备的状态是否正常,等等。若用户系统是在开发系统的监控程序下运行时,还要考虑用户缓冲单元是否和监控程序的工作单元发生冲突。

单步和断点调试后,还应进行连续调试,这是因为单步运行只能验证程序的正确与否,而不能确定定时精度、CPU的实时响应等问题。待全部完成后,应反复运行多次,除了观察稳定性之外,还要观察用户系统的操作是否符合原始设计要求、安排的用户操作是否合理等,必要时还要做适当修正。对于实时多任务操作系统的应用程序是由若干个任务程序组成,一般是逐个任务进行调试,在调试某一个任务时,同时也调试相关的子程序、中断服务程序和一些操作系统的程序。逐个任务调试好以后,再使各个任务同时运行,如果操作系统中没有错误,一般情况下系统就能正常运转。在全部调试修改完成后,将用户软件固化于EPROM中,插入用户样机后,用户系统即能离开发机独立工作,至此系统研制完成。

在开始实验设计前,根据实验要求,分析实验所涉及的相关知识点,查阅身边的资料,并根据自己以前所学的理论知识,有了大概设计框图后,在PROTEL中画出原理图,然后根据原理图分析模块焊出电路板,并对模块进行测试。

第一步,测试LED显示电路和C51单片机最小系统。首先测试LED,输入一个简单程序(#includemain(){p1=0*00;p2=0*00;}),发现有一个LED不亮,于是检查该LED的引脚,发现线路断了,接好后LED亮了。于是输入摇摇棒程序,但LED灯不闪,猜测是数码管芯片与插槽接触不良的问题,就把插槽重新焊接,之后,再次检测时,发现有时闪烁有时灯不亮。说明不是插槽的问题,于是反复检查最小系统模块,通过用电压表最数码管的每个引脚进行高低电平测试,最总发现原来是接线问题,即是一根线忘了连接。使得硬件与软件的设置不匹配,从而导

15

致了LED显示不正常。改正后重新测试。手动摇晃可呈现图像。

第二步,测试驱动电路,该模块完好。

第三步,软件测试。在软件方面,改部分主要调延时函数,调试过程简单但费时。于是,多次耐心尝试后软件调试才成功,能够完整并较为清晰地完整图像。

最终,实现摇摇棒功能

7 结论

在王老师的指导下,通过一段时间完成了摇摇棒的设计,本次设计以水银开关和单片机的实际应用为背景,介绍了以单片机为核心显示设计的基本结构和基本原理。

本次将使用单片机对摇动显示进行实例化,设计一个LED摇动显示器来显示文字、图像等信息。掌握利用8051型单片机对发光二极管阵列进行摇动控制的方法。输出信号频率的控制通过单片机来实现,用水银开关摆动状态和16个发光二极管进行不同频率的亮灭刷新,通过手动摇动可显示输出文字及图案等信息。当进行摇动时,由于人的视觉暂留原理,会在发光二极管摇动区域产生一个视觉平面,在视觉平面内的二极管通过不同频率的刷新,会在摇动区域内产生图像,从而达到在该视觉平面上传达信息的作用。

设计综合运用了字模转换软件。同时查阅了大量相关资料,包括查阅相关书籍和网上的资料,获得了一些相关信息。在设计方面,采用了在变量自加的原理,在经过逐个读取的方法来显示要显示的内容。最后还得出以下几点:

准备越充分,实做越顺利

在做设计前了解相关知识、材料、方法可以避免许多没有必要的麻烦,一步一个脚印就不必“从头再来”。最不能容忍的是在开始的几步偷懒,造成后面总有一些无法排除的障碍。

温故而知新

课程设计发端之始,思绪全无,举步维艰,对于理论知识学习不够扎实的我深感知识的不够,便重拾教材对知识系统而全面进行了梳理,终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识。

思路即出路

当初没有思路,诚如举步维艰,茫茫大地,不见道路。在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。顿悟,没有思路便无出路,原来思路即出路。

16

2,0x40,0x82,0x40,

0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\日\

/* (16 X 16 , 宋体 ) */

0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31,

0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*\快\

/* (16 X 16 , 宋体 ) */

0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F,

0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*\乐\

/* (16 X 16 , 宋体 ) */

0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,0xFE,0x7F,0x23,0x02,0x22,0x41,0x20,0x40,

0x20,0x20,0xFF,0x13,0x20,0x0C,0x22,0x14,0x2C,0x22,0xA0,0x41,0x20,0xF8,0x00,0x00,/*\我\

/* (16 X 16 , 宋体 ) */

0x80,0x00,0x64,0x41,0x2C,0x21,0x34,0x91,0x24,0x89,0x24,0x87,0xEC,0x4D,0x32,0x55,

0x22,0x25,0x22,0x25,0x32,0x55,0x2E,0x4D,0x23,0x81,0xA2,0x80,0x60,0x80,0x00,0x00,/*\爱\

/* (16 X 16 , 宋体 ) */

0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x10,0x20,0x0C,0x18,0x03,

0x0F,0x40,0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01,0x28,0x06,0x18,0x18,0x00,0x00,/*\你\

/* (16 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\!\

22

/* (16 X 16 , 宋体 ) */

}; //汉字编码

/********显示编码END*******************/

/**********函数声明******************/ void display1(void); //显示汉字子函数

void display2(void); //显示LOVE图案子函数 void display3(void); //显示心形图案子函数 void display4(void); //显示笑脸图案子函数

/*********n(us)延时子程序***********/ void DelayUs(uint M) {

uint x;

for(x=0;x<=M;x++); }

/**********INT0中断服务程序***********/ void intersvr0(void) interrupt 0 using 1 {

KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)

if(KY==0) {

num++; //计算中断次数 switch(pic) //选择画面 {

case 0:

display1();break; case 1:

display2();break; case 2:

display3();break; case 3:

display4();break; default:

display1(); } }

23

}

/*********显示子程序1(汉字)*********/ void display1(void) {

uchar i; if(num>10) {

disp++; num=0;

} //12个汉字分为3次显示完(每次显示4个),每中断10次切换

if(disp>=2) disp=0;

DelayUs(3400); //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可

for(i=0;i<64;i++) {

P1=~hanzi[disp*128+i*2]; P2=~hanzi[disp*128+i*2+1]; DelayUs(95); P2=0xff; P1=0xff; } }

/***********显示子程序2(LOVE)********/ void display2(void) {

uchar i;

DelayUs(2000); for(i=0;i<64;i++) {

P1=~love[i*2]; P2=~love[i*2+1]; DelayUs(130); } }

/*******显示子程序3(心形图案)*******/ void display3(void) {

24

uchar i;

DelayUs(1100); for(i=0;i<64;i++) {

P1=~loveyou[i*2]; P2=~loveyou[i*2+1]; DelayUs(200); } }

/********显示子程序4(呵呵o(∩_∩)o图案)********/ void display4(void) {

uchar i;

DelayUs(2500); for(i=0;i<64;i++) {

P1=~hehe[i*2]; P2=~hehe[i*2+1]; DelayUs(120); } }

/*****主函数*****/ void main(void) {

IT0=1; EX0=1;

EA=1; //开中断,下降沿中断 KY=0;

while(1) //主程序中只检测按键 {

if(KEY==0) //画面切换键按下 {

DelayUs(10000); //按键去抖 if(KEY==0); pic++; }

if(pic>3)pic=0; } }

25

26

本文来源:https://www.bwwdw.com/article/kpkd.html

Top