找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教:这个程序下载后,小灯为什么常亮,不闪烁

[复制链接]
跳转到指定楼层
楼主
ID:65222 发表于 2014-8-19 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>

sbit enled=P1^4;
sbit led = P0^0;

void main()
{
    unsigned char cnt = 0;
    enled = 0;
    TMOD = 0X01;
    TH0 = 0XB8;
    TL0 = 0X00;
    TR0 = 1;

    while(1)
        {
        if(TF0 == 1)
        TF0 = 0;
        TH0 = 0XB8;
        TL0 = 0X00;

          cnt++;
         if(cnt >= 50)
         {

             cnt = 0;
             led = ~led;
         }
         
         }
   
   
   
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-8-19 15:13 | 只看该作者
应该是定时器没有设置好 我等下拿到板子上看看
回复

使用道具 举报

板凳
ID:1 发表于 2014-8-19 20:13 | 只看该作者
有下面这几种原因导致  灯会常亮
1是 定时器没有工作
2是 闪烁的速度太快 导致你看不到闪烁
回复

使用道具 举报

地板
ID:1 发表于 2014-8-19 20:14 | 只看该作者
************************************************/
#include<reg51.h>

sbit P14=P1^4;
sbit P07=P0^7;
sbit P26=P2^6;


volatile int i;       //声明一个变量为可能意外变化的量(相对于const而言)用语中断程序

void main()

{
P26=1;  //防止数码管干扰
P0=0x00;
P26=0;
P0=0xff;

P14=0; //开led使能

P07=0;                    //先将P20位的LED点亮

TMOD=0x01;        //设置定时器T0工作在模式1

TH0=0xb1; TL0=0xe0;      //装T0的计数初值,12MHz,20ms计时

EA=1;                     //开启总中断允许位

ET0=1;                   //开启T0定时器

TR0=1;                   //开启T0定时器中断允许位

while(1);          //循环等待中断发生

}

void time0(void) interrupt 1 //中断程序写法

{ TH0=0xb1; TL0=0xe0;       //重装T0的计数初值

i++; if(i==25)     //计数到25次(即0.5秒)

{

   i=0; //i清零

   P07=~P07;    //取反LED端口,

}

}
回复

使用道具 举报

5#
ID:65222 发表于 2014-8-19 22:25 | 只看该作者
多谢老大指点。谢谢你的代码
回复

使用道具 举报

6#
ID:60266 发表于 2014-8-19 23:21 | 只看该作者
楼主 调试结果怎么样?
回复

使用道具 举报

7#
ID:65222 发表于 2014-8-20 14:23 | 只看该作者
我的程序还是不行,看程序貌似没什么问题,难道是片子问题,定时器有问题?没搞清楚。老大用的是中断写法,我正在学习定时器,所以用这种写法试试
回复

使用道具 举报

8#
ID:65222 发表于 2014-8-20 22:29 | 只看该作者
已经找到原因了。调试成功,在 if(TF0 == 1)下面,少写了一组大括号,找了一天,很U伤。

通过的代码是这样的

#include<reg52.h>

sbit enled=P1^4;
sbit led = P0^0;

void main()
{
    unsigned char cnt = 0;
    enled = 0;
    TMOD = 0X01;
    TH0 = 0XB8;
    TL0 = 0X00;
    TR0 = 1;

    while(1)
        {
        if (TF0 == 1)
        {
        TF0 = 0;
        TH0 = 0XB8;
        TL0 = 0X00;

          cnt++;
         if(cnt >= 50)
         {

             cnt = 0;
             led = ~led;
         }
         
         }
   }
   
   
}
回复

使用道具 举报

9#
ID:2318 发表于 2014-8-21 04:09 来自手机 | 只看该作者
原来如此
回复

使用道具 举报

10#
ID:44262 发表于 2014-8-21 22:30 来自手机 | 只看该作者
看来一些程序连一个括号都不能忽视啊!楼主的经验值得我们学习
回复

使用道具 举报

11#
ID:65222 发表于 2014-8-21 22:53 | 只看该作者
恩,好像是while下面如果不加大括号,程序就反复执行下面的第一句程序,反复执行这一句,不会再向后执行了。
多谢各位关注我的问题。致敬!!
回复

使用道具 举报

12#
ID:65222 发表于 2014-8-23 22:30 | 只看该作者
还有一个疑问,请教!!!

还是这段程序,我写的时候小灯闪烁定时1s,但结果却是一秒钟能闪烁3次吧,实在不知道这是为什么?请大家不吝赐教!!谢。
回复

使用道具 举报

13#
ID:26188 发表于 2014-8-23 23:37 来自手机 | 只看该作者
深海鲸变 发表于 2014-8-23 22:30
还有一个疑问,请教!!!

还是这段程序,我写的时候小灯闪烁定时1s,但结果却是一秒钟能闪烁3次吧,实 ...

  if(cnt >= 50),把50改小一些即可,,比如17
回复

使用道具 举报

14#
ID:26188 发表于 2014-8-23 23:40 来自手机 | 只看该作者
深海鲸变 发表于 2014-8-21 22:53
恩,好像是while下面如果不加大括号,程序就反复执行下面的第一句程序,反复执行这一句,不会再向后执行了 ...

是的,,大括号里面的语句块,是作为一个整体执行的,while下面的循环体如果超过一句一定得用大括号
回复

使用道具 举报

15#
ID:65222 发表于 2014-8-24 08:51 | 只看该作者
本帖最后由 深海鲸变 于 2014-8-24 08:52 编辑
hujia 发表于 2014-8-23 23:37
if(cnt >= 50),把50改小一些即可,,比如17

为什么会是改少?我我设置的定时器是20ms,50个周期,正好是1s。难道是我的算法有问题?17是随便举的例子吗?为什么是17?
回复

使用道具 举报

16#
ID:26188 发表于 2014-8-24 11:37 来自手机 | 只看该作者
说反了应该是改大三倍,,要改为150
回复

使用道具 举报

17#
ID:26188 发表于 2014-8-24 11:38 来自手机 | 只看该作者
先试试看看行吗
回复

使用道具 举报

18#
ID:65222 发表于 2014-8-25 23:28 | 只看该作者
如果改大,当然可以了,但是我的时间是计算出来的啊,晶振是11.0592M的。为什么实际的和计算的不一致啊?
回复

使用道具 举报

19#
ID:63839 发表于 2014-8-28 17:26 | 只看该作者
a110 发表于 2014-8-21 22:30
看来一些程序连一个括号都不能忽视啊!楼主的经验值得我们学习

我又一次写贪吃蛇 for()循环后面直接加了;导致无法进入循环 我找了半个小时才找到
回复

使用道具 举报

20#
ID:65222 发表于 2014-8-29 23:09 | 只看该作者
哪位大侠能帮我解答一下我的问题,想精确延时,否则用for语句就可以实现闪烁,想在想精确控制小灯闪烁时间
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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