找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5657|回复: 8
打印 上一主题 下一主题
收起左侧

带有LCD显示的音乐倒数计数器设计文档

  [复制链接]
跳转到指定楼层
楼主
ID:339580 发表于 2018-5-28 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有LCD显示的音乐倒数计数器

单片机技术是一门不可或缺的技术,对我们将来的工作以及生活和学习都有很密切的联系。近年来,随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。

单片机由CPU、一定容量的RAM和ROM构成,定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次设计通过对它的学习、应用,从而达到学习、设计、开发软、硬的能力。

本设计利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器。用4个按键操作来设置当前想要倒计数的时间。做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。应用 Proteus的ISIS软件和Keil uVision3来实现该计数器的设计与仿真。该方法仿真效果真实、准确,节省了硬件资源。

该多功能计数器可以应用于一般的生活和工作中,也可以通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。


目  录

1 设计概述和要求

1.1 设计概述

1.2 设计要求

2 系统设计

2.1 框图设计

2.2 元件清单

3软件设计

3.1 程序流程图

3.1.1 主程序流程图

3.1.2 蜂鸣器发声程序流程图

3.2 蜂鸣器发声电路原理

3.3 蜂鸣器发声程序的关键代码

4 PROTEUS仿真结果

4.1 总体电路仿真结果

4.2 假设倒计时为5秒时的仿真结果

5 总结            

6 附表(本设计所有程序) ………………………………………….14

参考文献


              1 设计概述和要求

本设计的任务是利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器。做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响。

1.1 设计概述

20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度。同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。

随着科技的发展和社会的进步,人们对数字钟的要求越来越高,多功能数字钟不管在性能还是在样式上都发生了质的变化。数字钟实际上是一个对标准频率进行计数的计数电路,走时精度高,稳定性好,使用方便,不需要经常调校。单片计算机即单片微型计算机,是集CPU,RAM,ROM,定时/计数和多种接口于一体的微控制器。它体积小成本低,功能强,广泛应用于智能产品和工业自动化上。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超多老式钟表,钟表的数字化给人们生产生活带来了极大地方便,而且大大的扩展了钟表原先的报时功能,诸如定时自动报警、0按时自动打铃、定时广播、自动启闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以数字化为基础的,因此研究数字钟及扩大其应用有着非常现实的意义。

本系统采用单片机作为数字钟的核心控制器,读取时钟的值,并通过LCD液晶显示器显示出来,而且可以通过按键电路控制执行信号,给时钟赋初值。还可以设置闹钟,当计数为0时,发出一阵音乐声。并可拓展其功能显示年月日。

1.2设计要求
利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。作品先接受用户输入的倒数计数时间,然后由用户启动作品工作(可用一个闪烁的LED灯指示),当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
定时闹钟的基本功能如下。
  • 字符型LCD(16 ? 2)显示器。
  • 显示格式为“TIME 分分:秒秒”。

用4个按键操作来设置当前想要倒计数的时间。一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声

2 系统设计2.1 框图设计

本项目的系统设计框图如图2-1所示:

图2-1 系统框图

由系统框图可看出,本设计由单片机AT89C51、LCD液晶显示器、控制键盘、蜂鸣器、复位单路和定时器电路几大模块构成。

2.2 元件清单

主控单片机采用AT89C51芯片,时钟模块选用一12MHZ晶振,产生时钟脉冲。显示模块采用LCD1602,设置部分选用键盘按键电路,发声部分选用BUZZER蜂鸣器。还有一些电源、电阻、电容、接地等。

主要元件清单如图2-2所示:






图2-2 主要元件清单


AT89C51

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。

主要特性:与MCS-51 兼容 、4K字节可编程闪烁存储器 、寿命:1000写/擦循环、数据保留时间:10年 、全静态工作:0Hz-24MHz 、三级程序存储器锁定 、128×8位内部RAM 、32可编程I/O线 、两个16位定时器/计数器 、5个中断源 、可编程串行通道 、低功耗的闲置和掉电模式 、片内振荡器和时钟电路。


1602LCD

1602液晶模块内部的控制器共有11条控制指令,如表2-1所示.

