找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机注解处的书写合理不?

[复制链接]
跳转到指定楼层
楼主
ID:483865 发表于 2021-1-17 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
#include<reg52.h>

sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;

bit flag500ms = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;

void ConfigTimer0(unsigned int ms);

void main()
{
        unsigned char i = 0;
        unsigned char LedBuf[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
        EA = 1;
        ConfigTimer0(10);
        ENLED = 0;
        ADDR3 = 1;
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;
        while(1)
        {
                if(flag500ms == 1)
                {
                        flag500ms = 0;
                        P0 = LedBuf[i++];        //这里合理不?
                }
        }
}

void ConfigTimer0(unsigned int ms)
{
        unsigned long tmp;
        tmp = 11059200/12;
        tmp = (tmp * ms)/1000;
        tmp = 65536 - tmp;
        tmp = tmp + 12;
        T0RH = (unsigned char)(tmp >> 4);
        T0RL = (unsigned char)tmp;
        TMOD &= 0xF0;
        TMOD |= 0x01;
        TH0 = T0RL;
        TL0 = T0RL;
        ET0 = 1;
        TR0 = 1;
}

void interruptTimer0() interrupt 1
{
        static unsigned char tmr500ms = 0;
        TH0 = T0RH;
        TL0 = T0RL;
        tmr500ms++;
        if(tmr500ms >= 50)
        {
                tmr500ms = 0;
                flag500ms = 1;
        }

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

使用道具 举报

沙发
ID:68468 发表于 2021-1-17 20:23 | 只看该作者
注解处问题不大吧,但LedBuf[]数组只有8个,i累加超过7以后就.......

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:483865 发表于 2021-1-17 20:35 | 只看该作者
wysh_2004 发表于 2021-1-17 20:23
注解处问题不大吧,但LedBuf[]数组只有8个,i累加超过7以后就.......

代码是我参考师傅的代码编的,在开发板上跑正常。让我自己怀疑这个i值,要不要加归零的语句。
回复

使用道具 举报

地板
ID:415064 发表于 2021-1-17 21:30 | 只看该作者
这个EA是什么我没看懂啊,可以看下内存EA 或者ENLED 的地址,大概率LedBuf后面的地址是ENLED或者是没有用赋过初值的。也就是i到7之后就去了LedBuf[8],而LedBuf[8]在内存的值恰好是0.所以说此时i=0;也就解释了为什么程序可以正常运行
如果你在 unsigned char LedBuf[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}后,EA = 1前加一句 unsigned char j = 7;这样就会一直为LedBuf[7],但是程序没有卡死的
回复

使用道具 举报

5#
ID:483865 发表于 2021-1-18 08:03 | 只看该作者
谢谢你的回复,这样改代码能跑是巧合。我改用数码管显示,发现这样的错误了。
回复

使用道具 举报

6#
ID:592807 发表于 2021-1-18 08:55 | 只看该作者
你的  i 是哪来的?声明了没有?哪种类型?超出数组范围怎么处理?
回复

使用道具 举报

7#
ID:367934 发表于 2021-1-18 09:09 | 只看该作者
要是循环必须归零,否则会超出数组范围。可以在判断哪里加一个条件,
回复

使用道具 举报

8#
ID:483865 发表于 2021-1-18 14:46 | 只看该作者
适得府君书 发表于 2021-1-18 09:09
要是循环必须归零,否则会超出数组范围。可以在判断哪里加一个条件,

嗯,明白了。谢谢。
回复

使用道具 举报

9#
ID:872416 发表于 2021-1-18 14:55 来自手机 | 只看该作者
i循环8次后重新赋值0
回复

使用道具 举报

10#
ID:878845 发表于 2021-1-19 13:44 | 只看该作者
只是书写规范问题,实际这里运行没问题,但写软件来说防呆是必要的,否则以后出什么事还是要回来找的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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