AT89C51音乐倒数计数器.docx

上传人:b****6 文档编号:7914584 上传时间:2023-01-27 格式:DOCX 页数:25 大小:234.80KB
下载 相关 举报
AT89C51音乐倒数计数器.docx_第1页
第1页 / 共25页
AT89C51音乐倒数计数器.docx_第2页
第2页 / 共25页
AT89C51音乐倒数计数器.docx_第3页
第3页 / 共25页
AT89C51音乐倒数计数器.docx_第4页
第4页 / 共25页
AT89C51音乐倒数计数器.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

AT89C51音乐倒数计数器.docx

《AT89C51音乐倒数计数器.docx》由会员分享,可在线阅读,更多相关《AT89C51音乐倒数计数器.docx(25页珍藏版)》请在冰豆网上搜索。

AT89C51音乐倒数计数器.docx

AT89C51音乐倒数计数器

11引言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它给人带来的方便也是不可置否的,人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。

做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。

目录

一、项目概述和要求…………………………………………………………………………1

设计方案……………………………………………………………………………1

二、系统硬件电路设计………………………………………………………………………2

2.1主控制器——AT89S51单片机…………………………………………………2

2.2显示电路——LCD数码管…………………………………………………2

三、系统设计:

…………………………………………………………………………………3

3.1电路原理图……………………………………………………………………3

3.2元件清单………………………………………………………………………4

四、系统软件程序设计:

………………………………………………………………………8

4.1程序流程图…………………………………………………………………8

五、系统的仿真与调试:

……………………………………………………………………11

5.1硬件调试……………………………………………………………………11

5.2软件调试……………………………………………………………………11

5.3软硬件调试………………………………………………………………12

六、总结………………………………………………………………………………………13

七、参考文献………………………………………………………………………………14

八、附录………………………………………………………………………………………15

一、项目概述和要求

设计方案

音乐倒数计数器所倒数的时间由数字显示,控制器使用单片机AT89C51。

本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:

输出时间,按下键就开始计时,并将时间显示在LCD1602显示器上。

当倒计数为0时,蜂鸣器就发出音乐声响等等。

该计数器系统主要由计数器模块、LCD显示器模块、蜂鸣器模块、键盘模块、复位模块等部分组成。

总体设计方框图如图1-1所示。

 

LCD1602

复位电路

AT89C51

蜂鸣器

键盘

图1-1总体设计方框图

 

二、系统硬件电路设计

主控制器——AT89S51单片机

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

●与MCS-51兼容

●4K字节可编程闪烁存储器

●寿命:

1000写/擦循环

●数据保留时间:

10年

●全静态工作:

0Hz-24Hz

●三级程序存储器锁定

●128*8位内部RAM

●32可编程I/O线

●两个16位定时器/计数器

●5个中断源

●可编程串行通道

●低功耗的闲置和掉电模式

●片内振荡器和时钟电路

显示电路——LCD数码管

采用静态显示,静态显示是指LCD显示某一屏字符时,时钟保持当前字符的显示,不使用移屏显示。

便于控制,同时能够满足正常的显示效果。

由于在显示中存在播放时间的动态变化,这样的话,即使是不产生整屏移动,也能给人动态感,也易于控制。

 

图3-1电路原理图

AT89C51芯片

AT89C51芯片图如下图3-2所示。

图3-2AT89C51芯片

①简介:

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

②主要特性:

与MCS-51兼容;4K字节可编程闪烁存储器;寿命:

1000写/擦循环;数据保留时间:

10年;全静态工作:

0Hz-24MHz;三级程序存储器锁定;128×8位内部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路。

字符型LCD1602

字符型LCD1602如下图3-3所示。

图3-3字符型LCD1602

1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。

VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,各引脚符号及其功能表如下表3-1所示。

表3-1LCD各引脚及其功能表

引脚

符号

功能说明

1

VSS

一般接地

2

VDD

接电源(+5V)

3

V0

液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4

RS

RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5

R/W

R/W为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作。

6

E

E(或EN)端为使能(enable)端,下降沿使能。

7

DB0

底4位三态、双向数据总线0位(最低位)

8

DB1

底4位三态、双向数据总线1位

9

DB2

底4位三态、双向数据总线2位

