找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 643|回复: 22
收起左侧

为什么老师说代码不可以用,说不合适

  [复制链接]
ID:1147078 发表于 2025-4-4 15:30 | 显示全部楼层 |阅读模式

#include <REGX51.H>


void Delay(int ms);          
void Timer0_Init(void);          


char LED;
bit direction = 0;           
bit auto_mode = 0;  

void main()
{
    P2 = 0xFF;
    Timer0_Init();  
   
    while(1)
    {
        if(P3_0 == 0)
        {
            Delay(5);
            if(P3_0 == 0)
                       
            {
                while(P3_0 == 0);
                                Delay(5);  
                        if(direction != 0)  // 如果当前方向不同,只改变方向
                {
                    direction = 0;
                }  
               // direction = 0;   
                auto_mode = 1;     
            }
        }

        if(P3_1 == 0)
        {
            Delay(5);
            if(P3_1 == 0)
                       
                        {
                while(P3_1 == 0);
                                Delay(5);
                        if(direction != 1)  // 如果当前方向不同,只改变方向
                {
                    direction = 1;
                }  
      
                //direction = 1;     
                auto_mode = 1;   
            }
        }
    }
}


void Timer0_ISR(void) interrupt 1
{
    static  int counter = 0; //中断计数器
   
    TH0 = 0xB0;  
    TL0 = 0x18;
                   

    if(auto_mode)  
    {
        counter++;
        if(counter >= 10)
        {
            counter = 0;
            
            if(direction == 0)  // 向右循环
            {
                LED++;
                if(LED >= 8)
                {
                    LED = 0;
                }
            }
            else  // 向左循环
            {
                if(LED == 0)
                {
                    LED = 7;
                }
                else
                {
                    LED--;
                }
            }
            P2 = ~(0x01 << LED);
        }
    }
}


void Timer0_Init(void)
{
    TMOD &= 0xF0;  
    TMOD |= 0x01;
    TH0 = 0xB0;   
    TL0 = 0x18;
    ET0 = 1;  //允许定时器0中断     
    EA = 1;   //开启总中断     
    TR0 = 1;      
}

void Delay(int ms)
{
    int i,j;
    while(ms--)
    {
        for(i=1;i<=ms;i++)
            for(j=1;j<=300;j++);
    }
}通过计数器和定时器方式实现按下k1按键led向右循环,k2按键led向左循环,这是我的想法,上课没有好好听,跟着江科学的。老师说 if(auto_mode)  
    {
        counter++;
        if(counter >= 10)
        {
            counter = 0;
            
            if(direction == 0)  // 向右循环
            {
                LED++;
                if(LED >= 8)
                {
                    LED = 0;
                }
            }
            else  // 向左循环
            {
                if(LED == 0)
                {
                    LED = 7;
                }
                else
                {
                    LED--;
                }
            }
            P2 = ~(0x01 << LED);
        }
    }
}

这边的代码要修改成什么制表符
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 15:30 | 显示全部楼层
希望有人能来解答一下,因为没有一点头绪来改
回复

使用道具 举报

ID:879809 发表于 2025-4-4 16:41 | 显示全部楼层
老师说啥了?是功能没做到还是代码风格不喜欢?
回复

使用道具 举报

ID:1109793 发表于 2025-4-4 17:31 | 显示全部楼层
制表符,不太懂
大概是说改成查表方式吧。比较灵活,比如你可以选择不同的数组内容实现比如同时亮2个灯,或者3个灯什么的
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 18:14 | 显示全部楼层
rundstedt 发表于 2025-4-4 16:41
老师说啥了?是功能没做到还是代码风格不喜欢?

老师说他上课说不要这么写代码,嵌套里面写嵌套?我那天走的急没听清,让我再这个里面改制表位好像,我没学过这个,基本都是学江协自己摸索的
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 19:04 | 显示全部楼层
rundstedt 发表于 2025-4-4 16:41
老师说啥了?是功能没做到还是代码风格不喜欢?

不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表位好像
回复

使用道具 举报

ID:648281 发表于 2025-4-4 19:11 | 显示全部楼层
1、作业的要求是什么,具体实现的功能说明;
2、老师具体都说了什么;
3、你的程序是哪里来的,和要求相符吗
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 19:46 | 显示全部楼层
rundstedt 发表于 2025-4-4 16:41
老师说啥了?是功能没做到还是代码风格不喜欢?

