可编程彩灯控制器毕业论文(编辑修改稿)内容摘要:

即为输出显示设备,由P2口和P0口共同控制。 图33 系统原理图 显示电路此显示部分时由一个个LED发光二极管构成的,它具有单向导电性,一般通过5mA左右的电流即可发光,一般控制在3mA~20mA之间。 电流越大,其亮度越强,但若电流过大,会引起二极管或单片机I/O口引脚的烧毁。 因此在设计硬件电路时,要在LED二极管电路中串接一个限流电阻,阻值在300~1之间,调节阻值的大小可以控制发光二极管的发光亮度。 在使用数字集成电路时,拉电流输出和灌电流输出是一个很重要的概念,两者都是针对端口而言的,是衡量电路输出驱动能力的参数。 由于数字电路的输出只有高、低(0、1)两种电平值,对一个端口而言,如果电流的方向是向其外部流动的则是“拉电流”,一般是对负载提供电流,其提供电流的数值叫“拉电流”。 如果电流方向是向其内部流动的则是“灌电流”,一般是要吸收负载的电流,其吸收电流的数值叫“灌电流”。 AT89C51单片机I/O口内部结构决定了灌电流能力比较大,拉电流能力比较小。 所以在实际设计中应当尽量采用灌电流。 图34为可编程彩灯控制器显示部分。 由于AT89C51单片机P0口内部没有上拉电阻,呈现高阻状态,所以不能正常地输出高、低电平,因此该组I/O口在使用时务必要外接上拉电阻。 本设计采用10k的排阻。 显示元件采用88单色LED点阵显示器。 LED点阵显示器单块使用时,既可替代数码管显示数字,也可显示各种中西文字及符号。 在实际应用中一般采用动态显示方式,动态显示采用扫描的方式工作,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字。 图34 显示部分为了保证各个数码管的显示效果不产生闪烁,则首先应保证在1s内循环扫描各行的次数大于25次。 这里利用了人眼的视觉滞留效应。 本例中选择40次,即至少每隔1000ms/40=25ms将8行循环扫描一次。 第二,要注意的是,在25ms时间内,要逐一轮流点亮8行,而且每行点亮的持续时间要相同,这样亮度才能均匀。 第三,在25ms内点亮每行的时间,如果这个时间长,则数码管的亮度高,反之则暗。 第四章 软件设计 软件开发流程图41为系统主程序流程图,系统上电后初始化,进入按键扫描程序,当有相应按键按下时,执行相应显示方式。 本系统共有8个按键,对应8种不同的显示方式。 开始否否否否否否否否按键8按键7按键6按键5按键4按键3按键2按键1是是是是是是是是方式8方式7方式6方式5方式4方式3方式2方式1结束图41 主程序流程图 代码分析本系统程序代码如下。 (1) 函数声明及变量定义 nclude void delay_ms(unsigned int)。 //函数声明void disp0(void)。 void disp1(void)。 void disp2(void)。 void disp3(void)。 void disp4(void)。 void disp5(void)。 void disp6(void)。 void disp7(void)。 unsigned char code biao0[]={ //流动箭头方式0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x3C,0x7E,0xDB,0x99,0x18,0x18,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}。 unsigned char code biao1[4][8]={ //渐大四边形0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00, 0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00, 0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF}。 unsigned char code biao2[7][8]={ //圆边四边形0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x18,0x24,0x24,0x18,0x00,0x00, 0x00,0x18,0x24,0x42,0x42,0x24,0x18,0x00, 0x18,0x24,0x42,0x81,0x81,0x42,0x24,0x18, 0x24,0x42,0x81,0x00,0x00,0x81,0x42,0x24, 0x42,0x81,0x00,0x00,0x00,0x00,0x81,0x42, 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x81}。 unsigned char code biao3[][8]={ //实体四边形0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00, 0x00,0x18,0x3C,0x7E,0x7E,0x3C,0x18,0x00, 0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x3C,0x18}。 unsigned char code biao4[10][8]={ //流动雪花形0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x42,0xA5,0x42,0x18,0x18,0x42,0xA5,0x42, 0x04,0x0A,0x44,0xBA,0x5D,0x12,0x38,0x10, 0x04,0x4A,0xA4,0x58,0x1A,0x25,0x52,0x20, 0x04,0x4E,0xE4,0x58,0x1A,0x27,0x72,0x20, 0x42,0xA5,0x42,0x18,0x18,0x42,0xA5,0x42, 0x42,0xE7,0x42,0x18,0x18,0x42,0xE7,0x42, 0x20,0x72,0x27,0x1A,0x58,0xE4,0x4E,0x04, 0x10,0x38,0x12,0x5F,0xFA,0x48,0x1C,0x08, 0x08,0x1C,0x48,0xFA,0x5F,0x12,0x38,0x10}。 (2) 主程序本系统主程序主要用来检测按键。 当检测到键盘有键按下,经去抖确定为此键按下时,执行相应的功能程序。 /*************************主程序***********************/void main(void){ while (1) { switch (P1) //检测按键 { case 0xfe:delay_ms(10)。 //去抖动 if (P1==0xfe) //此键按下 { for (。 ) { if (P1==0xfe) //确认此键按下 continue。 else break。 } for (。 ) //按键释放检测 { while (P1==0xfe)。 //如为干扰继续循环 if (P1==0xfe) continue。 else break。 //正常释放跳出循环 } disp0()。 //执行此按键功能 } break。 case 0xfd:delay_ms(10)。 //去抖动 if (P1==0xfd) //此键按下 { for (。 ) { if (P1==0xfd) //确认此键按下 continue。 else break。 } for (。 ) //按键释放检测 { while (P1==0xfd)。 //如为干扰继续循环 if (P1==0xfd) continue。 else break。 //正常释放跳出循环 } disp1()。 //执行此按键功能 } break。 case 0xfb:delay_ms(10)。 //去抖动 if (P1==0xfb) //此键按下 { for (。 ) { if (P1==0xfb) //确认此键按下 continue。 else break。 } for (。 ) //按键释放检测 { while (P1==0xfb)。 //如为干扰继续循环 if (P1==0xfb) continue。 else break。 //正常释放跳出循环 } disp2()。 //执行此按键功能 } break。 case 0xf7:delay_ms(10)。 //去抖动 if (P1==0xf7) //此键按下 { for (。 ) { if (P1==0xf7) //确认此键按下 continue。 else break。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。