最便宜的8脚单片机,单片机必背代码大全

首页 > 经验 > 作者:YD1662022-11-03 07:33:02

10 装入瓶子中。

最便宜的8脚单片机,单片机必背代码大全(17)

控制原理

为什么6个I/O能控制12个LED呢?它们之间会不会相互影响呢?其实,这样的连接方式不仅能控制每个LED,还能控制其亮度呢!之所以能这样连接,是因为AVR单片机的每个I/O都是3态输出。如果用普通51单片机,这样连接是不行的。

那么又是如何控制LED的亮度呢?控制亮度的关键是ATtiny13的两路PWM,它们可以分别设置连接到PB0和PB1引脚上。在ATtiny13使用内部振荡器的情况下,PWM的最高频率可设置为47.5kHz。而且PWM的极性可以通过设置寄存器而改变,这使得12个LED亮度的控制更加简单了。

先谈谈如何控制每个LED单独的亮和灭。ATtiny13的每个I/O都有4种状态,即输出0状态、输出1状态、高阻态(悬空态)、带上拉电阻的高阻态。要使LED亮,必须要让LED中流过正向的电流,如果要让最左边的LED亮,PB1输出1、PB2输出0即可。但是,其他不相关的引脚需要设置成高阻态。否则,如果PB0此时也为1的话,第2个LED也会亮。总之,为了保证其他LED不受到影响,在设置某个灯亮时,必须先把所有I/O设置成不带上拉的高阻态。

能控制亮和灭有什么了不起?呵呵,其实还能控制每个LED单独的渐变,就是渐渐变亮,渐渐变暗。我举个例子吧,如果要最左边的LED渐渐变亮,就先设置PB2引脚为0电平,PB1引脚设置为高电平驱动的PWM波。然后,程序逐渐控制PB1的PWM状态,通过调整PWM高电平的脉宽长度来实现亮度控制。当PWM高电平的时间长时,LED就变亮了。反之,LED就变暗了。

那么电路原理图(见图6.2)中第7个反过来接的LED怎么实现亮度控制呢?原理还是一样,只是PB2将刚才的0电平设置成1电平,原来PB1为高电平脉冲驱动的PWM波设置成低电平脉冲驱动的PWM波即可。同样,要控制第7个LED的亮度,就控制PWM低电平的脉宽长度,当低电平的脉宽长度长时,LED就变亮了。反之,LED就变暗了。

最便宜的8脚单片机,单片机必背代码大全(18)

图6.2 控制电路原理图

那么能实现所有的LED同时发光吗?制作过程中,这个功能的实现倒是困扰了我一会儿。后来,我想到了动态扫描。什么是动态扫描?老式电视机不就是这个原理吗?电视机通过磁场让射线高速地扫描屏幕,从而产生一幅画面。那么,让每个灯分别亮1ms左右,然后像电视机一样不断地扫描,看上去就都亮了。在此基础上,再控制每个灯的亮度数值,就能实现整体亮度控制了。如果LED足够多,单片机引脚也足够多,还可能显示一副灰度画面呢!

3种效果的程序编写

程序的PWM频率设置为最高的37.5kHz。之所以选择这么高的频率是为了不影响动态扫描。试想,如果PWM频率为100Hz,那么还怎么动态扫描呢?在程序中,动态扫描实际的频率为62Hz。这已经足够骗过人的眼睛,让我们看不到灯的闪烁。

在单片机的中断代码中,程序每过26µs就会产生溢出中断一次,通过变量count计数中断次数。当中断的次数达到50次时,就更换下一个LED,显示它对应的亮度。LED的亮度存储到led[ ]这个数组中,每个LED通过载入对应的亮度值,即通过改变PWM产生寄存器的OCR0A与OCR0B,来实际控制高低电平脉宽长度,最终实现亮度的控制。当然,每次通过PWM控制亮度,都要先根据LED的驱动电平方式,重新设置PWM的控制模式。在此之前,还要记得设置不相关的引脚为高阻态。

LED的3种效果控制程序能够实现LED不断地变换,只要调用就能分别实现如下功能:所有LED的呼吸效果、逐个点亮和熄灭LED、LED流水显示的效果。从编程的思路上讲,led[ ]数组存放了12个元素,每个元素所存内容,即对应每个LED灯亮度值。要改变某个LED灯亮度,都是通过设置led[ ]数组中对应元素的 PWM 缓冲数值来实现自动变换。要让所有的灯全亮只需设置数组中的每个元素的数值都为255即可。如果要一半的亮度就设置为128。要让某个灯单独最亮,只要设置这个LED元素数值为255,其他的元素为0。如果任意LED要产生渐渐变亮的效果,那么只要对应数组元素中的数值从0逐渐变为255即可。同理,渐渐变暗,数值就从255变成0。要实现什么样的效果,大家可以通过改变led[ ]数组来实现。

上一页12345末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.