10

DB3

底4位三态、双向数据总线3位

11

DB4

高4位三态、双向数据总线4位

12

DB5

高4位三态、双向数据总线5位

13

DB6

高4位三态、双向数据总线6位

14

DB7

高4位三态、双向数据总线7位(最高位)(也是busyflag)

15

BLA

背光电源正极

16

BLK

背光电源负极

 

按键控制模块

按键用于控制数码显示、LCD显示、扬声器等模块的工作。

通过扫描按键是否按下,来设定各模块的工作情况,使各模块可以在按键的控制下,有序地进行工作。

设计中使用单个按键实现单个功能,属于较为简单的控制方式。

在多功能系统设计的试验中我们使用五个按键分别与单片机的p1.0、p1.1、p1.2、p1.3、p1.4相连。

通过按下相应的按键来处理相应的程序。

如下图3-4所示。

图3-4按键控制模块图

3.2.4其它元件

其它元件图如下图3-5所示。

图3-5其它元件图

电路原理图

电路原理图如图3-1所示。

3

 

四、系统软件程序设计

4.1程序流程图

主程序开始初始化,然后扫描键盘、复位电路和计数器。

当键盘按键有按下时,调整计数器值,LCD显示新值。

当复位键有按下时,计数器复位为初值,重新倒计数。

当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。

主程序流程图、LCD显示流程图和按键流程图分别如下图4-1、图4-2和图4-3所示。

图4-1主程序流程图

 

 

图4-3按键流程图

 

五、系统的仿真与调试

5.1硬件调试

硬件调试分为静态调试和动态调试,对于硬件调试而言,只要认真焊接,硬件一般不会出现什么问题的。

静态调试一般采用的工具是万用表,它是在用户系统未工作时的一种硬件检测。

动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。

调试步骤是:

首先把电路分为若干模块,调试过程中与该模块无关的元件可以不加考虑,这样可把故障限定在一定的范围内;故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。

5.2软件调试

软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。

5.3软硬件调试

软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需要检测软件是否在实现功能上有欠缺。

若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。

本课程设计调试结果如下图5-1所示。

图5-1课程设计调试结果

仿真开始

K2按键仿真

K3按键仿真

K4按键仿真

 

六、总结

经过这次的的课程设计,简单带有LCD显示的音乐倒数计数器基本完成,系统基本功能基本实现,测试运行也基本正常。

该系统基本上完成了日期的显示与计数的功能。

当然这个系统还存在许多有待完善的地方:

功能相对较少,有待于添加,比方说时钟与闹钟功能;界面设计得不够精致完美;

这次课程设计的时间虽然不算很长,但使我对很多东西有了更深刻的认识。

总结如下:

查阅资料和阅读相关文献的重要性。

向同学请教的重要性,团结协作的重要性。

勤动手的重要性,自己动手,丰衣足食!

在一次次调试代码的过程中,我才明白“代码不是写出来的,是调出来的”的道理。

对待任何事情都要有耐心和恒心,遇到问题要冷静地思考,积极找出症结所在,逐个解决。

通过本次课程设计,我更深刻的认识到了教学实践在大学课程中的重要性,同时也发觉到了自己在学习方面存在的许多不足之处,在以后的学习中我会努力改进这些不足,不断提高自己的动手实践能力。

 

七、参考文献

[1]谭浩强.C程序设计[M].北京:

清华大学出版社2008

[2]郭天祥.51单片机C语言教程[M].北京:

电子工业出版社2011

[3]张毅刚.单片机原理及应用[M].北京:

高等教育出版社2011

[4]康华光.电子技术基础(模拟部分)[M].北京:

高等教育出版社2009

 

八、附件

源程序

#include

#include

#definetime100

#defineuintunsignedint

#defineucharunsignedchar

uintt,flag,flag0,flag1,flag2,flag3,flag4,flag5,minute,second=60;

ucharnum,j,i,k=0;

ucharcodetable[]="TIME00:

00";

uintcodetable1[]={64580,64684,64777,64820,64898,64968,65030};

sbitkey1=P1^0;

sbitkey2=P1^1;

sbitkey3=P1^2;

sbitkey4=P1^3;

sbitkey5=P1^4;

