《基于单片机控制的多功能广告牌的设计-本科论文.doc》由会员分享,可在线阅读,更多相关《基于单片机控制的多功能广告牌的设计-本科论文.doc(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目 录1 选题背景11.1 单片机的发展11.2 广告牌的发展12 方案论证12.1 单片机芯片12.2 时钟芯片22.3 显示芯片22.4 通信总线标准及其接口23 过程论述33.1 单片机最小系统33.2 时钟模块33.3 温度检测模块33.4 掉电保护模块33.5 通信模块43.6 显示模块43.7 报警模块43.8 按键模块43.9 电源模块43.10 系统总体电路图43.11 主程序设计43.12 时钟程序设计43.13 温度检测程序设计53.14 掉电保护程序设计63.15 通信程序设计63.16 显示程序设计73.17 按键程序设计74 结论总结85 设计体会8参 考 文 献10
2、附 录11附录I 系统原理图11附录II 主程序12附录III 时钟程序13附录IV 温度程序20附录VI 通信程序27附录VII 显示程序31附录VIII 按键程序36I1 选题背景近几年广告牌的发展越来越迅速,从纸制的布画形式到数字式广告。伴随着电子产品的发展进步,广告牌从样式和功能上都得到全方位的改善。广告牌已由传统的手绘图纸的形式向数字式转变,数字广告牌已逐渐成为街景,甚至超越传统广告牌成为城市风景。现如今,不论是国内还是国外,不论是大型广告牌还是小型广告牌,在设计上越来越讲求它的自动化和美观性。这些广告牌不仅简单方便,并且具备一些其他的功能。本次设计的内容是基于单片机控制的多功能广告
3、牌,该广告牌的内容除了实现显示广告外,还具有显示时间,检测温度,掉电保护,设置时间,设置显示广告内容,温度报警及与计算机通信的功能。硬件电路设计和软件程序设计均以模块化方式设计,保证它们的通用性,易读性和易于扩展性。在设计的过程中最重要的是资源的合理利用,干扰的处理,程序的嵌套顺序及程序的冗杂处理。本设计通过对硬件选型的分析,进行模块化设计和调试,最终实现整个系统的功能,并进行优化。1.1 单片机的发展1974年,美国仙童(Fairchild)公司研制了世界上第一台单片机F8。从此单片机开始迅速发展,应用领域也不断扩大,现已成为微型计算机的重要分支。目前,单片机的主流仍然是8位高性能单片机。其
4、发展具体体现在CPU功能增强、内部资源增多、引脚的多功能化、低电压、低功耗等。单片机的发展是为了满足不断增长的自动检测、控制的要求。具体体现在传感器接口、各种工业对象的电气接口、功率驱动接口、人机接口、通信网络接口。这些接口性能的发展体现在高速的I/O能力,较强的中断处理能力,较高的A/D、D/A性能,较强的位操作能力、功率驱动能力、程序运行监控能力、信号实时处理能力等。总之,单片机将向高性能、高可靠性、低电压、低功耗、低噪声、低成本的方向发展 1。1.2 广告牌的发展随着新科技的不断涌现,广告牌的模式和设计也日新月异,广告牌已由传统的手绘图纸的形式向数字式转变,数字广告牌已逐渐成为街景,甚至
5、超越传统广告牌成为城市风景。现如今,不论是国内还是国外,不论是大型广告牌还是小型广告牌,在设计上越来越讲求它的自动化和美观性。大型广告牌的发展日趋激烈,小型广告牌也在加速渗入到我们生活的各个角落中,这些广告牌不仅简单方便,并且具备一些其他的功能。小型数字广告牌由于它的简单小巧,原材料便宜,且适合于多种场合而越来越受到厂商们的青睐。2 方案论证2.1 单片机芯片方案一:MSP430单片机MSP430系列单片机是美国德州仪器(TI)公司生产的一种特低功耗的Flash微控制器。MSP430最大的特点就是超低功耗。程序代码空间60KB、数据存储空间2KB,I/O引脚48线,片内集成12位A/D,16位
6、定时器、模拟比较器、串行接口、硬件乘法器等模块2。方案二:STC89系列单片机STC89系列单片机是MCS-51系列单片机的派生产品。它的主要特性有:5V工作电压,操作频率040MHZ;1K字节RAM;支持12时钟或6时钟模式;4个8位I/O口,含3个高电流P1口,可直接驱动LED;3个16位定时器/计数器等。通过比较,选择STC89系列单片机,它能够满足设计要求和需要,并且价格便宜。2.2 时钟芯片方案一:X1203X1203是一个带时钟/日历和两个闹钟的实时时钟芯片。该芯片以秒、分、时、星期、日、月和年为单位跟踪时间。具有闰年校正功能,并能对小于31天的月份自动进行调整。方案二:DS130
7、2DS1302是一种高性能,低功耗,带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能。采用三线串行数据传输接口与CPU进行同步通信,具有主电源/后备电源双电源引脚。通过综合比较,由于DS1302的电路简单,软件控制容易,故选取DS1302芯片。2.3 显示芯片显示模块采用液晶显示,常用的显示模块有以下两种。方案一:通用LCD1602液晶片1602为字符型LCD,它具有40通道点阵LCD 驱动。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码。方案二:FYD-12864-0402BFYD-
8、12864-0402B内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864,可以显示84行1616点阵的汉字,也可完成图形显示。低电压低功耗。通过综合比较,1602不能满足设计的需要,故选择FYD-12864-0402B液晶模块。2.4 通信总线标准及其接口方案一:RS-485总线标准与接口电路RS-485的通信距离为几十米至上千米。它采用平衡发送和差分接收。具有较高的灵敏度,能检测低至200mV的电压3。方案二:RS-232C总线标准与接口电路RS-232C采取不平衡传输方式,是为点对点通信而设计的,驱动器负载为37k。RS-232C适用于传送距离不大于15m,
9、速度不高于20kb/s的本地设备之间通信的场合4。通过综合比较,由于设计中要求的传送距离短,故选择RS-232总线标准。3 过程论述基于单片机控制的广告牌由显示部分、温度检测部分、万年历部分、通信部分、掉电保护部分和报警部分组成。采用模块化设计,液晶显示,滚动显示广告,广告下方显示日期、时间和温度;内部可以存储多条广告,并通过按键调整时间和选择要显示的广告;检测周围温度,并且在温度高于或低于某一值时,报警装置报警;用E2PROM芯片来实现掉电保护功能;与计算机通信,传送日期、时间和温度。该装置屏幕刷新速度快,显示可靠,性能稳定,控制简单,并且具备多种功能,适用于多种场合。本次设计的电路原理图在
10、PROTEL 99SE环境下制作完成。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芯片,在连线时,则
11、将芯片的地址引脚接地,默认为0。写保护引脚WP接地,允许器件进行正常的读/写操作。串行时钟SCL与串行数据/地址SDA引脚与单片机相连,用于产生时钟及发送和接收数据。3.5 通信模块通信部分的连接器采用DB-9连接器。利用MAX232芯片完成TTL到EIA的双向电平转换。3.6 显示模块在显示数据前,要先确定显示数据的坐标。在显示广告时,会出现两个问题:一是循环显示广告时,广告的末尾自动添加为最后一个字的内容;二是广告内容与其它行的内容重叠。在本次设计中,液晶模块采用12864,液晶模块12864采用并口方式。3号引脚用来调节液晶屏的亮度。19、20号引脚提供背光源。415号引脚与单片机相连,
12、用于数据和指令信息的传输。3.7 报警模块报警部分采用蜂鸣器报警,一端接+5V,另一端接NPN和电阻后与单片机相连。3.8 按键模块 本次设计只有5个按键,故采用独立式按键。3.9 电源模块 电源部分采用交直流电源从电源插座输入,通过7805三端稳压器得到5V的直流电源。J4为DC-005B插座。3.10 系统总体电路图系统总体电路原理图见附录。3.11 主程序设计程序设计采用模块化编程,总体设计思想为:进入主程序后,先设置串口通信的波特率和定时时间,并对液晶屏、时钟芯片进行初始化,之后循环调用显示程序。设置定时中断,每隔20ms扫描一次键盘。主程序见附录。3.12 时钟程序设计时钟模块在这里
13、采用DS1302,DS1302需要提供32.768MHz的晶振。它有两个电源:后备电源Vcc1和主电源Vcc2。时钟芯片工作前先将掉电保护芯片EPROM中的时间数据初始化到DS1302中,该过程已在主程序中执行。时钟读程序嵌套在显示程序中。时钟信息以BCD码的形式存储在7个时钟/日历写读寄存器内。时钟程序流程图如图3-2所示。时钟程序见附录。 (a)时钟读程序 (b)时钟初始化程序图3-2 时钟程序流程图3.13 温度检测程序设计温度程序嵌套在显示程序中,DS18B20所有的执行都从一个初始化序列开始。在单线端口条件下,必须先建立ROM操作协议,才能进行存储器和控制操作。温度信息以16bit带
14、符号位扩展的二进制补码形式读出。温度检测流程图如图3-3所示。温度程序见附录。图3-3 温度检测流程图3.14 掉电保护程序设计掉电保护程序完成对时间信息和广告信息的保护。掉电保护程序分为读程序和写程序,在本程序中写操作为字节写,读操作为选择性读。掉电保护程序的流程图如图3-4。掉电保护程序见附录。 (a)写程序 (b)读程序图3-4 掉电保护程序流程图3.15 通信程序设计单片机与计算机的通信只是单片机向计算机传送数据。串行口的波特率位1200。发送的一帧信息包括1个起始位0,8个数据位和一个停止位1。数据发送结束时TI由硬件自动置位。通信程序流程图如图3-5所示。通信程序见附录。图3-5
15、通信程序流程图3.16 显示程序设计在显示数据前,要先确定显示数据的坐标。在显示广告时,会出现两个问题:一是循环显示广告时,广告的末尾自动添加为最后一个字的内容;二是广告内容与其它行的内容重叠。为解决这个问题,设置一个算法,当循环显示广告时,在广告的末尾补空格,消除多余的字;将与其它行的内容重叠的信息截除,不显示,避免信息的重叠。显示程序的流程图如图3-6所示。显示程序见附录。图3-6 显示程序流程图3.17 按键程序设计按键为独立式按键,按键的功能依次为KEY1调整时间的选择按键,KEY2加一按键,KEY3减一按键,KEY4停止调整时间按键,KEY5选择广告按键。 按键程序流程图如图3-7所
16、示。按键程序见附录。图3-7 按键程序流程图4 结论总结基于单片机控制的多功能广告牌的原理设计方法简单,但实际设计过程中操作不易,会出现各种各样的问题,尤其在将各模块组合起来的时候,容易产生混乱,但是通过反复的设计和调试,最终成功实现了各部分的功能,完成了本次设计。但是还是存在很多问题,例如虽然经过多次的调整,但广告显示的速度仍旧不是很快,这一部分仍然需要进一步的调整。总之,从总体上看,本次设计是比较成功的。5 设计体会 通过这次课程设计,我觉得自己学到了很多东西。课程设计是对我们这学期单片机学习的总考验。这次课程设计,我有以下一些体会:大学大部分时间都是在学习理论基础知识,并未真正地去应用和
17、实践。自从入学以来,了解了自己本专业信息之后,我就开始了我的电子信息工程的学习生涯,这次课程设计涉及到的知识,是我以前极少接触的,也不懂的,其中我涉及了很多平时没有接触到的元器等,使我发现了自己很多不足之处。我还从中体会到了所学理论知识的重要性:知识掌握越多,设计得就更加严谨,更加顺利。我了解了进行一项相对比较大型的科研设计所必不可少的几个阶段。课程设计能够从理论设计和工程实践相结合,全方面的培养学生的全面素质。我经过这次系统的课程设计,熟悉了对一项课题进行研究,设计和试验的详细过程。这些对我在将来的工作和学习当中都会有很大的帮助。我加深了解了查阅资料和利用工具书的重要性。平时课堂上所学习的知
18、识大多比较陈旧,作为电子信息工程专业的学生,由于专业涉及知识广,不仅要懂单片机的知识,还要懂模拟电子、数字电子等等方面的知识。一个人不可能什么都学过,什么都懂,因此,当我在设计过程中需要用到一些不曾学过的东西时,就要去有针对性地查找资料,然后加以利用吸收,以提高自己的应用能力,而且还能增长自己见识,补充我的专业知识。 参 考 文 献1 张鑫.单片机原理及应用M.电子工业出版社.20132 杨恢先等.单片机原理及应用M.国防科技大学出版社.20143 胡汉才.单片机原理及其接口技术M.清华大学出版社.20144 沈红卫.单片机应用系统设计实例与分析M.北京航空航天大学出版社.201310附 录附
19、录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(); void timer0() interrupt 1 TH0= 0xb1; TL0= 0xe0; Keycan();附录III 时钟程序#include #include uc
20、har hide_h7;uchar dip_flag=0;void DS1302InputByte(uchar d) uchar i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; uchar DS1302OutputByte(void) uchar i; for(i=8; i0; i-) ACC = ACC 1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write13
21、02(uchar ucAddr, uchar ucDa) DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); DS1302InputByte(ucDa); DS1302_CLK = 1; DS1302_RST = 0; uchar Read1302(uchar ucAddr) uchar ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); ucData = DS1302OutputB
22、yte(); DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time ) uchar protect17;int i;protect10 = Read1302(DS1302_SECOND);Time-Second = (protect10&0x70)4)*10 + (protect10&0x0F);protect11 = Read1302(DS1302_MINUTE);Time-Minute = (protect11&0x70)4)*10 + (protect11&0x0F);pro
23、tect12 = Read1302(DS1302_HOUR);Time-Hour = (protect12&0x70)4)*10 + (protect12&0x0F);protect13 = Read1302(DS1302_DAY);Time-Day = (protect13&0x70)4)*10 + (protect13&0x0F);protect14 = Read1302(DS1302_WEEK);Time-Week = (protect14&0x10)4)*10 + (protect14&0x0F);protect15 = Read1302(DS1302_MONTH);Time-Mont
24、h = (protect15&0x70)4)*10 + (protect15&0x0F);protect16 = Read1302(DS1302_YEAR);Time-Year = (protect16&0xf0)4)*10 + (protect16&0x0F); SDA = 1; SCL = 1; fill_byte(7,0xff); for(i = 0 ; i DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0;else
25、 if(dip_flag=0) dip_flag=1; Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ; else dip_flag=0; Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; Time-DateString4=-; if(hide_h5=0) Time-DateString5 =
26、Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0;else if(dip_flag=0) dip_flag=1; Time-DateString5 = ; Time-DateString6 = ; else dip_flag=0; Time-DateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; Time-DateString7=-;if(hide_h4=0) Time-DateString8 = Time-Day/10 + 0; Time-Dat
27、eString9 = Time-Day%10 + 0;else if(dip_flag=0) dip_flag=1; Time-DateString8 = ; Time-DateString9 = ; else dip_flag=0; Time-DateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; if(hide_h3=0) if(Time-Week = 0) Time-Week = 1; week0 =tab2*(Time-Week%10)-2; week1 =tab2*(Time-Week%10)-1;else
28、 if(dip_flag=0) dip_flag=1; week0 = ; week1 = ; else dip_flag=0; if(Time-Week = 0) Time-Week = 1; week0 =tab2*(Time-Week%10)-2; week1 =tab2*(Time-Week%10)-1; week2 = 0;Time-DateString10 = 0; void TimeToStr(SYSTEMTIME *Time) read(hide_h);if(hide_h2=0) Time-TimeString0 = Time-Hour/10 + 0; Time-TimeStr
29、ing1 = Time-Hour%10 + 0;else if(dip_flag=0) dip_flag=1; Time-TimeString0 = ; Time-TimeString1 = ; else dip_flag=0; Time-TimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; Time-TimeString2 = :; if(hide_h1=0) Time-TimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 +
30、0;else if(dip_flag=0) dip_flag=1; Time-TimeString3 = ; Time-TimeString4 = ; else dip_flag=0; Time-TimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; Time-TimeString5 = :;if(hide_h0=0) Time-TimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else if(dip_flag
31、=0) dip_flag=1; Time-TimeString6 = ; Time-TimeString7 = ; else dip_flag=0; Time-TimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; Time-TimeString8 = 0;void Initial_DS1302(void) uchar Second=Read1302(DS1302_SECOND);uchar protect7;protect_read(protect);if(Second&0x80) Write1302(
32、0x8e,0x00); Write1302(0x8c,protect6);Write1302(0x88,protect5);Write1302(0x8a,protect4);Write1302(0x86,protect3);Write1302(0x84,protect2);Write1302(0x82,protect1);Write1302(0x80,protect0);Write1302(0x8e,0x80);附录IV 温度程序#include #include uchar temp_value,temp1_value; void beep(); void delay_18B20(unsig
33、ned int i)while(i-);void Init_DS18B20(void) unsigned char x=0; DQ = 1; delay_18B20(8); DQ = 0; delay_18B20(40); DQ = 1; delay_18B20(7); x=DQ; delay_18B20(10); uchar ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; dat=1; DQ = 1; if(DQ) dat|=0x80; delay_18B20(4); return(dat);void Writ
34、eOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; void ReadTemp(uchar *Temp)uchar a=0;uchar b=0;uchar t;uchar value_point;Init_DS18B20();WriteOneChar(0xCC); WriteOneChar(0x44); delay_18B20(100); Init_DS18B20();WriteOneChar(0xCC); WriteOneChar(0xBE
35、); delay_18B20(50);a=ReadOneChar(); b=ReadOneChar(); t=b&0xf8;if(t) Temp0=:; Temp1=-; temp_value=b4; temp_value=temp_value+1; temp1_value=a&0x0f; beep();else temp_value=b4; temp1_value=a&0x0f; Temp0=:; Temp1=temp_value/100+0; if(Temp1=1) Temp1=1; else Temp1= ; value_point = temp1_value*625/1000%10*1
36、00+temp1_value*625/100%10*10+temp1_value*625/10%10; value_point = value_point/1000; value_point = value_point+temp_value; if( (value_point = 33) | (value_point = 25) ) beep(); void temp_to_str(uchar *Temp) Temp2=temp_value%100/10+0; Temp3=temp_value%10+0; Temp4=.; Temp5=temp1_value*625/1000%10+0; Te
37、mp6=temp1_value*625/100%10+0; Temp7=temp1_value*625/10%10+0; Temp8=0;附录V 掉电保护程序#include #include #include declare.hvoid start(); void stop(); uchar shin(); bit shout(uchar write_data); void write_byte( uchar addr, uchar write_data); void fill_byte(uchar fill_size,uchar fill_data);void delayms(uint ms);uchar read_current(); uchar read_random(uchar random_addr); #define delayNOP(); _nop_();_nop_();_nop_();_nop_(); void protect_read(uchar *protect) uchar i; SDA = 1; SCL = 1; for(i = 0 ; i 7; i+) protecti = read_random(i); void start() SDA = 1; SCL = 1; delayNOP(); SDA = 0; delayNOP(); SCL = 0;