找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4432|回复: 31
收起左侧

如何在这个单片机程序中加一个关于LED闪烁的代码?谢谢

  [复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:793358 发表于 2020-6-30 17:17 | 显示全部楼层 |阅读模式
音乐盒.zip (101.1 KB, 下载次数: 26)
回复

使用道具 举报

ID:584814 发表于 2020-7-1 08:17 | 显示全部楼层
赏金太高必须参与 while(1){led=1;delay(25);led=0;delay(25);}
回复

使用道具 举报

ID:793358 发表于 2020-7-1 08:30 来自手机 | 显示全部楼层
man1234567 发表于 2020-7-1 08:17
赏金太高必须参与 while(1){led=1;delay(25);led=0;delay(25);}

从哪里加这个代码??
回复

使用道具 举报

ID:718783 发表于 2020-7-1 08:34 | 显示全部楼层
wanglin1207 发表于 2020-7-1 08:30
从哪里加这个代码??

在主函数死循环里加就行,你看你要通过什么条件来实现LED闪烁
回复

使用道具 举报

ID:560976 发表于 2020-7-1 08:41 | 显示全部楼层
LED=1;led=0;加计数器产品脉冲
回复

使用道具 举报

ID:147710 发表于 2020-7-1 08:51 | 显示全部楼层
闪烁.jpg
回复

使用道具 举报

ID:277948 发表于 2020-7-1 08:53 | 显示全部楼层
  1.                 i++;
  2.                 switch(i)
  3.                 {
  4.                         case 1: P2=_crol_(P2,1);break
  5.                         default :break
  6.                
  7.                 }
复制代码
可以p2口用音符值赋值,做成类似MP3
回复

使用道具 举报

ID:774633 发表于 2020-7-1 08:54 | 显示全部楼层
在主函数里面添加即可,加延时,就会有闪烁效果
回复

使用道具 举报

ID:757976 发表于 2020-7-1 09:04 | 显示全部楼层
建议楼主将代码直接发出来,省的下载。可以直观一点。
闪烁一般是在主函数的while循环里面添加即可。
回复

使用道具 举报

ID:794452 发表于 2020-7-1 09:16 | 显示全部楼层
文件我这里错误,打不开了,给你两个闪烁的文件,可以参考一下
回复

使用道具 举报

ID:794452 发表于 2020-7-1 09:19 | 显示全部楼层
我打不开你的文件,这儿有几段闪烁的,你可以看一下:<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <WORKSPACE>  <FRAME activewindow="0">   <PLACEMENT>2c0000000200000003000000ffffffffffffffffffffffffffffffff000000000300000020060000f3030000</PLACEMENT>   <WINDOW type="default" module="ISIS"/>  </FRAME>  <MODULE name="VSMDEBUG">   <PWI/>  </MODULE> </WORKSPACE>看看这个有没有用
回复

使用道具 举报

ID:147710 发表于 2020-7-1 09:52 | 显示全部楼层
有发声程序,用delay容易引起发声不连贯,建议用非阻塞方式实现LED闪烁:
ss.jpg

回复

使用道具 举报

ID:311846 发表于 2020-7-1 11:22 | 显示全部楼层
如果你想要稳定的闪烁可以在定时器中使用计数,在主循环中判断计数值,达到规定值就翻转一下LED对应的IO口,计数值清零
回复

使用道具 举报

ID:490426 发表于 2020-7-1 11:38 | 显示全部楼层
一般不建议在主函数里面添加延时,会影响主函数运行,其实在定时器里面加个标志位就可以,到了时间引脚翻转一下就可以,这样的灯的闪烁频率比较准确,尤其是在做国标项目时。比如定时器定时中断为10毫秒,500毫秒翻转一次。,你家一个计数标志,到50时清零。同时给主函数一个标志,监测到这个标志就翻转一下io口,就可以了。
回复

使用道具 举报

ID:760185 发表于 2020-7-1 12:11 | 显示全部楼层
仔细看看,不复杂
回复

使用道具 举报

ID:319023 发表于 2020-7-1 12:21 | 显示全部楼层
可以加一个 LED的子函数吧
回复

使用道具 举报

ID:293363 发表于 2020-7-1 14:55 | 显示全部楼层
定时器里面加一个LED=!LED;
回复

使用道具 举报

ID:774631 发表于 2020-7-1 15:55 | 显示全部楼层
不建议在主函数里面添加,可以试试用定时器。
回复

使用道具 举报

ID:793358 发表于 2020-7-1 16:51 | 显示全部楼层
XTXB 发表于 2020-7-1 09:52
有发声程序,用delay容易引起发声不连贯,建议用非阻塞方式实现LED闪烁:

加一下企鹅可以吗
回复

使用道具 举报

ID:147710 发表于 2020-7-1 22:07 | 显示全部楼层
搞定没?1000太大了,你是等不到闪烁的,改为1或2就闪烁了,就是不大稳定,把红框代码放到定时器0中断中效果会好一些。要闪烁稳定,最好单独开个定时器2,把它放到定时器2中断中,就是不知道对发音影响大不大。
回复

使用道具 举报

ID:795764 发表于 2020-7-2 15:53 | 显示全部楼层
可以再加个定时器1,和定时器0相类似的,这样控制的LED闪烁时间会非常准
回复

使用道具 举报

ID:633896 发表于 2020-7-7 11:30 | 显示全部楼层
我感觉直接在while(1)
{
    led=~led;
    延时就好了  延时看你自己定
}
回复

使用道具 举报

ID:608600 发表于 2020-7-7 11:38 | 显示全部楼层
led=~led;
回复

使用道具 举报

ID:586048 发表于 2020-9-27 11:40 | 显示全部楼层
应该先了解一下你这闪烁是要什么条件执行的,还是只是闪烁,只是闪烁加在中断里就行,要是有条件,就弄一个定时标志位,然后在主程序中添加条件判断
回复

使用道具 举报

ID:235954 发表于 2020-9-28 10:35 | 显示全部楼层
led!=led;
回复

使用道具 举报

ID:823282 发表于 2020-9-28 11:24 | 显示全部楼层
unsigned char code FREQL[]={
    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567  

sbit LED=P0^0   //定义P0^0为LED,方便操作,这个只是举例,实际以你led与具体IO口连接为准

void main(void)
{
        TMOD=0x11; //T0 T1 均在工作方式1
        ET0=1;  //T0开中断
        EA=1;   //CPU开中断         
        while(1)
        {            LED=0;
                               delay_ms(500);
                                LED=1;
                               delay_ms(500);//这四句可以实现闪烁,但是由于下面语句可能会有其他语句延时
                                                        //具体延时未知,若要准确闪烁,可使用定时器中断。


                music_play();        //根据当前状态播放相应歌曲的某个音符

                实际修改已用红色标出,还有疑问,可直接询问
回复

使用道具 举报

ID:824311 发表于 2020-9-28 18:32 | 显示全部楼层
理想做法是做一个计时中断,在中断里做io引脚翻转
回复

使用道具 举报

ID:824342 发表于 2020-9-28 19:49 | 显示全部楼层
写一个led_toggle()函数 delay一定时间,通过转换led的高低电平达到闪烁效果
回复

使用道具 举报

ID:822056 发表于 2020-9-29 08:52 | 显示全部楼层
楼主可以试试在循环程序中加个led=~led;
回复

使用道具 举报

ID:367460 发表于 2020-9-29 11:30 | 显示全部楼层
让led闪烁就是让IO口高低电平而已, 如果要闪烁时间有要求就要加固定的延时,让闪烁的像呼吸灯一样就要用PWM, 这些都是基础,望楼主好好学习.
回复

使用道具 举报

ID:808634 发表于 2020-10-8 19:27 | 显示全部楼层
主函数里面加一个led=~led
回复

使用道具 举报

ID:827215 发表于 2020-10-9 18:32 | 显示全部楼层
如果还有中断资源用中断是最好的,既能实现目标,又不会影响主程序。最好看下手册,看下会不会有些程序设置上的重合,确保一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表