基于单片机控制的多功能广告牌的设计.docx

上传人:b****1 文档编号:14412270 上传时间:2023-06-23 格式:DOCX 页数:55 大小:193.55KB
下载 相关 举报
基于单片机控制的多功能广告牌的设计.docx_第1页
第1页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第2页
第2页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第3页
第3页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第4页
第4页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第5页
第5页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第6页
第6页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第7页
第7页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第8页
第8页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第9页
第9页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第10页
第10页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第11页
第11页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第12页
第12页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第13页
第13页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第14页
第14页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第15页
第15页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第16页
第16页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第17页
第17页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第18页
第18页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第19页
第19页 / 共55页
基于单片机控制的多功能广告牌的设计.docx_第20页
第20页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机控制的多功能广告牌的设计.docx

《基于单片机控制的多功能广告牌的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的多功能广告牌的设计.docx(55页珍藏版)》请在冰点文库上搜索。

基于单片机控制的多功能广告牌的设计.docx

基于单片机控制的多功能广告牌的设计

1选题背景1

 

1选题背景

近几年广告牌的发展越来越迅速,从纸制的布画形式到数字式广告。

伴随着电子产品的发展进步,广告牌从样式和功能上都得到全方位的改善。

广告牌已由传统的手绘图纸的形式向数字式转变,数字广告牌已逐渐成为街景,甚至超越传统广告牌成为城市风景。

现如今,不论是国内还是国外,不论是大型广告牌还是小型广告牌,在设计上越来越讲求它的自动化和美观性。

这些广告牌不仅简单方便,并且具备一些其他的功能。

本次设计的内容是基于单片机控制的多功能广告牌,该广告牌的内容除了实现显示广告外,还具有显示时间,检测温度,掉电保护,设置时间,设置显示广告内容,温度报警及与计算机通信的功能。

硬件电路设计和软件程序设计均以模块化方式设计,保证它们的通用性,易读性和易于扩展性。

在设计的过程中最重要的是资源的合理利用,干扰的处理,程序的嵌套顺序及程序的冗杂处理。

本设计通过对硬件选型的分析,进行模块化设计和调试,最终实现整个系统的功能,并进行优化。

1.1单片机的发展

1974年,美国仙童(Fairchild)公司研制了世界上第一台单片机F8。

从此单片机开始迅速发展,应用领域也不断扩大,现已成为微型计算机的重要分支。

目前,单片机的主流仍然是8位高性能单片机。

其发展具体体现在CPU功能增强、内部资源增多、引脚的多功能化、低电压、低功耗等。

单片机的发展是为了满足不断增长的自动检测、控制的要求。

具体体现在传感器接口、各种工业对象的电气接口、功率驱动接口、人机接口、通信网络接口。

这些接口性能的发展体现在高速的I/O能力,较强的中断处理能力,较高的A/D、D/A性能,较强的位操作能力、功率驱动能力、程序运行监控能力、信号实时处理能力等。

总之,单片机将向高性能、高可靠性、低电压、低功耗、低噪声、低成本的方向发展[1]。

1.2广告牌的发展

随着新科技的不断涌现,广告牌的模式和设计也日新月异,广告牌已由传统的手绘图纸的形式向数字式转变,数字广告牌已逐渐成为街景,甚至超越传统广告牌成为城市风景。

现如今,不论是国内还是国外,不论是大型广告牌还是小型广告牌,在设计上越来越讲求它的自动化和美观性。

大型广告牌的发展日趋激烈,小型广告牌也在加速渗入到我们生活的各个角落中,这些广告牌不仅简单方便,并且具备一些其他的功能。

小型数字广告牌由于它的简单小巧,原材料便宜,且适合于多种场合而越来越受到厂商们的青睐。

2方案论证

2.1单片机芯片

方案一:

MSP430单片机

MSP430系列单片机是美国德州仪器(TI)公司生产的一种特低功耗的Flash微控制器。

MSP430最大的特点就是超低功耗。

