艺术彩灯的控制设计.docx
《艺术彩灯的控制设计.docx》由会员分享,可在线阅读,更多相关《艺术彩灯的控制设计.docx(8页珍藏版)》请在冰豆网上搜索。
艺术彩灯的控制设计
题目艺术彩灯的控制
任务与要求
1)以MCS-51系列单片机为核心器件,组成一个艺术彩灯控制系统。
2)七彩灯的跳变、渐变控制。
3)跳变、渐变时间的可调。
…………………………装………………………………订………………………………线………………………………………………………………
艺术彩灯的控制
摘要:
本文介绍了用单片机芯片AT89S52,并用C语言编程所设计的艺术彩灯的控制,简要地说明电路图,并且给出了硬件组成及其功能。
关键词:
AT89S52、C语言、艺术彩灯
硬件部分:
本课程设计硬件主要是单片机芯片AT89S52。
AT89S52主要性能:
1.与MCS-51单片机产品兼容
2.8K字节在系统可编程Flash存储器
3.32个可编程I/O口线
4.三个16位定时器/计数器
5.八个中断源
6.全双工UART串行通道
7.低功耗空闲和掉电模式
8.掉电后中断可唤醒
9.双数据指针
l0.掉电标识符
AT89S52功能特性描述:
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52部分引脚功能:
VCC:
电源
GND:
地
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5MOSI(在系统编程用)
P1.6MISO(在系统编程用)
P1.7SCK(在系统编程用)
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
引脚号第二功能
P3.0RXD(串行输入)
P3.1TXD(串行输出)
P3.2INT0(外部中断0)
P3.3INT0(外部中断0)
P3.4T0(定时器0外部输入)
P3.5T1(定时器1外部输入)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器写选通)
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
图一89S52芯片引脚图
硬件的两个基本电路:
图二时钟电路
图三复位电路
其总的硬件电路图及实物图如下:
软件部分由C语言编程控制彩灯的渐变及跳变,其流程如下:
LED逐盏渐亮——LED每两盏渐亮——LED三盏一起渐亮
具体程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
uinttime,time1,i,n=50;
bitmode;
sbitkey1=P3^2;//加
sbitkey2=P3^3;//减
ucharcodetable[]={0xfe,0xfd,0xfb,0xfc,0xf9,0xfa,0xf8};//流水控制表格
voidinit()//外部中0,1断初始化
{
EA=1;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
}
voidpwm()
{
time++;
if(time1