单片机课程设计
课程设计报告
目 录
前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1 键盘显示设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4
1.1键盘显示设计的工作原理及主要功能
1.2键盘显示设计的硬件 软件的设计
1.3硬件的实物连接图与软件的实验程序展示及分析
2 音乐播放系统设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10
2.1音乐播放系统的工作原理及主要功能
2.2音乐播放系统的硬件 软件的设计
2.3硬件的实物连接图与软件的实验程序展示及分析
2.4实验结果的分析
3 点阵LED广告屏设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„14
3.1点阵LED广告屏的工作原理及主要功能
3.2点阵LED广告屏的硬件 软件的设计
3.3硬件的实物连接图与软件的实验程序展示及分析
3.4实验结果的分析
4 字符型LCD显示设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„18
4.1字符型LCD显示的工作原理及主要功能,软件的功能及控制字的写入
4.2硬件的实物连接图与软件的实验程序展示及分析
4.3实验结果的分析
5 比赛记分牌设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„26
5.1比赛积分牌设计的工作原理及主要功能
5.2比赛积分牌设计的硬件 软件的设计
5.3硬件的实物连接图与软件的实验程序展示及分析
5.4实验结果的分析
6 “叮咚”门铃设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„30
6.1“叮咚”门铃的工作原理及主要功能
6.2“叮咚”门铃的硬件 软件的设计
6.3硬件的实物连接图与软件的实验程序展示及分析
6.4实验结果的分析
7 交通信号控制器„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„33
7.1交通信号控制器的工作原理及主要功能
7.2交通信号控制器的硬件 软件的设计
7.3硬件的实物连接图与软件的实验程序展示及分析
7.4实验结果的分析
8 具有闹钟功能的电子时钟设计„„„„„„„„„„„„„„„„„„„„„„„36
8.1具有闹钟功能的电子时钟的工作原理及主要功能
8.2具有闹钟供能的电子时钟的硬件 软件的设计
8.3硬件的实物连接图与软件的实验程序展示及分析
— 1 —
课程设计报告
8.4实验结果的分析
9 报警器与旋转灯„„„„„„„„„„„„„„„„„„„„„„„„„„„„„44
9.1报警器与旋转灯的工作原理及主要功能
软件的设计 9.2报警器与旋转灯的硬件
9.3硬件的实物连接图与软件的实验程序展示及分析
9.4实验结果的分析
课程设计体会„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„48
— 2 —
课程设计报告
一、前言
单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
单片机也被称为微控制器(Microcontroler),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。 单片机比专用处理器最适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作~单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。
这次课程设计主要考察了9个项目:
键盘显示设计;音乐播放系统设计;点阵LED广告设计;字符型LCD显示设计;比赛记分牌设计;“叮咚”门铃设计;交通信号控制器;具有闹钟功能的电子时钟设计;报警器与旋转灯。
前4个是对单片机的几个基本独立功能的考察,熟悉单片机的管脚,8255可编程I/O扩展芯片的应用以及管脚,8*8LED点阵得管脚及PCtoLCD的运用,蜂鸣器的管脚及音乐产生的原理,LCD上显示字符串、数字。
后5个不仅考察了对单片的综合运用,还考察了对单片机语言的熟悉。按所给要求完成相应的功能:硬件的连接,编程,调试,结果验证等。
具体的各个实验下面会进行详细的介绍。
— 3 —
课程设计报告
1 键盘显示设计
8255单元键盘及数码管显示单元连接,扫描键盘输入,并将扫描结果送数码管显示。键盘采
-F,当按下其中一个按键时,将该按键对应的变化在一个数用4*4键盘,将键盘进行编号,记作0
码管上显示出来,当再按下一个按键时,便将这个按键的变化在下一个数码管上显示出来,数码管上可以显示最近几次按下的按键编号。
1.1键盘显示设计的工作原理及主要功能
用软件实现对4*4键盘的编号,对数码管扫描显示的设置。在按下一个键位后,数码管上能显示按下的相应的键值,且数码管能保留前几次输入的键值。
1.2键盘显示设计的硬件 软件的设计
在键盘显示设计块用到的有:单片机,8255,LED数码显示块,4*4键盘。
在单片机的P0端与8255相连,8255作为扩展模块,将LED和键盘连接。软件部分就是编程键盘的编号及数码管的显示。
1.3硬件的实物连接图与软件的实验程序展示及分析
1.31 图与程序
图 8255内部结构及外部引脚图
— 4 —
课程设计报告
图 8255控制字格式
键盘扫描及数码管显示单元原理图
— 5 —
课程设计报告
键盘扫描及数码显示接线图
实物连接图 #include "Absacc.h"
#define C8255_A XBYTE[0x7F00] //8255端口地址定义 #define C8255_B XBYTE[0x7F01] #define C8255_C XBYTE[0x7F02]
— 6 —
课程设计报告
#define C8255_CON XBYTE[0x7F03] //数码管显示编码 unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x7c, 0x39, 0x5e, 0x66,
0x77, 0x71, 0x79, 0x6d, 0x6f, 0x7f, 0x07, 0x7d};
unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //显示缓冲
unsigned char key_down; unsigned char key_value; unsigned char key_count; void delay(unsigned int time) {
unsigned int i;
for(i=0; i
输出显示
C8255_A = j;
delay(0x100);
j = (j>>1)|(j<<7);
}
}
void clear() //清屏
{
C8255_B = 0x00;
}
void writebuffer()
{
b[key_count] = key_value; key_count--;
if(key_count == -1)
key_count = 5;
— 7 —
课程设计报告
display();
clear();
keyscan();
while(key_down) //键盘消抖
{
display();
clear();
keyscan();
}
}
void getkey() //得到按键值
{
unsigned char value; unsigned char i, 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;
— 8 —
课程设计报告
}
j <<= 1;
}
}
void main()
{
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.32 结果分析
由图上4*4键盘第一排为0-3,第二排是4-7同理下面2排。且数码管的显示刷新时从左到右,
即第一次按下一个数时显示在第一位上。所以由数码管上显示的数据E987EF可知,且只输入了这
6个数。则键盘的按键顺序为 E 9 8 7 E F。
— 9 —
课程设计报告
2 音乐播放系统设计
利用单片机定时器产生乐谱的各种频率方波,信号经过放大号由扬声器发出声音。编写程序控制单片机,使其输出连续连接到扬声器上能发出相应的乐曲。
2.1音乐播放系统的工作原理及主要功能
由单片机的定时器产生一段连续的方波,经过放大后输入扬声器。对于不同的频率,扬声器能发出不同的声音。按照一定的原理就能产生一段音乐。
2.2音乐播放系统的硬件 软件的设计
对于音乐播放系统所用到的硬件:单片机,扬声器。
对单片机编程,要求用定时器对所给的数组计算后送入初值,定时时间到后,按照所给的数组延迟一定的时间。达到产生乐曲的目的。
2.3硬件的实物连接图与软件的实验程序展示
表 音符与频率对照表(单位:Hz)
— 10 —
课程设计报告
电子发声单元原理图
实物连接图
#include"SST89x5x4.h"
sbit P00=P0^0;
#define Clk 0x70000
unsigned char data val_H;
unsigned char data val_L;
unsigned int code freq_list[]={221,1484,556,589,624,556,495,556,624,
495,495,624,742,833,833,833,742,624,
624,495,556,495,556,624,495,416,416,
— 11
—
课程设计报告
371,495,833,742,624,624,495,556,495,
556,833,742,624,624,742,833,990,742,
624,624,495,556,495,556,624,495,416,
416,371,495,0
};//乐谱的初值
unsigned char code time_list[]={12,12,2,4,4,6,2,4,4,6,
2,4,4,12,1,3,6,2,4,4,
6,2,4,4,6,2,4,4,12,4,
6,2,4,4,6,2,4,4,6,2,
4,4,12,4,6,2,4,4,6,2,
4,4,6,2,4,4,12
};//每个音符的延迟时间 void t0_isr() interrupt 1 //定时器0的中断服务程序
{
P00=~P00;
TH0=val_H;
TH0=val_L;
}
void Delay(unsigned char cnt) {
unsigned char i;
unsigned int j;
for(i=0;i
>8)&0xff;
val_L=val&0xff;
TH0=val_H; //送入初值
TL0=val_L;
Delay(time_list[i]);
i++;
}
}
}
2.4实验结果的分析
该段音乐是小星星。利用以上给出的音符与频率对照表,能准确的写出一段乐曲的频率数组。延迟时间的设定看乐谱:间隔的大小。只要对定时器的初始化没错就能够出来一段优美的音乐。
— 13 —
课程设计报告
3 点阵LED广告屏设计
16*16LED点阵由四块8*8LED点阵组成。控制点阵的扫描显示,使16*16点阵循环显示汉字 3.1点阵LED广告屏的工作原理及主要功能
8*8点阵其实跟二极管的点亮情况是一样的。若为共阳极,则给0为亮,反之给1为亮。对于16*16点阵显示字,则同时点亮显示字的位即可。对于字的设定可以用PCtoLCD查询。
3.2点阵LED广告屏的硬件 软件的设计
点阵LED广告屏设计所用到的硬件:单片机,点阵LED。软件有PCtoLCD。
运用单片机将用PCtoLCD所得的数据写入16*16点阵即可。同时可以设定为循环显示
3.3硬件的实物连接图与软件的实验程序展示及分析
— 14 —
课程设计报告
点阵显示接线图
— 15 —
课程设计报告
实物连接图 #include "sst89x5x4.h" #include "Absacc.h"
//#include "hzdot.h"
#include "hzdot1.h"
#define Row1 XBYTE[0xef00] // 端口定义 #define Row2 XBYTE[0xdf00] #define Col1 XBYTE[0xbf00] #define Col2 XBYTE[0x7f00] void Delay(void) // 延时子程序 {
unsigned char i;
for(i=0; i<60; i++); }
void clear(void) // 清屏
{
Row1 = 0x00;
Row2 = 0x00;
Col1 = 0xff;
Col2 = 0xff;
— 16
—
课程设计报告
}
void main(void)
{
unsigned char Scan=0x01, i, j;
unsigned int count=0;
clear();
while(1)
{
for(i=0; i<50; i++)
{
for(j=0; j<8; j++)
{
Row1 = 0x00;
Col1 = ~hzdot[count]; // 0--7列
Col2 = ~hzdot[count+1]; // 8--15列
count+=2;
Row1 = Scan; // 0--7行
Scan = (Scan<<1)|(Scan>>7); // 行扫
Delay();
}
Row1 = 0x00;
for(j=0; j<8; j++)
{
Row2 = 0x00;
Col1 = ~hzdot[count];
Col2 = ~hzdot[count+1];
count+=2;
Row2 = Scan; // 8--15行
Scan = (Scan<<1)|(Scan>>7);
Delay();
}
Row2 = 0x00;
count-=32;
}
count+=2;
if(count == (128-32)) count=0;
}
}
3.4实验结果的分析
所给的实物图是抓拍的一个“下”字。循环显示为“天下第一”。此程序只要把握住字符的产
生以及显示的方式即可。
— 17
—
课程设计报告
4 字符型LCD显示设计
在液晶显示器上显示字符串,数字等,并循环动态显示。如显示“Happy new year!”,按下不同按钮,显示改变。
对已连接好的LCD
4.1字符型LCD显示的工作原理及主要功能,软件的功能及控制字的写入
液晶单元原理图
— 18 —
课程设计报告
该指令完成下列功能:
将空码(20H)写入DDRAM的全部 80个单元内,将地址指针计数器 AC清零,光标或闪烁归HOME 位,设置输入方式参数I/D,1,即地址指针 AC为自动加一输入方式。
该指令将地址指针计数器 AC 清零。执行该指令的效果有:将光标或闪烁位返回到显示屏的左上第一字符位上,即DDRAM地址00H单元位置,这是因为光标和闪烁位都是以地址指针计数器AC当前值定位的。如果画面已滚动,则撤消滚动效果,将画面拉回到 HOME 位。
该指令的功能在于设置了显示字符的输入方式,即在计算机读/写DDRAM或 CGRAM后,地址指针计数器 AC 的修改方式,反映在显示效果上,当写入一个字符后画面或光标的移动。 该指令的两个参数位I/D 和S确定了字符的输入方式。
I/D 表示当计算机读/写DDRAM或CGRAM的数据后,地址指针计数器 AC的修改方式, 由于光标位置也是由AC值确定,所以也是光标移动的方式。
I/D,0: AC为减一计数器,光标左移一个字符位。
I/D,1 :AC为加一计数器,光标右移一个字符位。
S表示在写入字符时,是否允许显示画面的滚动
— 19 —
课程设计报告
S,0:禁止滚动
S,1:允许滚动
S,1且I/D,0:显示画面向右滚动一个字符
S,1且I/D,1:显示画面向左滚动一个字符
综合而论,该指令可以实现四种字符的输入方式,见表所示。
该指令控制着画面,光标及闪烁的开与关。该指令有三个状态位D、C、B,这三个状态位分别控制着画面,光标和闪烁的显示状态。
D:画面显示状态位。当 D,1 时为开显示,当 D,0 时为关显示。主要关显示仅是画面不出现,而DDRAM内容不变。这与清屏指令截然不同。
C:光标显示状态位。当C,1时为光标显示,当 C,0 时为光标消失。
B:闪烁显示状态位。当 B,1 时为闪烁启用,当 B,0 时为闪烁禁止。闪烁是指一个字符位交替进行正常显示态和全亮显示态。
— 20 —
课程设计报告
S/C:滚动对象选择。S/C,1:画面滚动;S/C,0:光标滚动。
R/L:滚动方向选择。R/L,1:向右滚动;R/L,0:向左滚动。
该指令代码表如下表所示:
DL:设置控制器与计算机的接口形式。接口形式体现在数据总线长度上。
DL,1:设置数据总线为8位长度,即DB7,DB0 有效
DL,0:设置数据总线为 4 位长度,即 DB7,DB4 有效。该方式下 8 位指令代码和数据将按先高4位后低4位的顺序分两次传输。
N:设置显示的字符行数。N,0为一行字符行;N,1 为两行字符行。
F:设置显示字符的字体。F,0为5×7点阵字符体;F,1 为 5×10 点阵字符体。
— 21 —
课程设计报告
计算机对指令寄存器通道读操作(RS,0,R/W,1)时,将读出此格式的“忙”标志 BF值和7位地址指针计数器AC的当前值。计算机随时都可以对 HD44780U读“忙”操作。BF值反映HD44780U的接口状态。计算机在对 HD44780U每次操作时首先都要读 BF值判断HD44780U的当前接口状态,仅有在BF,0时计算机才可以向HD44780U写指令代码或显示数据和从HD44780U读出显示数据。
计算机读出的地址指针计数器AC当前值可能是 DDRAM地址也可能是 CGRAM的地址,这取决于最近一次计算机向AC写入的是哪类地址。
LCD液晶显示接线图
4.2硬件的实物连接图与软件的实验程序展示及分析
#include
#include
//引脚定义
sbit RSPIN = P1^5;
sbit RWPIN = P1^6;
sbit EPIN = P1^7;
unsigned char XPOS,YPOS;
unsigned char DisTab1[16];
— 22 —
课程设计报告
unsigned char DisTab2[16]; unsigned char DisTab3[] = "Happy new year! ";
unsigned char DisTab4[] = "1234567135464665";
unsigned char DisTab5[] = "Bye bye!! ";
unsigned char DisTab6[] = "7654321123564652";
void delay(unsigned int t) { unsigned int i,j;
for(i=0;i100时,显示不在增加,当数<0时,显示不再减少。
软件的设计 5.2比赛积分牌设计的硬件
用到的硬件:单片机,8255*,LED,kk1,kk2。
单片机与8255相连,且2个外部中断口分别于kk1 kk2相连。8255的扩展I/O口与LED的输入端相连。
单片机软件部分主要是把kk1 kk2的中断信号用来对显示数的处理。同时在中断后给一个信号来通知蜂鸣器响。
5.3硬件的实物连接图与软件的实验程序展示及分析
实物连接图
* 对前面所给的硬件的使用在后面的就不给出了。
— 26 —
课程设计报告
#include
#include "absacc.h"
#define C8255_A XBYTE[0x7F00] //8255端口地址定义 #define C8255_B XBYTE[0x7F01] #define C8255_CON XBYTE[0x7F03] sbit POUT = P1^1;
//#define Clk 0x070000
unsigned char a[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int m=10,key=0; unsigned int code freq_list[]={1200,000};
unsigned char data val_H; unsigned char data val_L;
void t0_isr() interrupt 1
{
POUT = ~POUT;
TH0 = val_H;
TL0 = val_L;
}
void delay(unsigned int time) {
unsigned int i;
for(i=0; i