为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

单片机课程设计报告

2017-09-15 50页 doc 678KB 26阅读

用户头像

is_591137

暂无简介

举报
单片机课程设计报告单片机课程设计报告 课程设计报告 目 录 前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1 键盘显示设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4 1.1键盘显示设计的工作原理及主要功能 1.2键盘显示设计的硬件 软件的设计 1.3硬件的实物连接图与软件的实验程序展示及分析 2 音乐播放系统设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 2.1音乐播放系统的工作原理及主要功能 2.2音乐播放系统的硬件 软件的设计 2.3硬件的实物...
单片机课程设计报告
单片机课程 课程设计报告 目 录 前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„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>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>8)&0xff; val_L = val&0xff; TH0 = val_H; // 送入蜂鸣器对应频率的初值 TL0 = val_L; delay(500); } key=0; } } } 5.4实验结果的分析 以上显示结果为26,表示INT0最少按下了16次。程序的理解就是:2个外部中断,一个内部中断。外部中断用于对输入信号的判断。内部中断用于蜂鸣器的频率的计数。这里要指出的很重要的一点就是:对内部中断的初值的输入。我们在实验时,为了表达一个“滴”声,首先输入了一个频率为900的方波,再输入一个频率为0的方波即可。可问题就在我们输入了0频率的方波后,数码管的显示就出了问题:一直无法显示全亮的状态,且只有1个数码管完全显示。后来经过老师的讲解:我们明白,在while(1)循环中,0频率的方波信号一直对外部中断及显示块产生了影响。所以我们采用了for语句。将2个频率合到一起。结果就为正确的。 *注意:以上分析同样运用于外部中断和内部中断同时运用的程序设计中。 — 29 — 课程设计报告 6 “叮咚”门铃设计 当按下开关sw1,单片机从P0.0端口输出到电子发声单元产生“叮咚”声,经过放大之后送入喇叭 “叮咚”门铃的工作原理及主要功能 6.1 这个门铃的设计与音乐的设计原理差不多。就是把音乐的一张段频率用3个数字代替。同时引入1个外部中断。每当有外部中断时,程序就执行这段2个数字的音乐:叮咚。 6.2“叮咚”门铃的硬件 软件的设计 用到的硬件:单片机,蜂鸣器,kk1. 单片机对外部中断口进行监测,有中断就执行已准备好的门铃音乐即可。 6.3硬件的实物连接图与软件的实验程序展示及分析 硬件实物连接图 #include "SST89x5x4.h" sbit POUT = P1^0; #define Clk 0x070000 unsigned char data val_H; unsigned char data val_L; unsigned char m=0; — 30 — 课程设计报告 unsigned int code freq[] = {800,200,000 };//门铃音乐 unsigned int code time[]= { 4,4,12 }; //延迟时间 void t0_isr() interrupt 1 //内部中断服务子程序 { POUT = ~POUT; TH0 = val_H; TL0 = 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[j]); } m=0; } } } 6.4实验结果的分析 关键性的问题没有。主要是2个主要“叮咚”的频率要与2个字相近即可。 — 32 — 课程设计报告 7 交通信号控制器 东西方向通行30秒,南北方向通行25秒,每个路口数码管指示现在路口灯亮的剩余时间。初始状态,东西方向开始通行。 7.1交通信号控制器的工作原理及主要功能 有2个模块:显示块和路灯块。对于显示块,采用选通信号对数码管进行点亮。分东西和南北。对于路灯块,采用直接赋值的方式,给路灯信号以1或0。 7.2交通信号控制器的硬件 软件的设计 用到的硬件:LED灯和LED显示屏。 单片机内部定时30秒和25秒。在30秒内,代表东西走向的灯给1,在倒计时30秒完后,南 ,东西走向的灯给0。 北走向的25秒倒计时,同时给南北走向的灯1 7.3硬件的实物连接图与软件的实验程序展示及分析 硬件实物连接图 #include #include "absacc.h" #define C8255_A XBYTE[0x7F00] — 33 — 课程设计报告 #define C8255_B XBYTE[0x7F01] #define C8255_CON XBYTE[0x7F03] unsigned char b[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char counta; long i=0; int count; void delay(int cnt) { unsigned int j; for(j=0;j #include "absacc.h" #define uchar unsigned char #define uint unsigned int #define C8255_A XBYTE[0x7F00] //8255端口地址定义 #define C8255_B XBYTE[0x7F01] #define C8255_C XBYTE[0x7F02] #define C8255_CON XBYTE[0x7F03] unsigned int code freq_list[]={900,000}; sbit POUT = P1^1; sbit nd=P1^2; sbit zsd=P1^3; uchar miao,fen,shi,n_h,n_m,n_s; uchar miaog,miaos,feng,fens,shig,shis; uchar tt,key1num,key=0,k=0; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char key_down; unsigned char key_value; unsigned char key_count; unsigned char data val_H; unsigned char data val_L; void t1_isr() interrupt 3 { POUT = ~POUT; TH1 = val_H; TL1 = val_L; } /********延时子函数********/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /********显示子函数********/ void display(h,m,s) { miaos=s/10; miaog=s%10; — 37 — 课程设计报告 fens=m/10; feng=m%10; shis=h/10; shig=h%10; C8255_A=table1[0]; C8255_B=table[shis]; delay(1); //P3=0x00; C8255_A=table1[1]; C8255_B=table[shig]; delay(1); //P3=0x00;//时 /*P3=0x40; P2=table1[2]; delay(1); P3=0x00;*/ C8255_A=table1[2]; C8255_B=table[fens]; delay(1); //P3=0x00; C8255_A=table1[3]; C8255_B=table[feng]; delay(1); //P3=0x00;//分 /*P3=0x40; P2=table1[5]; delay(1); P3=0x00;*/ C8255_A=table1[4]; C8255_B=table[miaos]; delay(1); //P3=0x00; — 38 — 课程设计报告 C8255_A=table1[5]; C8255_B=table[miaog]; delay(1); //P3=0x00;//秒 } void keyscan() { unsigned char cc; C8255_A=0x00; cc=C8255_C; key_down=(~cc)&0x0f; } /*void baoshi() { unsigned int val,i,q; if(shi>0&&shi<4&&fen==0&&miao==0) // for(q=0;q>8)&0xff; val_L = val&0xff; TH1 = val_H; TL1 = val_L; delay(500); } // } }*/ void getkey() //读取键值,判定时,分,秒,切换键 { unsigned char value; unsigned char i,j=0xfe; for(i=0;i<13;i=i+4) { C8255_A=j; value=C8255_C; if(!(value&0x01)) { key_value=i+0; — 39 — 课程设计报告 if(key==0) {if(miao==59) {miao=0;fen++;} else miao++; } else n_s++; return; } if(!(value&0x02)) { key_value=i+1; if(key==0) {if(fen==59) {fen=0;shi++;} else fen++; } else n_m++; return; } if(!(value&0x04)) { key_value=i+2; if(key==0) { if(shi==23) shi=0; else shi++; } else n_h++; return; } if(!(value&0x08)) { key_value=i+3; key=~key; return; } j<<=1; } } void timer0() interrupt 1 — 40 — 课程设计报告 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt>=20) { tt=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi>=24) shi=0; } } } } /********初始化函数********/ void init() { C8255_CON=0x81; TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; IE = 0x82; ET0=1; ET1=1; TR0=1; TR1=0; shi=0; fen=0; miao=0; tt=0; — 41 — 课程设计报告 n_h=0; n_m=0; n_s=0; zsd=0; } /********主程序********/ void main() { unsigned int val,q; init(); C8255_CON=0x81; key_count=5; while(1) { if(key==0) { display(shi,fen,miao); nd=0; } else { display(n_h,n_m,n_s); nd=1; } keyscan(); if(key_down) { delay(0x80); keyscan(); if(key_down) { getkey(); } } if (shi==n_h&&fen==n_m&&miao==n_s&&miao!=0) { zsd=1; val = 0x70000/900; val = 0xFFFF - val; val_H = (val>>8)&0xff; val_L = val&0xff; — 42 — 课程设计报告 TH1 = val_H; TL1 = val_L; delay(500); } if(miao==50) k=1; if(k=1&&shi>0&&shi<4&&fen==1&&miao==0) { for(q=0;q>8)&0xff; val_L = val&0xff; TH1 = val_H; TL1 = val_L; delay(100); val = 0x70000/000; val = 0xFFFF - val; val_H = (val>>8)&0xff; val_L = val&0xff; TH1 = val_H; TL1 = val_L; delay(200); TR1=0; k=10; } } } } 8.4实验结果的分析 该实验程序的编程比较的繁琐,因为功能比较的多。所以在编程时,可以一个一个功能的实 现,没必要直接实现所有的功能,这样会很难。 — 43 — 课程设计报告 9 报警器与旋转灯 按下报警开启按钮,蜂鸣器发声,旋转灯点亮。按下报警关闭按钮,蜂鸣器停止发声,旋转灯熄灭 9.1报警器与旋转灯的工作原理及主要功能 该设计同音乐播放器,同“叮咚”门铃设计。不同之处在于报警灯设置了关闭键,且报警声是循环的,还有就是在报警时LED灯循环点亮。 9.2报警器与旋转灯的硬件 软件的设计 用到的硬件:单片机,LED,蜂鸣器。 单片机实现对外部中断的检测,有中断信号,则输出蜂鸣信号时蜂鸣器响,且点亮LED灯循环点亮。 9.3硬件的实物连接图与软件的实验程序展示及分析 硬件实物图 #include "SST89x5x4.h" #include "Intrins.h" — 44 — 课程设计报告 sbit POUT = P1^0; #define Clk 0x070000 unsigned char data val_H; unsigned char data val_L; unsigned char m=0; unsigned int code freq[] = {800,600 }; unsigned int code a[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned int code time[]= { 2,2 }; void t0_isr() interrupt 1 { POUT = ~POUT; TH0 = val_H; TL0 = 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[j]); } for(i=0;i<8;i++) { P0=a[i]; }P0=0x00; /*for(p=0; p<8; p++) { P0 = q; //使LED流水显示 q = _crol_(q, 1); Delay(10); } P0 = 0x00;*/ } if(m==0) { val = Clk/001; val = 0xFFFF - val; val_H = (val>>8)&0xff; val_L = val&0xff; TH0 = val_H; TL0 = val_L; Delay(12); — 46 — 课程设计报告 P0=0x00; } } } 9.4实验结果的分析 当按下左边的按钮时,蜂鸣器响,且左边的LED灯循环点亮。该程序前面已经基本都能完成,这个只是一个小综合。 — 47 — 课程设计报告 课程设计体会 在具有闹钟功能的电子时钟设计试验中,对一个功能一个功能的实现,同样遇到了比赛记分牌的问题。本来都已经能完全显示,并且切换键也能使用。但在加入了蜂鸣器后,首先就是LED数码管显示不正常:在按A B C时无法观察时,分,秒的清楚变化,只能显示结果,本来在没加蜂鸣器之前是完好的。其次是整体读秒显示,6位显示看起来同样经过了秒的变化,只是最亮的显示还是原来的时,分,秒。再次就是在整点报时后,时钟就完全停止了,就是整个系统崩了。最后还有,蜂鸣器的响的时间不能自己定,按照我们的判定条件所给就是在1秒内让蜂鸣器响,但是蜂鸣器的延迟时间我们不确定,这就导致了我们无法精确的给定1时1次,2时2次的蜂鸣器响声。以上问题我们现在解决了一大部分。根据以上问题我想到了用这句话:TR0=0。当时我是这么想的:既然是T0的问题,那我将INT0关闭就行了。最后又了这句话,我们的很多问题都解决了。保证了对T0的调用,同时保证它对显示块,内部中断计数块不影响。 在整个2天的课设中,前面4个由于提供的参考资料上面有,本想自己编程的,但最后发现有点难度。只得求其次:把后面5个做好。对于后面几个独立编程的项目,我保证到了:大体理解项目的要求,理清编程思路,程序大部分自己编写(有一定的参考),对遇到的问题也是反复调试,尽量达到最好的。对于遇到的问题,比如:加入了蜂鸣器,显示就出问题;对6个数码管的选通位的理解;如果只对蜂鸣器输入一个方波即PO0=1;delay();P00=0;delay();是否能实现跟用定时器一样的结果;16个键盘的选通(读入键值)的设定等等。其中有些能够独立解决并且完整的理解,有些时候也只能按部就班。别人怎么写,我就怎么写。只要结果能够和要求的一致就行。 经过2天的锻炼,我基本上能把握住单片机的主要用途,一些基本的单片机编程。对课设所给的一些项目能够很好的完成,与此同时,也在这次课设中发现自己对一些比较小的细节问题把握不够,对一些逻辑问题分析得也不是很透彻,才导致一直出现大大小小的问题。有些问题只要改改就行,有些就是整体的逻辑错误。鼓励自己在今年的电子设计大赛前能更好的更正这些问题。把握住真正的编程精神。 — 48 —
/
本文档为【单片机课程设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索