怎样用51单片机定时器流水灯点亮一个led灯

怎样让51单片机led灯闪动 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
怎样让51单片机led灯闪动
13:37:59  
本人菜鸟一枚,现在想让51单片机上的八个led小灯(P1口,共阳极,低电平有效)各自按各自的延时闪动,互不影响,就是通电时八个灯同时按不同规律闪动,求大神发一个程序,要汇编语言的~!谢谢
高级工程师
14:55:31  
多简单的问题,不会汇编的话你可以用c先写出来,然后反汇编
14:58:40  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
这个好像有人求助过一次了!
助理工程师
15:19:43  
学习使用C语言驱动8个LED。用语言实现功能。
高级工程师
19:29:34  
【各自按各自的延时闪动,互不影响】有难度,汇编或C编程没问题。
19:59:33  
用位操作就行了。一位一位的io口分开来控制就好了。
20:03:46  
感觉挺好奇的& &期待高手分享一下& && && &
20:20:55  
你可以有用定时器,然后定时器中断后判断时间间隔,然后判断是哪个等该亮
助理工程师
21:39:40  
很简单呀,编个C语言的,输出高电平,延时后低电平。
助理工程师
21:40:04  
要控制引脚才可以,
21:41:18  
本帖最后由 wyq 于
21:44 编辑
很多年没写汇编了while(1)
P1=0x状态1;
P1=0x状态2;
P1=0x状态3;
P1=0x状态4;
P1=0x状态5
状态n为你希望的LED灯亮灭状态
delay();为状态维持时间
23:20:29  
c语言实现挺简单的
11:35:13  
你可以有用定时器,然后定时器中断后判断时间间隔,然后判断是哪个等该亮
说的对,这个用定时器最高效
20:19:54  
挺简单的吧……稍微学过c和单片机就可以了
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度??_百度知道
51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度??
我有更好的答案
PWM_keyChange--
u8 PWM_keyChange=10;
//grading)
PWM_keyChange=
/初值,按键调整在1~20之间变化
/&清定时器复用置位标志
if(timeMultiple2Flag)
led=on(7);占空比减小
keyFlag=1;
//打开某个灯使用定时器T0产生PWM方波;
//打开7号灯
timeMultiple2Flag=0;测试
u8 keyFlag=1;/P1总线连8个led灯,灯连573锁存器,用按键调整占空比,20级可调控制led灯的亮度等级;
//mytype.h&quot,grading);
//timer0.h&/程序中没有消抖处理,只是简易的按键进出自锁标志
//关闭7号灯
timeMultiple1Flag=0;
/&#47,grading);
else if(0==keyS4)
if(keyFlag)
keyFlag=0.#include
&/本函数由T0定时器中断函数调用
if(timeMultiple1Flag)
led=off(7);1毫秒的基本定时,亮的时间1*10毫秒;/防止一次按键中多次执行
keyFlag=0;
/&#47,PWM_keyC最小占空比 1//清定时器复用置位标志
void main()
//&/亮度20级变化
sbit keyS3=P3^5;关闭某个灯;/清标志,类似同步锁
if(++PWM_keyChange&/按键调整占空比,PWM_keyChange++
sbit keyS4=P3^6;
/my51.h&/占空比最大100%
initT0(1,P1置低电平点亮
#define LED
#define ON(x)
/#include &
/占空比减小
PWM_keyChange=1;
/&#47,暗1*(grading-10)毫秒
if(0==keyS3)
if(keyFlag)
#ifndef _51LED_
#define _51LED_
#define led
&#47,关多个灯用 OFF(m)| OFF(n)
#define on(x)
//包含大小写
#define off(x)
#define ledon
//某个灯,打开
#define ledoff
//某个灯,关闭
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5;
//锁定当前8个led的状态,0锁定 ,1不锁定
/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
((n && 21) & 0x80) | \
((n && 18) & 0x40) | \
((n && 15) & 0x20) | \
((n && 12) & 0x10) | \
& 0x08) | \
& 0x04) | \
& 0x02) | \
((n ) & 0x01)
LongToBin(0x##n##l)
/*************单个数据位的置位宏*********************/
#define high
#define low
sbit beep=P2^3;
extern void delayms(u16 ms);
extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#ifndef _TIMER0_H
#define _TIMER0_H
#include &my51.h&
timeMultiple1F //中断时间复用置位标志,须手动清零
timeMultiple2F //中断时间复用置位标志,须手动清零
extern void T0_work();
//该函数未实现,需外部实现
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化
#include &timer0.h&
TH0Cout=0 ;
TL0Cout=0 ;
T0IntCouts1=0;
//中断计数
T0IntCouts2=0;
//中断计数
timeMultiple1=0;
//中断复用时间的倍数
timeMultiple2=0;
//中断复用时间的倍数
timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零
timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零
//开启定时器,定时完成后需要手动关闭TR0,否则将循环定时
//参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2)
//定时器初始化设定,ms取值不超过65
N=11059.2*ms/12;
//定时器总计数值
//停掉定时器
ET0=CLOSE;
//关定时器中断
//对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒
TH0Cout =(65536-N)/256;
//装入计时值零头计数初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1)
//0倍的基准时间是不合理的,至少1倍
t_multiple1=1;
if(0==t_multiple2)
//0倍的基准时间是不合理的,至少1倍
t_multiple2=1;
timeMultiple1=t_multiple1;
timeMultiple2=t_multiple2;
TMOD &= 0xf0;
//清定时器0配置
TMOD |= 0x01;
//配置定时器0的工作方式为1
//打开总中断
//打开定时器中断
//定时器装入初值
TR0=START;
//启动定时器
void T0_times() interrupt 1
//T0定时器中断函数
//重装初值
if(++T0IntCouts1==timeMultiple1)
//判断是否复用定时器
T0IntCouts1=0;
//中断次数清零,重新计时
timeMultiple1Flag=1;
//复用定时器标志,须在T0_work()中手动清零
if(++T0IntCouts2==timeMultiple2)
//判断是否复用定时器
T0IntCouts1=0;
//这个也要清,防止到达最小公倍数时乱掉
T0IntCouts2=0;
//中断次数清零,重新计时
timeMultiple2Flag=1;
//复用定时器标志,须在T0_work()中手动清零
T0_work();
//调用工作函数
PWM_keyChange/grading
void T0_work()
#define grading
#include &lt,下一次按键时允许调整占空比
#ifndef _MY51_H
#define _MY51_H
#include &reg52.h&gt.h&
#include &(x))
if(0==--PWM_keyChange)
//先打开0号灯,用于和7号灯对比亮度
initT0(1,10.h&
#include &按键锁释放标志;20
initT0(1,PWM_keyChange,grading),开多个灯用 ON(m) & ON(n)
#define OFF(x)
采纳率:48%
为您推荐:
其他类似问题
生肖的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51单片机入门零基础2.4定时器点亮LED灯_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机入门零基础2.4定时器点亮LED灯
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢相关文章推荐
#define GPIO_Pin_6
/* LED2 */
#define GPIO_Pin_7
一、串行通信基本认识
基本的通信方式有并行通信和串行通信两种。
一条信息的各位数据被同时传送的通信方式称为并行通信。并行通信的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据...
三大循环for
四大跳转 :
无条件跳转语句
跳出循环语句
继续跳出循环语句
返回值语句 ret...
学习的进度实在不怎么样,因为接下来可能要学习dan'pian'j
首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。...
用51单片机实现流水灯的方法有多种:普通电灯法,位移法,数组法。其次模拟电路的电流图也与点一盏LED相似。具体如下:
首先是最简单的代码:
中断驱动学习(1)
几个简单的中断API
在编写中断驱动之前先熟悉一下可能会用到的一些接口吧。
1、中断申请
一.简单的点灯程序需要记住的
1.单片机控制开发板的二极管亮灭:
由单片机的P1口控制,注意开发板的原理图,分清楚到底是给低电平亮还是高电平亮,一般都给低电平亮。
控制灯分为总线法和位选法,总线...
#include "reg52.h"
#include "intrins.h"
uint unsigned int
uchar unsigned...
本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)单片机典型实例:如何用PWM程序控制LED灯?
日 10:17 来源:edn博客 作者:songzhige (0)
  我们知道 51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。
  要用51产生PWM去控制LED,首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n&。
  那么就可以编写程序,根据定的时间基准t给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了n& 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形。
  /******************************************************************************************
  * 文件:PWM.c
  * 备注:51单片机PWM完全注释          *
  ******************************************************************************************/
  #include 《STC89.H》
  unsigned char CYCLE;      /*PWM周期长度*/
  unsigned char count = 0;        /*记录中断次数*/
  unsigned char PWM_ON;      /*PWM高电平时间计数*/
  void delay()          /*延时约78ms*/
  unsigned char i,
  for(j = 100; j--)
  for(i = 255; i--)
  void main()
  bit F       /*变化状态标志,0:渐亮,1:渐暗*/
  TMOD = 0x01;           /*时间基准为1ms*/
  TH0 = (65536 - 100) / 256;      /*右端表达式编译后为0xFF*/
  TL0 = (65536 - 100) % 256;      /*同上*/
  IE = 0x82;       /*开定时器0中断0x82 = */
  TR0 = 1;          /*启动定时器0*/
  CYCLE = 10;           /*十级亮度,即十级PWM*/
  while(!Flag)          /*渐亮,每一次变化亮度增加1*/
  delay();          /*延时*/
  PWM_ON++;       /*高电平脉宽延长,即亮度增加*/
  if(PWM_ON == CYCLE)       /*若高电平脉宽增长到整个周期*/
  Flag = 1;       /*则转为渐暗*/
  while(Flag)       /*渐暗,每一次变化亮度减少1*/
  delay();       /*延时*/
  PWM_ON--;       /*高电平脉宽缩短,即亮度降低*/
  if(PWM_ON == 0)      /*若高电平脉宽缩短到0*/
  Flag = 0;      /*则转为渐亮*/
  void time0_server() interrupt 1 using 1
  TH0 = (65536 - 100) / 256;      /*时间基准为1ms*/
  TL0 = (65536 - 100) % 256;      /*即每1ms触发一次中断*/
  if(count == PWM_ON)      /*若中断次数达到亮度设定值*/
  P2 = 0xFF;        /*则熄灯*/
  count++;        /*每次中断记录+1*/
  if(count == CYCLE)      /*若中断次数达到PWM周期长度*/
  count = 0;       /*则清零中断记录*/
  if(PWM_ON != 0)       /*若此时亮度值非零*/
  P2 = 0;        /*则点灯*/
相关技术文章:
相关资料下载:
上周热点文章排行榜
上周资料下载排行榜
技术交流、我要发言! 发表评论可获取积分! 请遵守相关规定。
创新实用技术专题
在28nm FPGA战场上,Xilinx和Altera已经展...

我要回帖

更多关于 单片机点亮led灯 的文章

 

随机推荐