已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机课程设计自适应屏幕亮度调节 班级:自动化摘要:本设计是基于单片机的的液晶屏幕亮度自动调节系统,如今市场上大多数电子设备的显示屏都是液晶的,虽然相比于传统电子设备的屏幕,它具有功耗小,辐射小(几乎没有辐射)等优点,但是由于它的亮度过高,反而更容易是我们的眼睛变得疲劳,造成视力下降,甚至产生头痛等症状。基于此原因,我设计出了一个比较简易的液晶屏幕亮度自动调节装置,它通过根据所处环境中的光的亮度,来自动调节屏幕的背光的亮度,而不是使屏幕一直保持在同一个亮度,通过自动调节,在一定程度上可以使得它的功耗进一步减少,此外最重要的是通过自适应亮度调节,可以使我们(观察者)在浏览屏幕内容的时候,眼睛更加舒服,减少了亮度不适带来的眼睛疲劳,保护了我们的视力。关键词:单片机技术、自动调节一、 实验设计目的学习并掌握单片机i/o口的基本输入输出功能;学习信号处理中比较常用的a/d和d/a的过程处理;学习单片机内部定时器的操作;学习并掌握液晶屏1602的显示操作;学习并掌握光敏电阻的使用方法;二、 设计任务及要求以单片机为核心处理部件,根据液晶屏设备所处的环境来自动调节屏幕背光亮度;除了自动调节功能外,出于特殊情况,自动调节后的屏幕亮度可能不能满足我们的要求,这时就需要手动调节屏幕亮度,所以设计中还需要一个开关来负责切换自动调节功能和手动调节功能,在自动调节功能中,有两个按钮负责控制亮度增大或亮度减小。三、 硬件设计1. 光敏部分和a/d处理此部分是根据当前所处环境的光的强度,转化成一个8位的数字量,其中这个数字量是自己定义的,然后送到89c52芯片中进行处理。原理框图如下:电路原理图(用proteus仿真):1)光强的处理部分,出于经济方面的原因,我采用的最原始的光敏电阻,根据光敏电阻的物理特性:随着外界光照强度的变大,光敏电阻的阻值减小。如上图所示,让它和一个电阻串联,根据分压关系,通过采集定值电阻两端的电压,来大致判断光线强度的变化。我采用的是光敏电阻5516,它的特性参数如下:2)a/d模块这里采用的是adc0809,下面是它的特性参数:adc0809的转化时间极快,需要极高频率的时钟脉冲,在这里我是通过89c52的定时器中断来产生一个500khz的时钟脉冲,然后通过p1.0口输出给adc0809的cp接口,此外adc0809的start接口和eoc接口直接相连,这样就可以满足当一个信号转化完后,就会自动进行下一个模拟信号的转化。3)输出部分通过74ls373锁存器实现,功能表如下:电路中让oe接地,让le接adc0809的eoc接口,根据adc0809资料可知,每次转化一个模拟信号,eoc会输出一个高电平,而在转化过程中保持低电平,根据此特性,正好可以触发74ls373,使它的工作方式发生变化,由保持工作方式转化为直通工作方式,正好达到了数据输出的目的。2. 89c52单片机进行内部信息处理此部分的作用是根据前面部分输出的数字信号,进行分析,来确定输出8位数字输出量(自定义的),用于后面电压大小的控制。电路原理图如下(proteus仿真):如图所示,p2口作为数据输入的端口,p3口作为数据输出的端口,此部分关键是对数字量的处理,如何根据光强来确定屏幕光的强度,这里我的处理比较粗糙,我是将屏幕的亮度分成了15共5个等级,亮度逐级递增,据此将外界的光强划分成了5个阶段,然后根据光强所处的阶段,来确定屏幕的亮度,大体思想是外界的光线强度越大,屏幕的亮度越暗。因为没有科学的数据,只能通过自己的大致测量来确定,这里是比较粗糙的,如果有足够的时间来统计相关信息,并总结出较为科学的数据,这里可以将程序改的更加精确一些。3. d/a部分数据处理此部分用于将89c52芯片输出的数字量转化为电压,来用于控制lcd1602的背光亮度。结构框图如下:电路原理图如下:(proteus仿真)给dac0832的参考电压输入5v,然后将8位2进制数据输入进行d/a转化,通过iout1和iout2输出,这里是电流量,我们需要把它转化为电压来处理,这里结合使用了运算放大器,但使用一个运算放大器输出电压的范围是-5v0v,所以这里在电路的后面又接了一个反向运算放大器,通过控制电阻的阻值,调整放大系数为-1,这样就能保证最后的输出电压量为正值,然后输出到lcd1602的控制端口,控制屏幕亮度。4. 显示电路部分这里让89c52的p0口作为显示部分的数据输出端口电路原理图如下:(proteus仿真)89c52的p0口不同于p1p3,它内部本身没有加上拉电阻,常态是处于高阻态,若想让它作为输入输出使用,必须自己给它外接上拉电阻,否则它的状态是不稳定的,这里接的是10k的上拉电阻,然后将lcd1602的其他管教根据要求连接好,其中15和16管脚表示背光控制的正极和负极,要想控制它的背光亮度,这两个管脚需要我们输入电压来控制,这里将16脚接地,然后把电压输入到15脚,达到控制的目的。5. 整体硬件电路图四、 软件设计1. 产生500khz的时钟脉冲,提供给adc0809利用单片机定时器0,设置它的工作方式为1:16位定时器/计数器。adc0809正常工作需要的频率较高,需要大概100us左右就给一个脉冲,频率为500khz左右。当定时器的工作方式为1时,设机器周期为t,定时器产生一次中断的时间为t,那么需要计数的个数n=t/t,装入th0和tl0中的数分别为:th0=(65536-n)/256,tl0=(65536-n)%256;据此求得n2,所以程序如下:tmod=0x01; th0=(65536-2)/256; tl0=(65536-2)%256;2. 数据分析我将前端电路获取的8位数字量大致分成了5个阶段,分别为050,51100,101150,151200,201255;然后让它们分别对应的屏幕亮度为5,4,3,2,1;大体思想就是外界环境中光线强度越大,液晶屏的亮度越小;这种思路是比较粗糙的,如果有足够的时间来进行相关信息的统计,并据此来获得比较科学的数据,程序可以进一步来改进。代码如下:if(p2200&p2150&p2100&p250&p2=0&p2=50)level=5;3. 1602液晶显示以及显示汉字lcd1602是字符型液晶显示屏,共有16个管脚,其中8个用于数据的传输,其余的管脚1、2、3分别表示vcc、gnd和对比度调节端口,4、5、6端口用于设置显示器的工作方式,15、16分别表示屏幕背光强度的正极和负极。控制液晶显示的主要步骤:设置显示模式:0x38:16*2显示,5*7点阵,8位数据接口设置数据指针:80h+地址码控制显示开/关,并设置光标:0x06:打开显示,当读写一个字符后,地址指针加1清屏设置:0x01前面的设置工作做好了,然后就可以显示数据了。要显示的数据存在了ddram,而我们还可以自定义一些字符来显示,lcd1602中的cgram有64字节的空间存储自定义的字符,lcd1602中每个字符的像素为5*8,在自定义的字符中,每个字符占用8个字节(8个8位2进制数表示),所以最多可以存储8个自定义字符。因为在程序中,我想用中文显示年月日,所以我在程序中自定义了几个字符,如下uchar code table=0x04,0x0e,0x1b,0x15,0x1b,0x0e,0x04,0x00,/背光0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,/年0x0f,0x09,0x0f,0x09,0x0f,0x09,0x09,0x13,/月0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,/日0x00,0x00,0x00,0x0a,0x15,0x0a,0x04,0x00,/心型0x00,0x04,0x15,0x0e,0x1f,0x0e,0x11,0x00/坦克;4. 按键消抖在按键按下的时候,会存在键盘抖动现象,抖动时间的长短和机械特性有关,一般为510ms,通常我们手动按下键然后释放,这个动作中稳定闭合的时间超过10ms,因此单片机在检测键盘是,必须加上消抖电路,这里采用的方式为检测键盘按下,延时10ms,然后再检测一次,若仍是按下,则可判断键盘按下了一次。程序如下:void check() if(s1=1) delayxms(10);if(s1=1)led1=led1;if(led1=0)led2=0;s1=0;五、 完整程序#include#define uint unsigned int#define uchar unsigned charuchar code table=0x04,0x0e,0x1b,0x15,0x1b,0x0e,0x04,0x00,/背光0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,/年0x0f,0x09,0x0f,0x09,0x0f,0x09,0x09,0x13,/月0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,/日0x00,0x00,0x00,0x0a,0x15,0x0a,0x04,0x00,/心型0x00,0x04,0x15,0x0e,0x1f,0x0e,0x11,0x00/坦克;uchar code backlight=0,120,150,170,190,220;uchar code table1=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07;uchar code year=2013;uchar code month=12;uchar code day=15;uchar code light=light:;uchar code ex=:;sbit lcdrs=p11;sbit lcden=p13;sbit cp=p10;sbit s1=p14;sbit s2=p15;sbit s3=p16;sbit led1=p17;sbit led2=p12;uchar num,level,nowlevel,pr;void delayxms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-) ;void write_com(uchar com)lcdrs=0;p0=com;/delayxms(5);lcden=1;/delayxms(5);lcden=0;void write_data(uchar date)lcdrs=1;p0=date;/delayxms(5);lcden=1;/delayxms(5);lcden=0;void init()/dula=0;/wela=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);/write_com(0x01);/write(0x20);write_com(0x40); /写入自定义字符for(num=0;num40;num+)write_data(tablenum);/delayxms(5);void show()init();write_com(0x80);for(num=0;num4;num+)write_data(yearnum);/delayxms(1);write_data(table11);/delayxms(5);for(num=0;num2;num+)write_data(monthnum);/delayxms(1);write_data(table12);/delayxms(5);for(num=0;num200&p2150&p2100&p250&p2=0&p2=20)|(p3-backlightlevel=20) nowlevel=level; else if(s2=1) delayxms(10); if(s2=1) led2=led2; if(nowlevel1) nowlevel-;s3=0; p3=backlightnowlevel; write_data(nowlevel+48); void check() if(s1=1) delayxms(10);if(s1=1)led1=led1;if(led1=0)led2=0;s1=0; void check2()if(s1=1)delayxms(10);if(s1=1)led1=1;void main()tmod=0x01;th0=(65536-2)/256;tl0=(65536-2)%256;ea=1;et0=1;tr0=1;cp=1;s1=0; /s1=0,自动调节;s1=1,手动调节。led1示意当前的工作状态,0:自动调节;1:手动调节s2=0; /s2=0,亮度保持;s2=1,亮度增加。s3=0; /s3=0,亮度保持;s3=1,亮度减少。led1=0;led2=0;while(1)check();/check2();show();/delayxms(30);void t0_time() interrupt 1th0=(65536-2)/256;tl0=(65536-2)%256;cp=cp;void t1_time() interrupt 3 /在一个中断中,中断的服务程序中的代码还未执行完毕,下一次中断又会来临,这样这次中断就会丢失。ea=0;th1=(65536-45872)/256;tl1=(65536-45872)%256;led1=led1;ea=1;六、 实验遇到的问题及解决方法1. 问题:89c52中有两个定时器/计数器,我让两个定时器同时工作,分别控制不同的中断程序,其中t0定时器产生500khz的时钟脉冲,t1定时器产生1hz的时钟脉冲,在实验中,t1的中断一直不起作用。分析:这问题困扰了我较长的时间,一开始还认为两个定时器不能一起工作,但这种想法显然是错误的,后来发现当t0的中断频率较小时,t1的中断产生了作用,然后又通过跟同学讨论并查找书籍资料,发现了问题的原因。在一个中断中,若中断的程序中的代码还未执行完毕,下一次中断又来临了,这样这次中断就会丢失。如上设置两个定时器工作时,没有考虑中断的优先级,定时器t0的优先级是高于t1的,而t0的中断频率又远远高于t1的中断频率,那么在t1的中断程序执行过程中,每次都会被t0打断,使得每次t1中断都会丢失,所以t1的中断就没起作用。解决方法: 交换一下t0和t1的中断,让t0去执行频率较低的中断,t1去执行频率较高的中断,这样t0不会受到t1的打扰,所以两个中断都可以正常的工作。 掉一个中断,因为1hz的这个中断是我认为确定的数值,它对频率的要求不是特别严格,我可以将它省略掉,然后放在t0中断后面的while循环里,并调用delayxms()来控制大致的频率。2. 问题:当光线渐变时,有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环境地质调查员安全强化模拟考核试卷含答案
- 家用电子产品维修工安全知识强化考核试卷含答案
- 输蔗破碎工岗位合规化技术规程
- 2025-2026学年冀教版(新教材)二年级上册数学第六单元达标试卷(附参考答案)
- 2025年述职报告范例
- 公差累积效应及应对策略探讨
- 解析数学思维
- 节气新闻的创新报道
- 硕士研究全解析
- 河北省石家庄市某中学2024-2025学年九年级上学期期中物理试题(含答案)
- 2025年八年级上学期语文第六单元测试卷含答案
- 湛江市第一学期四年级数学期中卷
- 2025年超星尔雅学习通《工程管理》考试备考题库及答案解析
- GB/T 46731-2025校园用家用电器产品技术规范
- 《铸牢中华民族共同体意识需要重点讲清的若干基本问题》课件
- 保洁员工培训计划与课件
- 湖北省华大新高考联盟2025-2026学年高三上学期11月考试物理试卷
- 2025年网格员笔试真题及答案解析
- 节能低碳知识培训课件
- 广西柳州市2026届高三第一次模拟考试语文试题(含答案)
- 2025年企业文化主管岗位招聘面试参考题库及参考答案
评论
0/150
提交评论