程序代码空间60KB、数据存储空间2KB,I/O引脚48线,片内集成12位A/D,16位定时器、模拟比较器、串行接口、硬件乘法器等模块[2]。

方案二:

STC89系列单片机

STC89系列单片机是MCS-51系列单片机的派生产品。

它的主要特性有:

5V工作电压,操作频率0~40MHZ;1K字节RAM;支持12时钟或6时钟模式;4个8位I/O口,含3个高电流P1口,可直接驱动LED;3个16位定时器/计数器等。

通过比较,选择STC89系列单片机,它能够满足设计要求和需要,并且价格便宜。

2.2时钟芯片

方案一:

X1203

X1203是一个带时钟/日历和两个闹钟的实时时钟芯片。

该芯片以秒、分、时、星期、日、月和年为单位跟踪时间。

具有闰年校正功能,并能对小于31天的月份自动进行调整。

方案二:

DS1302

DS1302是一种高性能,低功耗,带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能。

采用三线串行数据传输接口与CPU进行同步通信,具有主电源/后备电源双电源引脚。

通过综合比较,由于DS1302的电路简单,软件控制容易,故选取DS1302芯片。

2.3显示芯片

显示模块采用液晶显示,常用的显示模块有以下两种。

方案一:

通用LCD1602液晶片

1602为字符型LCD,它具有40通道点阵LCD驱动。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码。

方案二:

FYD-12864-0402B

FYD-12864-0402B内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,可以显示8×4行16×16点阵的汉字,也可完成图形显示。

低电压低功耗。

通过综合比较,1602不能满足设计的需要,故选择FYD-12864-0402B液晶模块。

2.4通信总线标准及其接口

方案一:

RS-485总线标准与接口电路

RS-485的通信距离为几十米至上千米。

它采用平衡发送和差分接收。

具有较高的灵敏度,能检测低至200mV的电压[3]。

方案二:

RS-232C总线标准与接口电路

RS-232C采取不平衡传输方式,是为点对点通信而设计的,驱动器负载为3~7kΩ。

RS-232C适用于传送距离不大于15m,速度不高于20kb/s的本地设备之间通信的场合[4]。

通过综合比较,由于设计中要求的传送距离短,故选择RS-232总线标准。

3过程论述

基于单片机控制的广告牌由显示部分、温度检测部分、万年历部分、通信部分、掉电保护部分和报警部分组成。

采用模块化设计,液晶显示,滚动显示广告,广告下方显示日期、时间和温度;内部可以存储多条广告,并通过按键调整时间和选择要显示的广告;检测周围温度,并且在温度高于或低于某一值时,报警装置报警;用E2PROM芯片来实现掉电保护功能;与计算机通信,传送日期、时间和温度。

该装置屏幕刷新速度快,显示可靠,性能稳定,控制简单,并且具备多种功能,适用于多种场合。

本次设计的电路原理图在PROTEL99SE环境下制作完成。

3.1单片机最小系统

本设计采用STC89C51RC芯片,由晶振电路和复位电路组成,电路如图3-1所示。

图3-1单片机最小系统

3.2时钟模块

时钟模块在这里采用DS1302,DS1302需要提供32.768MHz的晶振。

它有两个电源:

后备电源Vcc1和主电源Vcc2。

在本系统中主电源为+5V,后备电源为+3V电池。

3.3温度检测模块

温度传感器DS18B20只有三个引脚分别为DQ、VDD、GND。

DS18B20为单线总线,为保证其正常工作,DQ必须接一个近似于5KΩ的上拉电阻。

3.4掉电保护模块

在掉电保护模块中,本设计采用的是24C08芯片,在连线时,则将芯片的地址引脚接地,默认为0。

写保护引脚WP接地,允许器件进行正常的读/写操作。

串行时钟SCL与串行数据/地址SDA引脚与单片机相连,用于产生时钟及发送和接收数据。

3.5通信模块

通信部分的连接器采用DB-9连接器。

利用MAX232芯片完成TTL到EIA的双向电平转换。

3.6显示模块

在显示数据前,要先确定显示数据的坐标。

