资源描述
应用物理学专业实验课程设计
题 目
学生姓名
学 号
学 院
专业班级
指引教师
完毕日期
太原理工大学
应用物理学专业实验课程设计任务书
课程设计题目:
基于单片机16LED摇摇棒设计
设计目:
针对物理学专业实验课程规定,对学生进行实用型电子线路设计、安装、调试等各环节综合性训练,培养学生运用课程中所学理论与实践紧密结合,独立地解决实际问题能力。
设计任务和规定:
1. 基于AT89S52单片机设计一款LED显式棒(又称摇摇棒);
2. 该摇摇棒可以显示字母、中文及简朴图案等;
3. 掌握点阵屏显示原理,并将其运用到摇摇棒显示中去;
4. 学会使用Altium Designer设计印制电路板;
设计内容:
1. 画出摇摇棒原理图;
2. 画出软件程序流程图;
3. 焊接电路板,调试程序,并对不合理之处加以改正;
4. 递交课程设计报告(打印稿),程序应有恰当注释。
推荐重要参照文献:
1. 张俊谟.单片机中级教程.北京航空航天大学出版社,.10
2. 赵建领.单片机开发宝典.电子工业出版社,.4
3. 谭浩强.C程序设计.清华大学出版社,.7
4. 电子线路基本轻松入门.人民邮电出版社,.6
5. 杜洋.制作SHOOK16摇摇棒.无线电杂志,.1
学生应交出设计文献:
1. 课程设计阐明书
2. 摇摇棒电路原理图
工作筹划及进度:
12月25日—12月27日:查阅资料;
……
……
……
专业班级
规定设计工作起止日期
指引教师签字: 日期
教研室主任审查签字: 日期
系主任批准签字: 日期
应用物理学专业实验课程设计阐明书
基于单片机16LED摇摇棒设计
目录
第一章 概述 2
第二章 设计方案 3
2.1 设计目 3
2.2 设计规定 3
2.3 设计思路 3
第三章 硬件设计 4
3.1 水银开关 4
3.1.1 水银开关原理: 4
3.2 摇摇棒原理图 4
3.2.1 单片机最小系统: 5
3.2.2 LED显示系统: 5
3.3 硬件制作 6
第四章 软件设计 8
4.1 软件设计思路 8
4.2 主程序流程图 8
4.3 中文取模软件 9
4.4 程序编写 10
第五章 总结 16
参照文献 17
第一章 概述
标题:黑体16磅加粗居中,单倍行距,段前0磅,段后18磅
内容:宋体12磅,多倍行距 1.5行,段前段后0磅
注意:每一章都要从新一页开始。
LED显示棒,又称摇摇棒,是一种运用视觉暂留效应制作“高科技”玩具。可以用“静如处子,动如脱兔”来形容它,即当静止时,它只是几种LED发光二极管(后简称LED) ,而一旦按照一定频率去摇晃它,它就会随着位置变化而变化(亮或灭),最后显示一幅图片或字符串。
……
本设计规定制作LED显示棒。通过摇晃时形成亮灯区域能辨别出“蓝色”两个字。
一级节标题:黑体14磅顶左,单倍行距,段前24磅,段后6磅
第二章 设计方案
2.1 设计目
本次设计制作是一种显示棒,基本规定就是要小巧、轻便,因此要将单片机系统板简化设计。 通过本次设计,加强学生对MCS-51单片机深刻理解,提高学生设计能力和动手能力。
2.2 设计规定
设计一种16只高亮度LED发光二极管构成摇摇棒,通过单片机编程配合手左右摇晃就可呈现一幅完整画面,可以显示字符、图片。
2.3 设计思路
本系统规定设计一种LED显示棒且需要有按键进行内容切换,它重要是由中央控制某些,LED驱动某些,LED显示某些以及电源某些构成。
单片机将提取字模进行存储,当接受到按键输入指令时单片机就将相应字模代码通过I/O口输出,使LED灯点亮,运用视觉暂留原理最后使图案完整显示在摆动显示屏中。
1. LED灯选取:高亮LED发光二极管。高亮LED比普通LED显示效果要好诸多。
2. 外部中断信号产生方式:通过外部中断可以控制数据开始传播时刻。选取好外部中断来源是本次制作难点及重点。使用水银开关。通过摇晃使得水银开关水银珠与触点接触和断开,运用这种接触产生电平变化来触发中断,结合软件控制显示,制作简朴,使用以便。
3. 16只LED发光管作为画面每一列显示,左右摇晃起到了扫描作用人眼视觉暂留现象使得看到是一幅完整画面。与LED点阵显示有几分相仿。
第三章 硬件设计
3.1 水银开关
水银开关,又称倾侧开关,是电路开关一种,以一接着电极小巧容器储存着一小滴水银,容器中多数为真空或注入惰性气体。
3.1.1 水银开关原理:
图1 水银开关剖析图
图片标注: 楷体 12磅 置于图片下居中,序号与图片名间空两格
二级节标题:黑体13磅顶左,单倍行距,段前12磅,段后6磅,序号与题名间空两格
由于重力关系,水银水珠会随容器中较低地方流去,如果同步接触到两个电极话,开关便会将电路闭合,启动开关。 注意:水银对人体及环境均有毒害,因而使用水银开关时,请务必小心谨慎,以免破出;在不再使用时,也应当妥善解决。
3.2 摇摇棒原理图
图2 摇摇棒原理图
上图包括两个重要某些:单片机最小系统和LED显示某些。
3.2.1 单片机最小系统:
图3 振荡电路
本装置采用了AT89S52单片机,它支持直接通过串口线下载程序,对于本设计而言,显示文字需经常变化,AT89S52以便许多,因而选取AT89S52作为本设计所用单片机。
振荡电路采用12MHz晶振,每个机器周期为1μs。
ISP选取为六脚ISP下载口,由于摇摇棒为长条形外观,使用六脚ISP下载口可以更节约空间。
图4 ISP下载口
3.2.2 LED显示系统:
本装置采用了16个3MM高亮LED,
其额定工作电压在3V左右,因而可串联
一种可承受较大电流二极管1N4007来进行分压,为设计以便,二极管采用共阳接法。16个LED分别接在P0和P2口上。
图5 LED显示模块
一方面,咱们依照LED点阵屏显示原理:点阵屏显示分为行扫描与列扫描两种,列扫描是将咱们字模数组通过点阵屏行驱动进行输入,然后通过列对每一行进行扫描,当列为低(高)电平、行为高(低)电平时则表达该点为图案一某些,将其读出、显示。它顺序可以总结为:行不断送数据,每送完设立信息后列进行读取,然后行再次送数据,列再次读取……依次循环下去,一幅完整图案就显示在了显示屏上。
而本次设计LED显示棒数据传播原理与LED点阵屏相似。可以把LED显示棒当作是LED点阵屏中一列。为了使显示图案清晰,咱们使用了16个LED管将它们排成一列,整个屏在静止时也就相称于16行×1列。数据传播时咱们同样使用行送数据、列扫描。在摆动过程中,应用视觉暂留原理,咱们点亮列不会不久消失,而是随着摆动方向继续向前移动,只要移动速度高于视觉暂留最短时间显示内容就不会熄灭,至此,一幅图案也就可以这样被“摆动”出来了。
3.2.3 水银开关作用:
棒在摇动时,只能在朝某一方向摇动时显示,否则会浮现镜像字或镜像画面,因此通过接一只水银开关来控制,使摇摇棒从左向右摇动时将内容显示出来。
整套系统以AT89S52单片机作为核心控制系统,使用16只LED灯作为显示屏,其中16只直接与单片机I/O口相连。当水银开关触发中断T1时,单片机向16只LED传送数据,根据人体视觉暂留原理,随着显示棒摆动迈进,输出数据列也不会立即消失而是随着摆动逐渐显示在了形成扇形区域。
3.3 硬件制作
由于制作PCB板成本太高,我使用了长条形洞洞板,手工焊接,跳线连接。因而做工比较粗糙。
原先使用是直径5mm红色LED,感觉太大了些,远看效果较好但近看
图6 摇摇棒实物图
时字不够连贯。后改为3mm
高亮LED,效果好了诸多。
水银开关里水银珠很活跃,导致在接通时容易产生抖动,因此将水银开关斜向上放置(尖朝斜上方45°角),靠水银珠自身重力作用减少抖动:
水银
开关
图7 水银开关位置
IC座里面隐藏元件,既美观又能保护元件,还可以节约空间:
图8 单片机最小系统实物图
第四章 软件设计
4.1 软件设计思路
在摇动LED棒时候单片机必要单程传送数据否则显示图形会产生重影,影响视觉效果。因而当系统开始工作后通过惯性开关位置来使单片机实现单程传送数据给LED。如果水银开关位于右边,则进入外部中断1并将一变量置1,。在变量为1期间让单片机以一定频率将数据传送给LED。如果水银开关位于左边,则进入外部中断0并将变量置0,。在这期间单片机不会传送数据给LED。在送数据时,数据送完后应延时一段时间来使摇动时显示每个字不会太拥挤。之后再立即熄灭LED并开始重新判断水银开关位置。
4.2 主程序流程图
通过软件设计思路分析,得到该系统主程序流程图如下:
系统开始运营,内部进行初始化后,等待外部中断。当摇动到指定位置时,由水银开关出触发外部中断,再通过一段时间延时后开始显示。显示完毕返回主程序,等待下一种摇动周期到来。
4.3 中文取模软件
中文取模软件采用晓奇工作室提供液晶中文取模软件,设立以便,简朴实用。
图10 中文取模软件
参数设定为:
输出格式:从上到下从左到右 C语言编程
取模方式:纵向8点下高位
字库选取:粗宋16点阵
4.4 程序编写
本程序由keil软件编写,程序如下:
/**********************************************************
程序名称:LED摇摇棒显示64*16像素
编 写:某某某
时 间:/01/11
**********************************************************/
#include <reg52.h>
#define KEY P3^0 //定义画面切换按键
unsigned char KY;
unsigned char pic=0,num=0; //pic为按键次数;
/*****中文模数*****/
unsigned char code newyear[] =
{
//新
0x00,0x00,0x44,0x22,0x4C,0x1A,0x7C,0x4E,
0xD7,0xFF,0xE6,0x7F,0x7C,0x0E,0x5C,0x9A,
0x44,0x60,0xFE,0x3F,0xFC,0x1F,0x46,0x00,
0xC2,0xFF,0xC3,0xFF,0x62,0x00,0x40,0x00,
//年
0x00,0x00,0x20,0x04,0x10,0x04,0x18,0x04,
0xEC,0x07,0xCF,0x07,0x4A,0x04,0x48,0x04,
0xF8,0xFF,0xF8,0xFF,0x48,0x04,0x48,0x04,
0x68,0x04,0x4C,0x04,0x08,0x06,0x00,0x04,
//快
0x00,0x00,0xC0,0x00,0x60,0x00,0xFF,0xFF,
0xFE,0x7F,0x30,0x80,0x60,0x41,0x08,0x71,
0x08,0x3D,0xFF,0x0F,0xFE,0x07,0x08,0x0D,
0xF8,0x39,0xFC,0x71,0x08,0xE1,0x00,0x41,
//乐
0x00,0x00,0x00,0x40,0x80,0x20,0x80,0x30,
0xFE,0x1C,0xFC,0x0E,0x84,0x24,0x84,0x40,
0xFE,0xFF,0xF6,0x7F,0x82,0x00,0x83,0x02,
0xC2,0x0C,0x80,0x18,0x00,0x70,0x00,0x20
};
unsigned char code school[] =
{
//太
0x00,0x00,0x00,0x80,0x20,0x40,0x20,0x60,
0x20,0x30,0x20,0x1C,0x20,0x0F,0xFF,0x1B,
0xFE,0x70,0xA0,0x23,0x20,0x0E,0x20,0x38,
0x20,0x70,0x30,0x60,0x20,0xC0,0x00,0x40,
//原
0x00,0x00,0x00,0x80,0x00,0x70,0xFF,0x3F,
0xFE,0x4F,0x02,0x20,0xFA,0x33,0xF2,0x5D,
0x5A,0x49,0x5E,0xFF,0x56,0x7F,0x52,0x05,
0xF2,0x0B,0xFA,0x19,0x13,0x70,0x02,0x20,
//理
0x00,0x00,0x44,0x10,0x44,0x30,0xFC,0x1F,
0xFC,0x1F,0x46,0x08,0x44,0x48,0xFF,0x45,
0xFE,0x44,0x92,0x44,0xFE,0x7F,0xFE,0x7F,
0x92,0x44,0xFE,0x45,0xFF,0x64,0x02,0x40,
//工
0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,
0x04,0x40,0x04,0x40,0x04,0x40,0xFC,0x7F,
0xFC,0x7F,0x04,0x40,0x04,0x40,0x04,0x40,
0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00
};
/*****n(us)延时子程序*****/
void delay_us(unsigned int n)
{
while(n--);
}
/*****显示子程序*****/
void display1(void)
{
unsigned char i;
delay_us(5000); //延时时间不定,试着调节使得显示内容居中即可
for(i = 0;i < 64;i ++)
{
P0 = ~name[i*2];
P2 = ~name[i*2+1];
delay_us(1000);
}
}
void display2(void)
{
unsigned char i;
delay_us(5000); //延时时间不定,试着调节使得显示内容居中即可
for(i = 0;i < 64;i ++)
{
P0 = ~newyear[i*2];
P2 = ~newyear[i*2+1];
delay_us(1000);
}
}
void display3(void)
{
unsigned char i;
delay_us(5000); //延时时间不定,试着调节使得显示内容居中即可
for(i = 0;i < 64;i ++)
{
P0 = ~school[i*2];
P2 = ~school[i*2+1];
delay_us(1000);
}
}
/*****中断服务程序*****/
void intersvr0(void) interrupt 0 using 1
{
KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
if(KY == 0)
{
switch(pic) //选取画面
{
case 0:
{
display1();
break;
}
case 1:
{
display2();
break;
}
case 2:
{
display3();
break;
}
default:
{
display1();
}
}
}
}
/*****中断初始化*****/
void init_int0()
{
IT0=1; //中断为负跳变出发方式
EX0=1; //外部中断0容许
}
/*****主函数*****/
void main(void)
{
init_int0();
EA=1; //开中断,下降沿中断
KY=0;
while(1) //主程序中只检测按键
{
if(KEY==0) //画面切换键按下
{
delay_us(10000); //按键消抖
if(KEY==0);
while(!KEY);
pic++;
}
if(pic > 2) pic = 0;
}
}
/*****END*****/
第五章 总结
……
……
参照文献
1. 张俊谟.单片机中级教程.北京航空航天大学出版社,.10
2. 赵建领.单片机开发宝典.电子工业出版社,.4
3. 谭浩强.C程序设计.清华大学出版社,.7
4. 电子线路基本轻松入门.人民邮电出版社,.6
5. 杜洋.制作SHOOK16摇摇棒.无线电杂志,.1
展开阅读全文