sbitP1_5=P1^5;

sbitRS=P2^0;

sbitRW=P2^1;

sbitE=P2^2;

sbitled_red=P2^3;

voidwrite_time(uintaddr,uintdate);

/////////延时函数///////

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

///////延时1S////////////

voiddelay1(void)

{

uchara,b,c;

for(c=13;c>0;c--)

for(b=247;b>0;b--)

for(a=142;a>0;a--);

_nop_;

}

////////1602写命令函数//////

voidwrite_com(ucharcom)

{

RS=0;

P3=com;

delay(5);

E=1;

delay(10);

E=0;

}

//////1602写数据函数//////

voidwrite_date(uchardate)

{

RS=1;

P3=date;

delay(5);

E=1;

delay(10);

E=0;

}

//////按键1处理函数///////

voidKEY1()

{

while(flag1)

{

if(key2==0)

{

delay(time);

if(key2==0)

{

if(minute<=60)

minute=minute+1;

write_time(7,minute);

}

}

if(key3==0)

{

delay(time);

if(key3==0)

{

if(minute>0)

minute=minute-1;

write_time(7,minute);

}

}

if(key4==0||key5==0)

{

delay(150);

if(key4==0||key5==0)

{

flag1=0;

flag=1;

TR0=1;

}

}

}

}

//////按键2处理函数//////

voidKEY2()

{

minute=5;

write_time(7,minute);

while(flag2)

{

if(key5==0)

{

delay(time);

if(key5==0)

{

flag2=0;

flag=1;

TR0=1;

}

}

}

}

//////按键3处理函数//////

voidKEY3()

{

minute=10;

write_time(7,minute);

while(flag3)

{

if(key5==0)

{

delay(time);

if(key5==0)

{

flag3=0;

flag=1;

TR0=1;

}

}

}

}

//////按键4处理函数//////

voidKEY4()

{

minute=20;

write_time(7,minute);

while(flag4)

{

if(key5==0)

{

delay(150);

if(key5==0)

{

flag4=0;

flag=1;

TR0=1;

}

}

}

}

voidwrite_time(uintaddr,uintdate)

{

uintge,shi;

ge=date%10;

shi=date/10;

write_com(0x80+addr);

write_date(0x30+shi);

write_date(0x30+ge);

if(addr==7&&date==0)

j=1;

if(j==1&&addr==10&&date==0)

{

flag0=1;

TR0=0;

TR1=1;

flag5=1;

}

}

//////初始化函数//////

voidinit()

{

P1=0xff;

RW=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=0xfc;

TL1=0x44;

ET1=1;

ET0=1;

//TR1=1;

//TR0=1;

EA=1;

flag0=1;

for(num=0;num<12;num++)

{

write_date(table[num]);

delay(20);

}

}

voidstart()

{

if(key1==0)

{

delay(time);

if(key1==0)

{

flag0=0;

flag1=1;

KEY1();

}

}

if(key2==0)

{

delay(time);

if(key2==0)

{

flag0=0;

flag2=1;

KEY2();

}

}

if(key3==0)

{

delay(time);

if(key3==0)

{

flag0=0;

flag3=1;

KEY3();

}

}

if(key4==0)

{

delay(150);

if(key4==0)

{

flag0=0;

flag4=1;

KEY4();

}

}

}

voidwrite_time0()

{

minute=minute-1;

write_time(7,minute);

write_time(10,59);

flag=0;

}

voidcounter()

{

if(t==20)

{

led_red=led_red^1;

if(flag==1)

write_time0();

t=0;

second=second-1;

write_time(10,second);

if(k==1&&second==59)

{

if(minute>0)

minute=minute-1;

write_time(7,minute);

}

if(second==0)

{

k=1;

second=60;

}

}

}

intmain()

{

init();

while

(1)

{

while(flag0)

start();

counter();

while(flag5)

{

delay1();

i++;

if(i>7)

i=0;

}

}

return0;

}

voidinter0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t++;

}

voidiniter1()interrupt3

{

TH1=table1[i]/256;

TL1=table1[i]%256;

P1_5=~P1_5;

if(key5==0)

{

delay(100);

if(key5==0)

{

TR1=0;

flag5=0;

k=0;

j=0;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1