在显示广告时,会出现两个问题:

一是循环显示广告时,广告的末尾自动添加为最后一个字的内容;二是广告内容与其它行的内容重叠。

在本次设计中,液晶模块采用12864,液晶模块12864采用并口方式。

3号引脚用来调节液晶屏的亮度。

19、20号引脚提供背光源。

4~15号引脚与单片机相连,用于数据和指令信息的传输。

3.7报警模块

报警部分采用蜂鸣器报警,一端接+5V,另一端接NPN和电阻后与单片机相连。

3.8按键模块

本次设计只有5个按键,故采用独立式按键。

3.9电源模块

电源部分采用交直流电源从电源插座输入,通过7805三端稳压器得到5V的直流电源。

J4为DC-005B插座。

3.10系统总体电路图

系统总体电路原理图见附录Ⅰ。

3.11主程序设计

程序设计采用模块化编程,总体设计思想为:

进入主程序后,先设置串口通信的波特率和定时时间,并对液晶屏、时钟芯片进行初始化,之后循环调用显示程序。

设置定时中断,每隔20ms扫描一次键盘。

主程序见附录Ⅱ。

3.12时钟程序设计

时钟模块在这里采用DS1302,DS1302需要提供32.768MHz的晶振。

它有两个电源:

后备电源Vcc1和主电源Vcc2。

时钟芯片工作前先将掉电保护芯片E²PROM中的时间数据初始化到DS1302中,该过程已在主程序中执行。

时钟读程序嵌套在显示程序中。

时钟信息以BCD码的形式存储在7个时钟/日历写读寄存器内。

时钟程序流程图如图3-2所示。

时钟程序见附录Ⅲ。

(a)时钟读程序(b)时钟初始化程序

图3-2时钟程序流程图

3.13温度检测程序设计

温度程序嵌套在显示程序中,DS18B20所有的执行都从一个初始化序列开始。

在单线端口条件下,必须先建立ROM操作协议,才能进行存储器和控制操作。

温度信息以16bit带符号位扩展的二进制补码形式读出。

温度检测流程图如图3-3所示。

温度程序见附录Ⅳ。

图3-3温度检测流程图

3.14掉电保护程序设计

掉电保护程序完成对时间信息和广告信息的保护。

掉电保护程序分为读程序和写程序,在本程序中写操作为字节写,读操作为选择性读。

掉电保护程序的流程图如图3-4。

掉电保护程序见附录Ⅴ。

(a)写程序(b)读程序

图3-4掉电保护程序流程图

3.15通信程序设计

单片机与计算机的通信只是单片机向计算机传送数据。

串行口的波特率位1200。

发送的一帧信息包括1个起始位0,8个数据位和一个停止位1。

数据发送结束时TI由硬件自动置位。

通信程序流程图如图3-5所示。

通信程序见附录Ⅵ。

图3-5通信程序流程图

3.16显示程序设计

在显示数据前,要先确定显示数据的坐标。

在显示广告时,会出现两个问题:

一是循环显示广告时,广告的末尾自动添加为最后一个字的内容;二是广告内容与其它行的内容重叠。

为解决这个问题,设置一个算法,当循环显示广告时,在广告的末尾补空格,消除多余的字;将与其它行的内容重叠的信息截除,不显示,避免信息的重叠。

显示程序的流程图如图3-6所示。

显示程序见附录Ⅶ。

图3-6显示程序流程图

3.17按键程序设计

按键为独立式按键,按键的功能依次为KEY1调整时间的选择按键,KEY2加一按键,KEY3减一按键,KEY4停止调整时间按键,KEY5选择广告按键。

按键程序流程图如图3-7所示。

按键程序见附录Ⅷ。

图3-7按键程序流程图

4结论总结

基于单片机控制的多功能广告牌的原理设计方法简单,但实际设计过程中操作不易,会出现各种各样的问题,尤其在将各模块组合起来的时候,容易产生混乱,但是通过反复的设计和调试,最终成功实现了各部分的功能,完成了本次设计。

