找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7307|回复: 44
打印 上一主题 下一主题
收起左侧

单片机点亮小灯的问题,几行代码,实在想不通怎么执行的

  [复制链接]
跳转到指定楼层
楼主
那个大佬帮忙看一下,目前刚接触单片机,图片里面的程序哪里有问题啊,就几行代码,我实在想不通啊。目的就是想通过定时计数器,用软件查询的方式,间隔50ms,实现一个小灯的亮灭

E2{MGRX0~RI7~FHR1ZK`AZA.png (37.64 KB, 下载次数: 56)

程序代码

程序代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:511328 发表于 2019-6-4 23:10 | 只看该作者
程序下载运行后小灯一直亮着
回复

使用道具 举报

板凳
ID:123289 发表于 2019-6-5 08:08 | 只看该作者
关键是你未弄清楚:定时计数器是如何工作的。
自己再仔细阅读定时器章节,特别是TF0是干什么用的?
回复

使用道具 举报

地板
ID:56665 发表于 2019-6-5 08:34 | 只看该作者
一看你应该是从汇编过来的。
回复

使用道具 举报

5#
ID:94031 发表于 2019-6-5 08:51 | 只看该作者
间隔50ms小灯亮灭人眼是无法辨别的。
回复

使用道具 举报

6#
ID:213173 发表于 2019-6-5 08:52 | 只看该作者
TMOD |= 0x01;
回复

使用道具 举报

7#
ID:332444 发表于 2019-6-5 08:54 | 只看该作者
首先直接看到的GOTO语句形成的循环此举实属头上安头!因为已经写在了无限循环中,假如写在无限循环外,那用GOTO构成循环是需要的.
回复

使用道具 举报

8#
ID:332444 发表于 2019-6-5 09:16 | 只看该作者
计算机系统都是顺序执行的,自上而下逐句执行指令.
TF0=1为溢出即计满标记,置0重新开始计数,那么整个程序顺序读起来设计意图就很明确了.
回复

使用道具 举报

9#
ID:332444 发表于 2019-6-5 09:30 | 只看该作者
另外一个6楼说的对是01不是10
回复

使用道具 举报

10#
ID:332444 发表于 2019-6-5 09:33 | 只看该作者
问题3用取反运算符 led=!led;
回复

使用道具 举报

11#
ID:158375 发表于 2019-6-5 09:37 | 只看该作者
你如果以前是用汇编编程,现在改为C编程,首先需要自己改变思维模式,比较难啊。
回复

使用道具 举报

12#
ID:511328 发表于 2019-6-5 09:44 | 只看该作者
yzwzfyz 发表于 2019-6-5 08:08
关键是你未弄清楚:定时计数器是如何工作的。
自己再仔细阅读定时器章节,特别是TF0是干什么用的?

好的,我再仔细学学,谢谢大佬指点
回复

使用道具 举报

13#
ID:511328 发表于 2019-6-5 09:45 | 只看该作者
m182892 发表于 2019-6-5 08:34
一看你应该是从汇编过来的。

是的,感觉学学汇编,学一些基础东西,更方便理解吧【笑哭】
回复

使用道具 举报

14#
ID:511328 发表于 2019-6-5 09:46 | 只看该作者
xuyaqi 发表于 2019-6-5 08:51
间隔50ms小灯亮灭人眼是无法辨别的。

好的,谢谢大佬,我再看看,改改
回复

使用道具 举报

15#
ID:461604 发表于 2019-6-5 10:06 | 只看该作者
1.没看到你的定时器中断函数
2.小灯闪烁50ms人眼分辨不出来(看起来就是一直亮),先实现200ms闪烁
3.搞清楚定时器的原理,就是你设置一个值,单片机会从0加到你设的那个值,然后清零,重新开始计数(简单,数据手册有)
回复

使用道具 举报

16#
ID:293363 发表于 2019-6-5 11:18 | 只看该作者
大哥,中断的处理函数都没有
回复

使用道具 举报

17#
ID:511328 发表于 2019-6-5 13:26 | 只看该作者
谢谢各位大佬的回答,感谢,感谢
回复

使用道具 举报

18#
ID:388197 发表于 2019-6-5 14:25 | 只看该作者
漏了将ET0和EA置1吧,有很多软件都可以直接生成配置中断的函数.填入参数即可自动生成,根本没必要自己去记.
回复

使用道具 举报

19#
ID:93224 发表于 2019-6-5 17:54 | 只看该作者
建议臃肿,你这样写程序不是很规范
回复

使用道具 举报

20#
ID:332444 发表于 2019-6-5 21:15 | 只看该作者
看一下运行输出波形就知道


回复

使用道具 举报

21#
ID:332444 发表于 2019-6-5 21:18 | 只看该作者
  1. #include "reg52.h"
  2. sbit LED=P1^0;
  3. void ZhongDuanSheZhi()
  4. {
  5.         TH0+=0X4c;/*定时器赋初值,11.0592Mz定时50ms触发中断,自动补偿方式*/
  6.         TL0+=0X00;
  7.         TMOD=0X01;
  8.         TR0=1;
  9. }
  10. void main()
  11. {
  12.         ZhongDuanSheZhi();
  13.         while(1)
  14.         {
  15.                 if(TF0){TF0=0;LED=!LED;ZhongDuanSheZhi();}
  16.         }
  17. }
复制代码

运行看上图
回复

使用道具 举报

22#
ID:105364 发表于 2019-6-5 23:05 | 只看该作者
1.TMOD=0x01 //16位定时器
2.闪烁时间太短,改成TMOD=0x01后,10次LED求反一次
3.楼主用的是查询方法,而不是中断方法,所以所说的看不到中断函数很正常。

。。。
while(1)
        {
                loop:if(TF0==1)
                {
                        //led=~led;
                        TH0=0x3c;
                        TL0=0xb0;
                        TF0=0;
                        i++;
                        if(i==10)
                        {
                                i=0;
                                led=!led;
                        }

                }
               
                        else
。。。
回复

使用道具 举报

23#
ID:556144 发表于 2019-6-6 00:55 | 只看该作者
首先看主函数,调用定时器函数,赋初值50ms,随后判断是否定时结束,若是,则点亮灯(因为输出高电平,灯就可以亮,1表示高电平,0表示低电平,进行取反操作即可实现灯的亮灭)
回复

使用道具 举报

24#
ID:511890 发表于 2019-6-6 01:42 | 只看该作者
TMOD |= 0x10;0x10 是:选择定时器1(不是定时器0)的16位定时器模式,TH0和TL0都是定时器0的寄存器。TR0=1是启动定时器0(T0)。如果要用定时器1,那么TH0,TL0改为TH1,TL1,TR0改为TR0,TF0改为TF1。
如果要用定时器0,那么就要把TMOD|=0x01;。
一个建议,如果再整个程序中没用到另一个定时器,那么建议直接TMOD=0x01;这样避免某些原因把定时器/计数器的工作方式改成其它的工作方式。比如变成计数器模式。
回复

使用道具 举报

25#
ID:525821 发表于 2019-6-6 04:34 | 只看该作者
各显神通。
回复

使用道具 举报

26#
ID:65956 发表于 2019-6-6 08:47 | 只看该作者
50ms间隔时间人眼观察不出灯的变化,用示波器才能观测到,建议先把延长200ms以上先看其是否有变化就知道了
回复

使用道具 举报

27#
ID:542241 发表于 2019-6-6 08:55 | 只看该作者
定时器原理你要看下,模式1,需要中断服务程序的,你中断服务程序都没有,在主程序中赋初值了
回复

使用道具 举报

28#
ID:231054 发表于 2019-6-6 09:26 | 只看该作者
定时计数器我搞了半天也没搞明白
回复

使用道具 举报

29#
ID:332444 发表于 2019-6-6 10:21 | 只看该作者

看LED灯闪烁一次就是100毫秒即50亮+50灭

回复

使用道具 举报

30#
ID:511328 发表于 2019-6-6 14:35 | 只看该作者
47okey 发表于 2019-6-5 23:05
1.TMOD=0x01 //16位定时器
2.闪烁时间太短,改成TMOD=0x01后,10次LED求反一次
3.楼主用的是查询方法, ...

谢谢你的代码,参照修改了一下,效果实现了,可能我才学,表述的大家有的可能没太明白【笑哭】
回复

使用道具 举报

31#
ID:511328 发表于 2019-6-6 14:38 | 只看该作者

谢谢你的回答,现在我还是一个菜鸟,你那个仿真界面,看的我有点懵逼【笑哭】,向层主学习
回复

使用道具 举报

32#
ID:511328 发表于 2019-6-6 14:40 | 只看该作者
aking991 发表于 2019-6-6 08:47
50ms间隔时间人眼观察不出灯的变化,用示波器才能观测到,建议先把延长200ms以上先看其是否有变化就知道了

是的,大家热情的回答,我才知道,是间隔时间太短了,肉眼根本看不出来变化
回复

使用道具 举报

33#
ID:511328 发表于 2019-6-6 14:42 | 只看该作者
xianfajushi 发表于 2019-6-6 10:21
看LED灯闪烁一次就是100毫秒即50亮+50灭

仿真能看得见变化吗??我实际运行的时候,50ms间隔太短了,肉眼看不出来变化,小灯就一直亮着的
回复

使用道具 举报

34#
ID:556544 发表于 2019-6-6 14:48 | 只看该作者
TMOD=0x01 //16位定时器
回复

使用道具 举报

35#
ID:332444 发表于 2019-6-6 15:57 | 只看该作者
仿真能看到闪烁,上的图是比较慢了点,电脑越用越慢,在另一台电脑上闪烁就快点,也是能看到的,所谓人眼暂留特性值在60赫兹以上人眼就无法分辨,60赫兹以下就会感觉闪烁,可以计算50/1000=0.05,1/0.05=20赫兹,是人眼可以看到的。
回复

使用道具 举报

36#
ID:332444 发表于 2019-6-6 16:02 | 只看该作者
看到2次亮的间隔应该100毫秒转为频率100/1000=。1;1/。1=10赫兹,因此是可以看到的,你在实际板上看到一直亮是因为之前错误造成的,按我的代码你再试看是否看到闪烁了?
回复

使用道具 举报

37#
ID:513287 发表于 2019-6-6 16:39 | 只看该作者
定时器TFO多看看,这个地方弄错了
回复

使用道具 举报

38#
ID:556711 发表于 2019-6-6 17:51 | 只看该作者
D定时器哪里的问题,在看下定时器的用法吧
回复

使用道具 举报

39#
ID:556728 发表于 2019-6-6 18:12 | 只看该作者
相互借鉴,条条大路通罗马
回复

使用道具 举报

40#
ID:105364 发表于 2019-6-6 18:35 | 只看该作者
大坏蛋997 发表于 2019-6-6 16:39
定时器TFO多看看,这个地方弄错了

楼主TF0用得没错。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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