不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表位好像
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 20:27 | 显示全部楼层
不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表位好像
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 20:29 | 显示全部楼层
不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表位好像
回复

使用道具 举报

ID:1147078 发表于 2025-4-4 22:27 | 显示全部楼层
rundstedt 发表于 2025-4-4 16:41
老师说啥了?是功能没做到还是代码风格不喜欢?

不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表位好像
回复

使用道具 举报

ID:1133081 发表于 2025-4-5 06:11 | 显示全部楼层
nooobaoe 发表于 2025-4-4 22:27
不是,老师说不能嵌套里面写嵌套,我当时没听懂,我跟着江协写的,一点点摸的,就记得老师最后让我写制表 ...

这就是一个流水灯程序,加两个按键改变方向。
回复

使用道具 举报

ID:879809 发表于 2025-4-5 10:33 | 显示全部楼层
nooobaoe 发表于 2025-4-4 18:14
老师说他上课说不要这么写代码,嵌套里面写嵌套?我那天走的急没听清,让我再这个里面改制表位好像,我没 ...

逻辑没问题就行,老师水平有限。
回复

使用道具 举报

ID:1147078 发表于 2025-4-5 11:09 | 显示全部楼层
WL0123 发表于 2025-4-5 06:11
这就是一个流水灯程序,加两个按键改变方向。

是的,但是他说不要我那么写
回复

使用道具 举报

ID:1147078 发表于 2025-4-5 11:13 | 显示全部楼层
51hei**1140 发表于 2025-4-4 19:11
1、作业的要求是什么,具体实现的功能说明;
2、老师具体都说了什么;
3、你的程序是哪里来的,和要求相 ...

1.按下k1按键led灯从左向右循环
2.按下k2按键led从右向左循环
3.300ms延时
4.当中断切换时,从当前灯切换循环点亮熄灭(这个还没做,第二天的任务)
老师具体说他上课说不要这么写嵌套,让我自行去修改,因为是下课期间我也没听清,最后让我加个制表位还是制表符
程序是跟着b站江协打的,先做的流水灯再做的定时器,单片机的效果已经实现了,但是老师说代码不可行
回复

使用道具 举报

ID:1147078 发表于 2025-4-5 11:14 | 显示全部楼层
WL0123 发表于 2025-4-5 06:11
这就是一个流水灯程序,加两个按键改变方向。

1.按下k1按键led灯从左向右循环
2.按下k2按键led从右向左循环
3.300ms延时
4.当中断切换时,从当前灯切换循环点亮熄灭(这个还没做,第二天的任务)
老师具体说他上课说不要这么写嵌套,让我自行去修改,因为是下课期间我也没听清,最后让我加个制表位还是制表符
程序是跟着b站江协打的,先做的流水灯再做的定时器,单片机的效果已经实现了,但是老师说代码不可行
回复

使用道具 举报

ID:320097 发表于 2025-4-5 11:20 | 显示全部楼层
我感觉你这个代码问题应该是出在定时器中断函数那里, static  int counter = 0; //中断计数器,这个类型我没有接触过,但是你每一次进入定时器中断都把counter = 0执行一次?
回复

使用道具 举报

ID:1147078 发表于 2025-4-5 12:28 | 显示全部楼层
欧阳云天 发表于 2025-4-5 11:20
我感觉你这个代码问题应该是出在定时器中断函数那里, static  int counter = 0; //中断计数器,这个类型我 ...

主要是代码没问题,相当于说的是格式有问题
回复

使用道具 举报

ID:1109793 发表于 2025-4-5 17:28 | 显示全部楼层
code uchar biaoge[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,};//每次亮一个灯
P2 = biaoge[LED];
回复

使用道具 举报

ID:595237 发表于 2025-4-8 19:55 | 显示全部楼层
#include <REGX51.H>

void Delay(unsigned int ms);
void Timer0_Init(void);

unsigned char LED = 0;    // LED初始位置
bit direction = 0;        // 方向标志 0:右移 1:左移
bit auto_mode = 0;        // 自动模式标志

