目录
1 设计任务书
1.1 基本设计要求
(1)在综合单片机实验箱的硬件结构上编写软件完成设计。
(2)程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
(3)在字符型LCD显示器上显示,显示格式为“TIME:分分:秒秒”,采用24小时标准计时制。
(4)用四个按键操作来设置当前想要倒计数的时间。一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下:
K1—可调整倒计数的时间1~60分钟。
K2—设置倒计数的时间为5分钟,显示“0500”。
K3—设置倒计数的时间为10分钟,显示“1000”。
K4—设置倒计数的时间为20分钟,显示“2000”。
(5)复位后LCD的画面应能显示倒计时的分钟和秒数,此时按K1键,则在LCD上显示出设置画面。此时,若:
a. 按操作键K2—增加倒计数的时间1分钟。
b. 按操作键K3—减少倒计数的时间1分钟。
c. 按操作键K4—设置完成。
(6)软件设计必须应用AT89C51片内定时器,采用定时中断结构,不得应用软件延时法。
1.2 选做项目
1、将乐曲的简谱转化为单片机可以“识别”的“数组谱”,进一步加入对音长、休止符等的控制量后,可以实现音乐的播放。
2 设计阐明
2.1设计内容
利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
2.2设计要求
(1)在综合单片机实验箱的硬件结构上编写软件完成设计。
(2)程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
(3)在字符型LCD显示器上显示,显示格式为“TIME:分分:秒秒”,采用24小时标准计时制。
(4)用四个按键操作来设置当前想要倒计数的时间。一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下:
K1—可调整倒计数的时间1~60分钟。
K2—设置倒计数的时间为5分钟,显示“0500”。
K3—设置倒计数的时间为10分钟,显示“1000”。
K4—设置倒计数的时间为20分钟,显示“2000”。
复位后LCD的画面应能显示倒计时的分钟和秒数,此时按K1键,则在LCD上显示出设置画面。此时,若:
a. 按操作键K2—增加倒计数的时间1分钟。
b. 按操作键K3—减少倒计数的时间1分钟。
c. 按操作键K4—设置完成。
(5)软件设计必须应用AT89C51片内定时器,采用定时中断结构,不得应用软件延时法。
(6) 上机调试程序。
(7) 写出设计报告。
2.3设备及工作环境
(1) 硬件:计算机一台。
(2) 软件:Windows操纵系统、Keil C51软件、Proteus软件。
3 系统方案整体设计
3.1 设计思路
音乐倒数计数器程序由LCD显示模块、倒数设置模块、时钟运算模块、LED指示、蜂鸣器模块五大部分组成。其中时钟运算模块要对分、秒的数值进行操作,每过1s,计数值减一显示在LCD上,并且秒算到60时,秒的数值重新倒数,分的数值减1。同时LED指示灯根据时钟亮灭各1s进行闪动。用按键设置所需要倒数计数的数值。并且当倒数为0后,蜂鸣器发出音乐声响。
3.2 系统整体框图
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过对硬件电路的搭建和软件程序的编写,设计出一个计数器,包括以下功能:输出时间、按键设置倒计数并且计时、将时间显示在字符型LCD1602显示器上、当倒计数为0时,蜂鸣器发出音乐声响。该系统主要由计数器模块、LCD显示器模块、蜂鸣器模块、键盘模块、单片机最小系统、LED指示灯等部分组成。
4 硬件设计
4.1 系统硬件设计
4.1.1 最小单片机系统
由AT89C51及其复位电路和晶振电路组成,当单片机运行中,按下复位键RST后松开,使其RST引脚为一段时间高电平,从而实现上电或复位开关的的操作。单片机系统里都有振荡电路,它结合单片机内部的电路产生单片机所需的时钟频率,单片机晶振提供的晶振频率越高,单片机运行就越快,单片机一切指令的执行都是建立在单片机提供的晶振频率上的。
4.1.2 键盘设计和蜂鸣器
按键控制LCD显示,通过扫描键盘来判断是否有键按下,来设定各模块的工作情况,在按键的控制下有序工作。在设计中使用四个独立按键,属于较简单的控制方式。分别与单片机的P1.0、P1.1、P1.2、P1.3四个引脚相连,通过按下按键来处理相应的程序。本实验通过利用I/O口定时翻转电平产生驱动波形对蜂鸣器进行驱动。
4.1.3 LCD显示器和LED指示灯
字符型LCD1602液晶显示,能够同时显示16×02即32个字符(16列2行)。其内部的字符发生存储器(GGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有固定的ASCII码,显示时模块把地址对应的点阵字符图形显示出来,就能看到相应的字符。
4.2 系统工作原理论述
硬件由AT89C51芯片、字符型LCD1602显示器、4个独立按键、蜂鸣器、指示灯和复位电路以及晶振电路组成。由AT89C51片内定时器定时中断,并取一存储单元作为计数器应用,每中断一次,在中断服务程序中使计数器加1,用AT89C51片内定时器T0定时中断服务程序完成倒计时的运算,T1定时中断服务程序完成蜂鸣器不同频率响。通过将待显示字符的ASCII码写入LCD1602的RAM,来显示倒计数。同时按键KEY1键、KEY2键、KEY3键、KEY4键是分别是进入设置模式、5分钟倒数,、10分钟倒数、20分钟倒数。并且倒数结束,蜂鸣器响出音乐,通过单片机的RST引脚来进行复位。
5 软件设计
5.1 分析论证
此音乐倒数计数器的设计与实现,主要采用了4个独立按键,AT89C51的复位电路和晶振电路及其内部二进制定时器/计数器,LCD1602字符型显示器,蜂鸣器,LED指示灯等,包含显示模块,运算模块,按键处理和蜂鸣器音乐播放四大功效模块。
5.1.1 显示模块
用字符型LCD1602的显示功效来设计。显示部分硬件通过AT89C51和LCD1602的连接,在LCD1602上显示倒计时间。该模块重要是将运算模块和按键处理模块运算出来并使用字符型LCD1602的字符库显示在屏幕上。该模块实现的硬件是实验箱中的显示器单元,采用软件译码,通过将待显示字符的ASCII码写入LCD内部的显示数据RAM,内部控制电路就可将字符在LCD上显示出来。只要做到每次减1s然后写入显示出来,并且个位和分位每满10上一位减1,个位满60s分位减1,同时不同按键对应显示即可实现设置不同的倒计时并开始计时显示。
5.1.2 运算模块
该模块的重要功效是对分、秒的运算,并把运算出的终极成果写入到LCD的内部RAM里,以便显示模块即时地显示出来。该模块可以细分为定时模块和运算模块。定时模块负责供给中断信号,由于CPU运算模块中的指令耗费必定的时间,所以中断信号最好通过硬件来实现。本实验中用AT89C51定时器/计数器,但由于AT89C51供的信号的周期是毫秒级的,因此必须通过软件的方法在运算模块中设置一个统计中断次数的变量,并且这一变量必须事先在内存里开辟存储单元。AT89C51定时/计数器的工作方法为方法1,产生一个50ms的脉冲信号。运算模块负责分、秒的计算,在中断服务程序里,必须对秒、分的单元内的数值进行判断,当秒减到0时,分必须减1 、秒重新到59;当时减到全为0时,倒计时结束,蜂鸣器开启。
5.1.3 按键处理模块
该模块重要功效是通过不同的按键来对倒计数进行设置,在无KEY1没按下的情况下KEY2、3、4按下,分别设置5、10、20分钟的倒计数并且按下的同时开始进行倒数,在按下KEY1的时候,进入设置模式,其他三个按键的功能改变,这是按下KEY2,在倒计数小于60分钟的情况下加1分钟,按下KEY3,在倒计数大于0分钟的情况下减1分钟。当按下KEY4,设置完成开始进行倒数。
5.1.4 蜂鸣器模块
该模块的功能是在设置的倒计数倒数结束时,通过改变蜂鸣器的频率来进行音乐的播放。通过给AT89C51的定时/计数器不同的初值,来改变其输出电平的频率,让蜂鸣器频率改变进而发出不同的音,再控制其发出音的长短时间来使其产生出响出音乐的效果。
5.1.5 启动,复位模块
该模块的功能是实现倒计时的启动,复位。本实验中第一次按下按键2、3、4进入倒计时程序,当第一次按下按键1后设置倒计时并按按键4进入倒计时。按下复位键后复位到最开始设置倒计时的时候。
5.1.6 整体功能
在字符型LCD1602显示器上能实现倒计时倒数的显示,并能对倒计数的设置同时倒数时有LED指示灯的闪动。本实验中KEY1键、KEY2键、KEY3键、KEY4键是分别是进入设置模式、5分钟倒数,、10分钟倒数、20分钟倒数,RST键是复位键。并且倒数结束,蜂鸣器播放音乐。
5.2 程序流程图
在开始前扫描按键是否按下来进行倒计时设置时间,当按键2、3、4按下对应进行5、10、20分钟的倒计时,按下就开始进行倒计时,当按键1按下对倒计时进行设置,继续扫描按键,这时按下按键2、3、4倒计时分别加1分、减1分、开始倒计时。倒计时的设置只在0~60分钟之间。开始倒计时后,到倒计时为零,蜂鸣器播放音乐,等待复位,复位后回到最开始按键扫描设置倒计时的开始部分。在此过程中LED指示灯在开始倒数时循环亮灭。
5.3程序清单
#include <reg51.h> //C51的头文件
#include <intrins.h> //空指令,循环移位头文件#define uint unsigned int
#define uchar unsigned char //宏定义
unsigned char T1RH = 0xFF; //T1重载值的高字节 unsigned char T1RL = 0x00; //T1重载值的低字节
void lcdwcom(uchar com); //向LCD写命令子程序 void lcdwdata(uchar dat); //向LCD写数据子程序
void write_time(uint addr, uint date); //倒计数显示子程序
void init(); //LCD初始化子程序
void delay(uint x); //延时子程序,延时xms
void delay_1s(void); //延时1s
void key_1(); //按键1子程序
void key_2(); //按键2子程序
void key_3(); //按键3子程序
void key_4(); //按键4子程序
void key_start(); //按键扫描子程序
sbit BUZZ = P1 ^ 5; //蜂鸣器
sbit LED = P2 ^ 4; //LED指示灯
sbit LCDRS = P2 ^ 0; //LCDRS端
sbit LCDRW = P2 ^ 1; //LCDRW端
sbit LCDE = P2 ^ 2; //LCDE端
sbit KEY1= P1 ^ 0; //按键1
sbit KEY2 = P1 ^ 1; //按键2
sbit KEY3 = P1 ^ 2; //按键3
sbit KEY4 = P1 ^ 3; //按键4
uint t, flag, flag0, flag1, flag2,flag3, flag4, flag5, minute;
//全局变量
uint second = 60;
uchar num, j,i = 0, k = 0, k_4 = 0;
uchar code tab[] = “TIME: 00:00”; //LCD初始显示数组 unsigned int code NoteFrequ[] = { //中音1-7和高音1-7对应频率列表
523, 587, 659, 698, 784, 880, 988, //中音1-7
1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音1-7 }; unsigned int code NoteReload[] = {
//中音1-7和高音1-7对应的定时器重载值
64656, //中音1
64752, //2
64838, //3
64877, //4
64949, //5
65013, //6
64548, //7
65096, //高音1
65144, //2
65187, //3
65206, //4
65242, //5
65274, //6
65303,//7 };
bit enable = 1; //蜂鸣器发声使能标志
bit tmrflag = 0; //定时器T1中断完成标志
> void delay(uint x)
> {
> unsigned int a, b;
> for (a = x; a > 0; a--)
> for (b = 110; b > 0; b--);
> }
void delay_1s(void)
{
uchar a, b, c;
for (c = 13; c > 0; c--)
for (b = 247; b > 0; b--)
for (a = 142; a > 0; a--);
_nop_(<