哪位大神x7帮忙写下程序 利用单片机控制8个发光二极管,设计8个灯同时亮的控制程序怎么写?

& 应用笔记
AVR单片机利用按键控制发光二极管的亮灭
内容来源:
发布时间:查看次数:7725
2.1 利用按键控制发光二极管的亮灭
2.1.1 实例功能
在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。那么怎样实现人工参与控制呢?
在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。能不能通过按动一个按键来实现发光二极管的亮灭呢?
当然可以,前面已经讲过,AVR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。
在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解AVR单片机的端口检测外部信号的功能和方法。
本例中有3个功能模块,描述如下:
● 单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。
● 外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。
● 软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。
本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点:
◆ 了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。
◆ 熟悉单片机端口输入输出功能的综合使用。
◆ 掌握AVR单片机按键的硬件去抖动的电路设计和原理。
◆ 掌握AVR单片机端口输入输出程序的编写。
◆ 掌握AVR单片机按键软件去抖动功能的实现。 2.1.2 &器件和原理
本例主要介绍AVR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。然后利用C语言编写通过按键控制发光二极管亮灭状态的程序。
1、按键的去抖动电路
(1)按键的响应过程
我们日常所说的按键,实际上是一个机械开关,本实例所用的按键外观如图2.1.1所示。理想的按键的闭合和断开时,接触点的电压应该立即变高或者变低,但
是由于机械触点的弹性以及按键按动时电压突变等原因,在触点闭合或断开的瞬间会出现电压抖动现象,如图2.1.2所示。在发生抖动的时间一般在
一次按键处理过程如下:当按键按下之后,相应的按键接触点的电压以高低电平的方式输入到单片机的I/O口。按键的闭合与断开是有一定时间的,一般为
0.1-1S。而AVR单片机的机器周期一般为1us甚至更短,在0.1-1S的时间段内,程序会检测很多次按键的输入电平,这样单片机可能会认为按键被
按下了多次,从而出现误判。
图2.1.1 按键开关&&&&&&&&&&&& 图2.1.2& 按键闭合断开时的电压波动示意图
(2)按键去抖动的方法和原理
为了去除按键的抖动,保证单片机对按键的一次输入只响应一次,可以采用硬件和软件两种方法:硬件电路去抖动是在外围电路中加入去抖动电路(如R-S触发
器);软件去抖动是在程序中加入延时程序以跳过抖动时间,等待信号稳定后再次判断按键的输入电平,如果信号电平保持不变,则可以确认一次按键按下。
●硬件去抖动电路的原理
用R-S触发器形成去抖电路是单片机外围电路设计中常用的方法,这种方法可以减少单片机软件对按键动作的延时和计算。
先来了解一下R-S触发器的基本工作原理和工作特点。R-S触发器的基本构成如图2.1.3所示,这个电路有两个与非门交叉耦合而成,/S、/R是信号输入端,低电平有效。Q和/Q既表示触发器状态,又是触发器的输出端。
图2.1.3& R-S触发器的基本原理
在启动过程中,/S端一旦下降到开门电平,Q端电平就会上升,反馈到门B的输入端,此时门B在/R的低电平作用下处于导通状态,/Q输出高电平反馈到A的
输入端,如果这时/S端电压有一个高的跳动,则A门截止,Q段输出低电平,这个低电平反馈到A的输入端,使A门导通,Q端电平为高,这样就保证了Q端电平
的稳定,从而消除按键的抖动。
典型的硬件去抖动电路如图2.1.4,74LS02按键输出端口通过/Q端接入单片机的I/O口,74LS02构成一个R-S触发器电路实现按键的消抖。
●软件消抖的原理和实现
软件消抖的基本原理是在软件中对按键进行两次检测确认,记载第一次检测到按键按下后,间隔10ms左右再次检测按键是否按下,只有在两次都检测到按键按下时才最终确认有键按下,这样就避开了按键的抖动时间,从而消除了抖动的影响。
图2.1.4 74LS02实现的硬件消抖电路
在按键接口软件的设计中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放后,才能确定为一次完整的按键动作。
通用的案件检测程序如下:
if(!key)&&&&&& //判断按键是否按下,key=0表示按键按下
delayms(20);& //延时20ms。避开按键抖动时间
if(!key)&&&& //再次判断按键是否按下,
…&&&& //按键按下的处理程序
While(!key);&&& //判断按键是否放开,key=1表示按键释放,退出按键处理函数
2.1.3 电路
本例中的电路如图2.1.5和2.1.6所示。
1、电路原理
图2.1.5是按键检测电路,两个按键分别连接到单片机的PD6、PD7管脚,AVR单片机在程序里把PD6、PD7设置为带上拉的端口,这样按键没有按
下时,PD6、PD7处于高电平状态,当按键按下时PD6、PD7被连接到地,电平状态变为低电平,程序中检测到PD6、PD7的电平为低电平时,就可以
认为按键被按下了。
图2.1.6为LED显示电路,当按键K3被按下时,D1、D3、D5、D7点亮,D2、D4、D6、D8熄灭。当按键K4被按下时,D1、D3、D5、D7熄灭,D2、D4、D6、D8点亮。
2、元器件选择
在这里列出和本例相关的、关键部分的器件名称及其在电路中的作用。
● ATmega16:单片机,检测按键按下情况并控制发光二极管的亮灭。
● D1-D8:发光二极管,指示按键状态。
● RP1:阻值为330Ω的排阻,限流电阻。
● K3、K4:按键,当按键按下时,与按键连接的单片机端口的电平发生变化。
3、管脚连接
在这里列出和本例相关的、关键部分的单片机端口与外围电路的连接。
● PB0-PB7:连接8个发光二极管LED1-LED8,控制发光二极管的亮灭。
● PD6、PD7:连接按键K3、K4,检测两个按键的状态。
2.1.4 程序设计
1、程序功能
● 按键软件消抖
本例中采用软件消抖的方法,在程序中加入软件延时,去除按键的抖动。
● 按键检测
通过将单片机的PD6、PD7口设置为输入状态,同时使能这两个口的内部上拉电阻(因为这两个口在按键没有按下时处于悬空状态,易受外界干扰,所以必须将其内部上来电阻使能,使其平时处于高电平状态),检测按键是否按下。
LED的亮灭控制
&&&& 通过将单片机的PB0-PB7口设置为输出状态,根据K3、K4两个按键的按下情况,控制不同的发光二极管点亮或熄灭。
● AVR单片机端口输入状态的读取
AVR单片机端口配备有3个寄存器,分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。
2、主要变量和函数说明
3、使用WINAVR开发环境,makefile文件同前面的例子,直接复制到本实例程序的文件夹中即可。
4、程序代码
#include &avr/io.h&&&&&
#include &util/delay.h&int main(void)&&&&&&&&&
{&&&&&&&&&&&
= 0X00;&&&&& //输出低,LED全部熄灭
= 0X&&&&& //PB端口置为输出
PORTD = 0Xc0;&&&& //一定要使能上拉电阻,否则会有干扰
= 0X3F;&&&&& //K3、K4按键(PD6、PD7)设置为输入端口
& (1 &&& PD6)))&&&& //判断按键是否按下
_delay_ms(20);&&& //判断按键按下,延时一会再判断是否按下,
以消除干扰
& (1 &&& PD6)))&&& // 按键真正按下后,进行相应处理
= 0X55;&&&& &&&&&&&& //&&&&&&&&& 按键按下,灯亮&&&
while(!(PIND
& (1 &&& PD6)));//等待按键释放
= 0X55;& //& 把这句话从上面移到这里,按键释放后,灯才点亮
& (1 &&& PD7)))&&&& //判断按键是否按下
_delay_ms(20);&&&& //判断按键按下,延时一会再判断是否按下,
以消除干扰
& (1 &&& PD7)))&&& // 按键真正按下后,进行相应处理
= 0X&&&&&&&&&&& &&&&& //
while(!(PIND
& (1 &&& PD7)));& //
= 0X&&&&&&&&&&&&&&&&&&&&&&& //
*为必须填写项
评论内容:*用8051单片机控制八个发光二极管,每隔一个灯亮的左循环程序_百度知道
用8051单片机控制八个发光二极管,每隔一个灯亮的左循环程序
我有更好的答案
按默认排序
; P1口接8个LED.上拉电阻1K ORG 0000H AJMP STARTUP O憨甫封晃莩浩凤彤脯廓RG 0030HSTARTUP: MOV SP,#60H MOV A,#0AAHLOOP: MOV P1,A ACALL DELAY RLC A SJMP LOOP; 延时的多少决定灯移动速度的快慢DELAY: MOV R7,#5DL2: MOV R6,#100DL1: MOV R5,#100 DJNZ R5,$ DJNZ R6,DL1 DJNZ R7,DL2 RET END
#include &reg52.H&#include&INTRINS.H&#define uchar unsigned char#define uint unsigned intsbit key=P3^4;uchar i,a,void delay_ms(uint s) ;void main(){ key=1; P1=0 a=0 while(1)
/**按键消抖********/
//keycount =100;
for(i=0;i&100;i++)
keycount ++;
delay_ms(1);
//while(!key);}
/**********当按键按下时********************/
if(keycount&=98)
keycount =0;
delay_ms(500) ;
//for(i=0;i&2;i++)
a=_crol_(a,1);//左移
if(a==0xff)a=0
delay_ms(500) ;
} } void delay_ms(uint s){ for(s;s&0;s--)
while(x--);
其他类似问题
发光二极管的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
用单片机实现流水灯的控制设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口带你认识更牛的人下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
阅读(1852)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'AT89-S51单片机控制8个二极管循环亮的程序(循环彩灯)',
blogAbstract:'AT89-S51单片机控制8个二极管循环亮的程序(循环彩灯)\r\n以下程序均能直接使用的,有些程序在编辑和语法都没错误却不能直接使用大是都少了MOV P1,A(将显示码由P1口输出)。如没缺这一条的在检查其他方面的缺陷比如有的还缺MOV& A,#0FEH。\r\n程序:OUTPORT& EQU 0CFBOH\r\n&&&& CSEG& AT& 0000H\r\n&&&& LJMP& START\r\n&&&& CSEG& AT& 401BH\r\n&&&& LJMP& INT\r\n',
blogTag:'',
blogUrl:'blog/static/733298',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:8,
permalink:'blog/static/733298',
commentCount:5,
mainCommentCount:5,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'qq\r\n
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 酷派大神f1 的文章

 

随机推荐