表2-1 1602液晶模块控制指令

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容


键盘:

键盘采用5个button,分别控制倒计时开始、调分个位、调分十位、调秒个位、调秒十位;另外还加一个总开关用于控制所有电路的通电情况。


蜂鸣器:

用三极管、电阻和speaker组成蜂鸣器电路。蜂鸣器最重要的特点是只要按照极性要求加上合适的直流电压就可以发出固有频率的声音

3软件设计3.1 程序流程图3.1.1 主程序流程图

主程序开始初始化,然后扫描键盘、复位电路和计数器。当键盘按键有按下时,调整计数器值,LCD显示新值。当复位键有按下时,计数器复位为初值,重新倒计数。当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。主程序流程图如图3-1所示:

1




电子信息工程专业设计文档
              3软件设计3.1 程序流程图3.1.1 主程序流程图

主程序开始初始化,然后扫描键盘、复位电路和计数器。当键盘按键有按下时,调整计数器值,LCD显示新值。当复位键有按下时,计数器复位为初值,重新倒计数。当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。主程序流程图如图3-1所示:

图3-1 主程序流程图

3.1.2 蜂鸣器发声程序流程图

  蜂鸣器发声程序流程图如图3-2所示:

                      图3-2 蜂鸣器发声程序流程图

3.2 蜂鸣器发声电路原理

    对于单片机产生音乐,关键是控制频率的输出.我们知道,不同的声音对应不同的频率,产生有规律的频率输出就可以得到相应规律的声音.有8个基本音符:do﹑re﹑mi﹑fa﹑so﹑la﹑xi﹑do,八个不同的音符对应着不同的频率.只要我们对照音符输出相对应的频率,就可以产生美妙的音乐.本文中采用了T0中断方式产生不同频率, 并用按键控制音乐的播放和停止。用三极管、电阻和BUZZER组成蜂鸣器电路。蜂鸣器最重要的特点是只要按照极性要求加上合适的直流电压就可以发出固有频率的声音。

3.3 蜂鸣器发声程序的关键代码

下面是蜂鸣器报警的子程序清单:

FLAG BIT 00H

ORG 00H

START: JB P3.1,START

JNB FLAG,NEXT

MOV R2,#200

DV: CPL P3.7

LCALL DELY500

LCALL DELY500

DJNZ R2,DV

CPL FLAG

NEXT: MOV R2,#200

DV1: CPL P3.7

LCALL DELY500

DJNZ R2,DV1

CPL FLAG

SJMP START

DELY500: MOV R7,#250

LOOP: NOP

DJNZ R7,LOOP

RET

END




4 PROTEUS仿真结果4.1 总体电路仿真结果

总体电路仿真结果如图4-1所示:


图4-1 总体电路仿真结果


4.2 假设倒计时为5秒时的仿真如图4-2所示


图4-2  假设倒计时设为5秒时的仿真

4、3 时间设置的仿真

设置时间的仿真,例如设置为22分22秒如图4-3


5 总结

通过此次多功能数字计数器的设计制作,我们将从书本上学到的知识应用于实践,再次巩固了我的单片机知识,提高了我的电路仿真设计能力。虽然设计过程中遇到了很多困难,但是在解决这些问题的过程无疑是对自身专业素质的提高。当最终调试成功的时候也是对自己的一种肯定。此次的设计不仅增强了自己在专业设计方面的信息,鼓舞了自己,更是一次兴趣的培养,为以后的学习方向明确了重点。

另外在这次设计中我们遇到了不少的问题,针对不同的问题我们采取不同的解决方法,最终一一解决了。在我们遇到不懂得问题时,利用课本上、参考书上的知识,以及网上的资料最终解决问题。和队友之间相互讨论,明白了团队合作的重要性。

本次项目设计还存在很多不足,比如,LCD的日期显示还不够完美,计数功能也不够详细等。以后争取完善这个设计,以提高我们的单片机设计能力。