但是还是存在很多问题,例如虽然经过多次的调整,但广告显示的速度仍旧不是很快,这一部分仍然需要进一步的调整。

总之,从总体上看,本次设计是比较成功的。

5设计体会

通过这次课程设计,我觉得自己学到了很多东西。

课程设计是对我们这学期单片机学习的总考验。

这次课程设计,我有以下一些体会:

大学大部分时间都是在学习理论基础知识,并未真正地去应用和实践。

自从入学以来,了解了自己本专业信息之后,我就开始了我的电子信息工程的学习生涯,这次课程设计涉及到的知识,是我以前极少接触的,也不懂的,其中我涉及了很多平时没有接触到的元器等,使我发现了自己很多不足之处。

我还从中体会到了所学理论知识的重要性:

知识掌握越多,设计得就更加严谨,更加顺利。

我了解了进行一项相对比较大型的科研设计所必不可少的几个阶段。

课程设计能够从理论设计和工程实践相结合,全方面的培养学生的全面素质。

我经过这次系统的课程设计,熟悉了对一项课题进行研究,设计和试验的详细过程。

这些对我在将来的工作和学习当中都会有很大的帮助。

我加深了解了查阅资料和利用工具书的重要性。

平时课堂上所学习的知识大多比较陈旧,作为电子信息工程专业的学生,由于专业涉及知识广,不仅要懂单片机的知识,还要懂模拟电子、数字电子等等方面的知识。

一个人不可能什么都学过,什么都懂,因此,当我在设计过程中需要用到一些不曾学过的东西时,就要去有针对性地查找资料,然后加以利用吸收,以提高自己的应用能力,而且还能增长自己见识,补充我的专业知识。

 

参考文献

[1]张鑫.单片机原理及应用[M].电子工业出版社.2013

[2]杨恢先等.单片机原理及应用[M].国防科技大学出版社.2014

[3]胡汉才.单片机原理及其接口技术[M].清华大学出版社.2014

[4]沈红卫.单片机应用系统设计实例与分析[M].北京航空航天大学出版社.2013

 

附录

附录I系统原理图

附录II主程序

#include

#include

main()

{

SCON=0x40;

PCON=0;TMOD=0x21;

TH1=0xe6;

TL1=0xff;

TR1=1;

TH0=0xb1;

TL0=0xe0;

EA=1;

ET0=1;

TR0=1;

init_lcd();

clrram_lcd();

Initial_DS1302();

while

(1)

{

show_time();

}

}

voidtimer0()interrupt1

{

TH0=0xb1;

TL0=0xe0;

Keycan();

}

 

附录III时钟程序

#include

#include

ucharhide_h[7];

uchardip_flag=0;

voidDS1302InputByte(uchard)

{

uchari;

ACC=d;

for(i=8;i>0;i--)

{

DS1302_IO=ACC0;

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>>1;

}

}

ucharDS1302OutputByte(void)

{

uchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;ACC7=DS1302_IO;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

}

voidWrite1302(ucharucAddr,ucharucDa)

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);

DS1302InputByte(ucDa);

DS1302_CLK=1;

DS1302_RST=0;

}

ucharRead1302(ucharucAddr)

{

ucharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr|0x01);

ucData=DS1302OutputByte();

DS1302_CLK=1;

DS1302_RST=0;

return(ucData);

}

voidDS1302_GetTime(SYSTEMTIME*Time)