void main()
{
        P2 = 0xFF;            // 初始化LED全灭
        Timer0_Init();

        while(1)
        {
                // 处理K1按键(右移)
                if(P3_0 == 0)
                {
                        Delay(5);
                        if(P3_0 == 0)
                        {
                                while(P3_0 == 0);  // 等待按键释放
                                Delay(5);
                               
                                if(direction != 0) // 仅方向不同时更新
                                {
                                        direction = 0;
                                }
                                auto_mode = 1;     // 开启自动模式
                        }
                }

                // 处理K2按键(左移)
                if(P3_1 == 0)
                {
                        Delay(5);
                        if(P3_1 == 0)
                        {
                                while(P3_1 == 0);  // 等待按键释放
                                Delay(5);
                               
                                if(direction != 1) // 仅方向不同时更新
                                {
                                        direction = 1;
                                }
                                auto_mode = 1;     // 开启自动模式
                        }
                }
        }
}

void Timer0_ISR(void) interrupt 1
{
        static unsigned int counter = 0;  // 中断计数器
       
        // 重装定时器初始值(30ms@12MHz)
        TH0 = 0x8A;
        TL0 = 0xD0;

        if(auto_mode)
        {
                if(++counter >= 10)          // 300ms时间到
                {
                        counter = 0;
                       
                        // 右移模式
                        if(direction == 0)
                        {
                                LED = (LED >= 7) ? 0 : LED+1;
                        }
                        // 左移模式
                        else
                        {
                                LED = (LED == 0) ? 7 : LED-1;
                        }
                       
                        P2 = ~(0x01 << LED);    // 更新LED显示
                }
        }
}

void Timer0_Init(void)
{
        TMOD &= 0xF0;   // 设置定时器0为模式1
        TMOD |= 0x01;
        TH0 = 0x8A;     // 初始化定时值(30ms@12MHz)
        TL0 = 0xD0;
        ET0 = 1;        // 使能定时器0中断
        EA = 1;         // 开启总中断
        TR0 = 1;        // 启动定时器
}

void Delay(unsigned int ms)
{
        unsigned int i, j;
        for(i=0; i<ms; i++)
        {
                for(j=0; j<300; j++);  // 近似1ms延时
        }
}

//注意:需要根据实际晶振频率调整延时参数(按12MHz计算)
回复

使用道具 举报

ID:844772 发表于 2025-4-9 09:10 | 显示全部楼层
没看出有啥事实错误啊,可能这个老师实践能力很强,受不了你这么写代码,比如中断里搞了那么多的判断,主程序也太长。
回复

使用道具 举报

ID:940483 发表于 2025-4-9 15:04 | 显示全部楼层
估计是觉得你代码太冗杂了,虽然实现功能了,但是效率不高。
我滴建议:你用的2层循环判断可以用while(ms--) , for(i = 0; i < 300; i++);代替。
还有你的if判断条件可以合并下,没必要分开来写》》》》if(auto_mode &&++counter >= 10)
LED位移如果用位运算可以减少代码体量(如果你学了的话),还有按键状态处理上,你有没有发现结构上其实是很相似的,宏可以去了解下(处理K1和K2只是引脚和方向不同,用宏来统一处理,减少重复),掌握了的话就是处理批量重复代码的利器。
示例(仅供参考哈,能力有限不保证肯定对,给你个方向):
#define H(h1, h2)                    \
    if (h1 == 0) {                   \     // 检测按键是否按下?
        Delay(5);                    \     // 消抖抖
        if (h1 == 0) {               \     // 确认按下
            while (h1 == 0);         \     // 等待释放
            Delay(5);                \     // 释放消抖
            if (direction != h2)     \     // 仅方向不同时才更新
                direction = h2;      \     // 设置方向
            auto_mode = 1;           \     // 开启自动模式
        }                            \
    }
K1\K2处理上重复的地方就下面这两行可以直接替代了
H(P3_0, 0)  // K1>>>右移方向0
H(P3_1, 1)  // K2>>>左移方向1

评分

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

查看全部评分

回复

使用道具 举报

ID:108361 发表于 2025-4-18 13:16 | 显示全部楼层
欧阳云天 发表于 2025-4-5 11:20
我感觉你这个代码问题应该是出在定时器中断函数那里, static  int counter = 0; //中断计数器,这个类型我 ...

静态变量,只初始化一次,跟全局一样,但是作用域限制正初始化所在的花括号范围里,C语言没过关啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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