这里很感谢李晓艳老师给我们的指导和教育,感谢她给我们提供了良好的学习设计环境,也很感谢可爱的伙伴们,让我觉得团队的力量很伟大。

                     6 附表(本设计所有程序)


  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit rs= P2^4;
  4. sbit rw = P2^5;
  5. sbit ep = P2^6;
  6. sbit k1=P1^4;
  7. sbit k2=P1^5;
  8. sbit k3=P1^6;
  9. sbit k4=P1^7;
  10. sbit k5=P1^3;
  11. sbit speaker=P3^0;
  12. unsigned char code dis1[] = {"The Last Time  "};
  13. unsigned char code dis2[] = {"TIME 00:00"};
  14. unsigned char code dis3[] = {"0123456789"};
  15. unsigned int num=0;
  16. unsigned int miaogw=0;
  17. unsigned int miaosw=0;
  18. unsigned int fengw=0;
  19. unsigned int fensw=0;
  20. unsigned char flag=1;
  21. unsigned char timer0h,timer0l,time;
  22.         //世上只有妈妈好数据表
  23. code unsigned char sszymmh[]={        6,2,3,      5,2,1,      3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
  24.                                       6,2,4,      3,2,2,      5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
  25.                                       6,1,1,      5,2,1,      3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
  26.                                       5,2,1,      6,2,1,      3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
  27.                                       2,2,1,      1,2,1,      6,1,1, 1,2,1, 5,1,6, 0,0,0
  28.                                       };
  29.        // 音阶频率表 高八位
  30. code unsigned char FREQH[]={
  31.                                 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  32.                                 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  33.                                 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  34.                                 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  35.                                } ;
  36.          // 音阶频率表 低八位
  37. code unsigned char FREQL[]={
  38.                                  0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  39.                                  0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  40.                                  0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  41.                                  0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  42.                                 };
  43. void delayyy(unsigned char t)
  44.    {
  45.    unsigned char t1;
  46.    unsigned long t2;
  47.    for(t1=0;t1<t;t1++)
  48.    {
  49.     for(t2=0;t2<8000;t2++)
  50.        {
  51.         ;
  52.         }
  53.    }
  54.    TR0=0;
  55. }
  56. void t0int() interrupt 1
  57. {
  58. TR0=0;
  59. speaker=!speaker;
  60. TH0=timer0h;
  61. TL0=timer0l;
  62. TR0=1;
  63. }
  64. void song()
  65. {
  66. TH0=timer0h;
  67. TL0=timer0l;
  68. TR0=1;
  69. delayyy(time);                     
  70. }
  71. void delay(unsigned char ms)
  72. {
  73.               unsigned char i;
  74.               while(ms--)
  75.               {
  76.                                           for(i = 0; i< 250; i++)
  77.                             {
  78.                                           _nop_();
  79.                                           _nop_();
  80.                                           _nop_();
  81.                                 _nop_();
  82.                             }
  83.               }
  84. }
  85. bit lcd_bz()
  86. {
  87. bit result;
  88. rs = 0;
  89. rw = 1;
  90. ep = 1;
  91. _nop_();
  92. _nop_();
  93. _nop_();
  94. _nop_();
  95. result = (bit)(P0 & 0x80);
  96. ep = 0;
  97. return result;
  98. }
  99. void lcd_wcmd(unsigned char cmd)
  100. {
  101. while(lcd_bz());//判断LCD是否忙碌
  102. rs = 0;
  103. rw = 0;
  104. ep = 0;
  105. _nop_();
  106. _nop_();
  107. P0 = cmd;
  108. _nop_();
  109. _nop_();
  110. ep = 1;
  111. _nop_();
  112. _nop_();
  113. ep = 0;
  114. }
  115. void lcd_pos(unsigned char pos)
  116. {
  117. lcd_wcmd(pos | 0x80);
  118. }
  119. void lcd_wdat(unsigned char dat)
  120. {
  121. while(lcd_bz());//判断LCD是否忙碌
  122. rs = 1;
  123. rw = 0;
  124. ep = 0;
  125. P0 = dat;
  126. _nop_();
  127. _nop_();
  128. ep = 1;
  129. _nop_();
  130. _nop_();
  131. ep = 0;
  132. }
  133. void lcd_wshuzi(void)
  134. {
  135.               lcd_pos(0x47);
  136.               lcd_wdat(dis3[fensw]);
  137.               lcd_pos(0x48);
  138.               lcd_wdat(dis3[fengw]);
  139.               lcd_pos(0x4A);
  140.               lcd_wdat(dis3[miaosw]);
  141.               lcd_pos(0x4B);
  142.               lcd_wdat(dis3[miaogw]);
  143. }
  144. void lcd_init()                            //LCD初始化
  145. {
  146. lcd_wcmd(0x38);
  147. delay(1);
  148. lcd_wcmd(0x0c);
  149. delay(1);
  150. lcd_wcmd(0x06);
  151. delay(1);
  152. lcd_wcmd(0x01);
  153. delay(1);
  154. }
  155. void keyscan(void)
  156. {
  157.   while(flag)
  158.               {
  159.          if(k1==0)
  160.           {
  161.             delay(10);
  162.           if(k1==0)
  163.             {
  164.             fensw++;
  165.             while(!k1);
  166.             if(fensw==10)
  167.             fensw=0;
  168.             }
  169.           }
  170.         if(k2==0)
  171.           {
  172.             delay(10);
  173.           if(k2==0)
  174.             {
  175.             fengw++;
  176.             while(!k2);
  177.             if(fengw==10)
  178.             fengw=0;
  179.             }
  180.           }
  181.         if(k3==0)
  182.           {
  183.             delay(10);
  184.           if(k3==0)
  185.             {
  186.              miaosw++;
  187.             while(!k3);
  188.             if(miaosw==10)
  189.             miaosw=0;
  190.             }
  191.           }
  192.          if(k4==0)
  193.           {
  194.             delay(10);
  195.           if(k4==0)
  196.             {miaogw++;
  197.             while(!k4);
  198.             if(miaogw==10)
  199.             miaogw=0;
  200.             }
  201.           }
  202.        if(k5==0)
  203.         flag=0;
  204.       lcd_wshuzi();
  205.         }
  206. }
  207. void delay1s(void)
  208. {
  209.         unsigned char h,i,j,k;
  210.          for(h=5;h>0;h--)
  211.          for(i=4;i>0;i--)
  212.          for(j=116;j>0;j--)
  213.          for(k=214;k>0;k--);
  214. }
  215. void main(void)
  216. {
  217. unsigned char j;  unsigned char k,i;
  218. speaker=0;
  219. lcd_init();// 初始化LCD
  220. delay(10);
  221. lcd_pos(0x02);//设置显示位置
  222. j = 0;
  223. while(dis1[j] != '\0')
  224. {
  225. lcd_wdat(dis1[j]);//显示字符
  226. j++;
  227. }
  228. while(1)
  229. {
  230. lcd_pos(0x42);// 设置显示位置
  231. i = 0;
  232. while(dis2[i] != '\0')
  233. {
  234. lcd_wdat(dis2[i]);// 显示字符
  235. i++;  }
  236. keyscan();
  237. ……………………

  238. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


完整的Word格式文档51黑下载地址:

带有LCD显示的音乐倒数计数器课程设计.doc (807 KB, 下载次数: 130)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:369370 发表于 2018-7-11 11:56 | 只看该作者
6666啊,正好学习
回复

使用道具 举报

板凳
ID:376216 发表于 2018-12-26 10:11 | 只看该作者

厉害厉害   感谢
回复

使用道具 举报

地板
ID:458534 发表于 2018-12-30 13:51 | 只看该作者
感谢,用来学习。
回复

使用道具 举报

5#
ID:458534 发表于 2018-12-30 13:52 | 只看该作者
感谢用来学习
回复

使用道具 举报

6#
ID:550465 发表于 2019-5-29 19:16 | 只看该作者
感谢啊!
回复

使用道具 举报

7#
ID:464306 发表于 2019-12-5 09:04 | 只看该作者
感谢!!!!!
回复

使用道具 举报

8#
ID:769694 发表于 2020-6-10 15:06 | 只看该作者
有没有仿真
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表