一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4058|回复: 26
收起左侧

[51单片机] 想要一个led闪烁能有多少种写法啊【C51】

[复制链接]
发表于 2013-11-26 18:03 | 显示全部楼层 |阅读模式
唉,几个月没有什么进展,跟住名师、大部队学习,赶不上人家的步伐啊,老师的作业不能完成,他们讨论的内容我看不懂,现在还是回头从头开始学了。
白白浪费几个月了,唉。
一个LED灯闪烁程序,我要研究透,使用定时器、计数器、中断等方式来试验,发现这个led闪烁不简单啊。
现在所有的程序是我手打出来的,拒绝复制粘贴了,原来void总是打成viod,现在这个用的最多,随随便便就可以打出了,熟能生巧啊。
单片机使用STC11F02E,直接驱动led,不加限流电阻。
不加复位,只加正5伏电源,晶振等,电路超级简单啊。
【一个led闪烁,定时器方式,字符型char】
  • #include <stc11.h> //头文件
  • unsigned char i,j,k;
  • sbit ledfu=P1^7;//led负极接p1.7脚
  • sbit ledzheng=P3^4;//led正极接p3.4脚
  • /*延时200ms
  • 使用12M晶振 一个状态周期=2个时钟周期,k=248us乘以2=498
  • */
  • void delay200ms(void)//200ms延时
  • {
  • for(i=20;i>0;i--)
  • for(j=20;j>0;j--)
  • for(k=248;k>0;k--);
  • }
  • void main (void)
  • {
  • P3M0=0xff; //M0=1 M1=0是推挽模式
  • P3M1=0x00;
  • ledzheng=1;
  • {
  • while(1)
  • {
  • ledfu=0;
  • delay200ms();
  • ledfu=1;
  • delay200ms();
  • }
  • }
  • }





 楼主| 发表于 2013-11-26 18:07 | 显示全部楼层
本帖最后由 社建电子 于 2013-11-26 18:11 编辑

【一个led闪烁,定时器方式,整型int】
  1. #include <STC11.H>         //包含单片机寄存器的头文件
  2. sbit leda=P3^5;                 //p3.5接led正极
  3. sbit ledb=P1^5;                 //p1.5接led负极
  4. void delay(void)          //两个void意思分别为无需返回值,没有参数传递
  5. {
  6. unsigned int i;                   //定义无符号整数,最大取值范围65535
  7. for(i=0;i<20000;i++);   //做20000次空循环
  8. }
  9. void main(void)                         //主函数,程序从这里开始工作
  10. {
  11. P3M0=0XFF;P3M1=0x00;         //设p3口为推挽输出
  12. leda=1;                                         //p3.5输出高电平
  13. {
  14. while(1)                                //无限循环
  15. {
  16. ledb=0;                                        //p1.5输出低电平,led亮
  17. delay();                                //延时一段时间
  18. ledb=1;                                        //输出高电平,led灭
  19. delay();                                //延时一段时间
  20. }
  21. }
  22. }
复制代码

发表于 2013-11-26 18:24 | 显示全部楼层
不明觉厉
 楼主| 发表于 2013-11-26 18:29 | 显示全部楼层
【一个led闪烁,定时器方式,字符型+整型char+int】
  1. /*利用
  2. char 0-255
  3. int 0-65535,
  4. 做不同时间长度的延时
  5. 来改变led亮灭的时间*/
  6. #include <stc11.h> //
  7. sbit leda =P3^5;   //
  8. sbit ledb =P1^5;   //
  9. void delayint(void)//延时一段较长的时间
  10. {
  11. unsigned int i;          
  12. for(i=0;i<50000;i++);
  13. }
  14. void delaychar(void) //延时一段较短的时间
  15. {
  16. unsigned char j,k;
  17. for(j=0;j<200;j++)
  18. for(k=0;k<200;k++);
  19. }
  20. void main(void)
  21. {
  22. P3M0=0xff;                   //P M必须大写
  23. P3M1=0x00;
  24. leda=1;                           //P3.5口的高电平
  25. {
  26. while(1)
  27. {

  28. ledb=0;           //P1.5口的灯点亮
  29. delayint();                  //延时一段较长的时间
  30. ledb=1;                          //P1.5口的灯点灭
  31. delaychar();          //延时一段较短的时间
  32. }
  33. }
  34. }
复制代码

发表于 2013-11-26 18:37 | 显示全部楼层
这个大部队群好像没几个人,天天就那几个在喊
随便看个实物PCB的硬件就想到怎么做的,这就是入门了
 楼主| 发表于 2013-11-26 18:38 | 显示全部楼层
中断方式
  1. #include <stc11.h>        //单片机头文件
  2. sbit ledb=P1^5;                //led接在这个引脚上
  3. sbit leda=P3^5;
  4. void main(void)
  5. {
  6. P3M0=0xff;P3M1=0x00;leda=1;
  7. EA=ET0=TR0=1;                 //开总中断、开定时器中断、开定时器
  8. TMOD=0x01;                         //使用定时器T0的模式2
  9. TH0=0x3c;                        //定时器T0的高8位赋初值
  10. TL0=0xb0;                        //定时器T0的低8位赋初值
  11. TR0=1;
  12. while(1);
  13. }
  14. void timer0(void)interrupt 1 using 0//定时器T0中断1;第0组工作寄存器
  15. {
  16. ledb=~ledb;                                                   //按位取反操作,将P1.5引脚输出电平取反
  17. TH0=0x3c;
  18. TL0=0xb0;
  19. }
复制代码
发表于 2013-11-26 18:50 | 显示全部楼层
一看就是蔡老师教的。误人子弟啊!中国教育方式。
发表于 2013-11-26 18:53 | 显示全部楼层
软延迟,硬延迟,有无中断,位操作,字节操作,给立即数,查表赋值,间接赋值,外因条件赋值,与,非,亦或逻辑改变状态,阴阳驱动(灌啦电流)。。。。。。。。
发表于 2013-11-26 18:55 | 显示全部楼层
这个要顶!
发表于 2013-11-26 19:16 | 显示全部楼层
学习精神可嘉

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-5 20:50 , Processed in 0.065671 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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