{

ucharprotect1[7];

inti;

protect1[0]=Read1302(DS1302_SECOND);

Time->Second=((protect1[0]&0x70)>>4)*10+(protect1[0]&0x0F);

protect1[1]=Read1302(DS1302_MINUTE);

Time->Minute=((protect1[1]&0x70)>>4)*10+(protect1[1]&0x0F);

protect1[2]=Read1302(DS1302_HOUR);

Time->Hour=((protect1[2]&0x70)>>4)*10+(protect1[2]&0x0F);

protect1[3]=Read1302(DS1302_DAY);

Time->Day=((protect1[3]&0x70)>>4)*10+(protect1[3]&0x0F);

protect1[4]=Read1302(DS1302_WEEK);

Time->Week=((protect1[4]&0x10)>>4)*10+(protect1[4]&0x0F);

protect1[5]=Read1302(DS1302_MONTH);

Time->Month=((protect1[5]&0x70)>>4)*10+(protect1[5]&0x0F);

protect1[6]=Read1302(DS1302_YEAR);

Time->Year=((protect1[6]&0xf0)>>4)*10+(protect1[6]&0x0F);

SDA=1;

SCL=1;

fill_byte(7,0xff);

for(i=0;i<7;i++)

{

write_byte(i,protect1[i]);

}

}

voidDateToStr(SYSTEMTIME*Time,uchar*week)

{

ucharcodetab[]={0XD2,0XBB,0XB6,0XFE,0XC8,0XFD,0XCB,0XC4,0XCE,0XE5,0XC1,0XF9,0XC8,0XD5};

if(hide_h[6]==0)

{

Time->DateString[0]='2';

Time->DateString[1]='0';

Time->DateString[2]=Time->Year/10+'0';

Time->DateString[3]=Time->Year%10+'0';

}

else{

if(dip_flag==0)

{dip_flag=1;

Time->DateString[0]='';

Time->DateString[1]='';

Time->DateString[2]='';

Time->DateString[3]='';

}

else

{dip_flag=0;

Time->DateString[0]='2';

Time->DateString[1]='0';

Time->DateString[2]=Time->Year/10+'0';

Time->DateString[3]=Time->Year%10+'0';

}

}

Time->DateString[4]='-';

if(hide_h[5]==0)

{

Time->DateString[5]=Time->Month/10+'0';

Time->DateString[6]=Time->Month%10+'0';

}

else

{

if(dip_flag==0)

{dip_flag=1;

Time->DateString[5]='';

Time->DateString[6]='';

}

else

{dip_flag=0;

Time->DateString[5]=Time->Month/10+'0';

Time->DateString[6]=Time->Month%10+'0';

}

}

Time->DateString[7]='-';

if(hide_h[4]==0){

Time->DateString[8]=Time->Day/10+'0';

Time->DateString[9]=Time->Day%10+'0';

}

else

{

if(dip_flag==0)

{dip_flag=1;

Time->DateString[8]='';

Time->DateString[9]='';

}

else

{dip_flag=0;

Time->DateString[8]=Time->Day/10+'0';

Time->DateString[9]=Time->Day%10+'0';

}

}

if(hide_h[3]==0)

{

if(Time->Week==0)Time->Week=1;

week[0]=tab[2*(Time->Week%10)-2];week[1]=tab[2*(Time->Week%10)-1];

}

else

{

if(dip_flag==0)

{dip_flag=1;

week[0]='';

week[1]='';

}

else

{dip_flag=0;

if(Time->Week==0)Time->Week=1;

week[0]=tab[2*(Time->Week%10)-2];

week[1]=tab[2*(Time->Week%10)-1];

}

}

week[2]='\0';

Time->DateString[10]='\0';

}

voidTimeToStr(SYSTEMTIME*Time)

{

read(hide_h);

if(hide_h[2]==0)

{

Time->TimeString[0]=Time->Hour/10+'0';

Time->TimeString[1]=Time->Hour%10+'0';

}

else

{

if(dip_flag==0)

{dip_flag=1;

Time->TimeString[0]='';

Time->TimeString[1]='';

}

else

{dip_flag=0;

Time->TimeString[0]=Time->Hour/10+'0';

Time->TimeString[1]=Time->Hour%10+'0';

}

}

Time->TimeString[2]=':

';

if(hide_h[1]==0)

{

Time->TimeString[3]=Time->Minute/10+'0';

Time->TimeString[4]=Time->Minute%10+'0';

}

else

{

if(dip_flag==0)

{dip_flag=1;

Time->TimeString[3]='';

Time->TimeString[4]='';

}

else

{dip_flag=0;

Time

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

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2