找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机与学校不一样的编程方式

  [复制链接]
跳转到指定楼层
#
ID:235332 发表于 2020-4-1 14:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
写出此主题主要是因为本人之前被学校教的编程方式残害,所以思量很久,还是想发出此贴,共和大家一起讨论话不多少,直接进入正题。
拿一个最简单得例子,在学校我们写的最简单得51单片机的程序肯定都是点亮一个LED了,那么让LED闪烁可用用的都是亮一下LED,然后延时一下,然后在灭LED,然后再延时,循环往复,达到延时的功能。
程序如下:
void delay(uint m)        //延时程序
{
        uint i,j;
        for(i=110;i>0;i--)
                for(j=m;j>0;j--);        
}
void main()
{
        while(1);
        {
                LED = 0;
                delay(500);
                LED = 1;
                delay(500);
        }
}

这里对于单个模块来说是没有问题的,但是一旦几个模块组合在一起,时间就不对了,然后延时还会影响到其他程序的运行,所以,在主循环里。我们应当尽量去减少使用延时的情况。需要延时我们应当采用主循环计数的方式去实现,那么在这里,我们就应当设定一个基准,也就是主循环应当多久跑一次呢?有人会问:主循环的时间我们还能设定?在这里其实我们说的是,主循环在跑,但是真正我们执行的功能函数时间我们是可以设定的,话不多说先看程序:
void main()
{
        TMOD=0x01;//定时器工作在方式        
        TH0=(65536-50000)/256;//初值是15536,定时50ms
        TL0=(65536-50000)%256;
        TR0=1;//开始计数
        TF0 = 0;//溢出标志清零
        while(1)//主循环
        {
                        if(TF0)//50ms到了
                        {
                                TF0 = 0;//清零
                                TH0=(65536-50000)/256;//重新赋初值
                                TL0=(65536-50000)%256;
                                V_TempData++;//计数加加
                                if(V_TempData >= 10)//500ms到了
                                {
                                        V_TempData = 0;//清零
                                        P_LEDPort ^= 1; //异或取反
                                }
                        }
        }        
}

在这里,我们简单的描述了一下,将功能函数设定为50ms跑一次,那么跑十次,就是500ms了,此时再将LED的状态反转一下,就可以达到闪烁的小伙了,这里只用到了一个功能,如果增加一个功能,比如让蜂鸣器响1秒钟然后灭一秒,就只需要增加一个计数就好了,然后和上面的LED一样操作就好了,但是如果使用延时,这是不是就会麻烦很多呢?
整个工程和仿真就放在下面附件吧!
楼主初次写此类文章,不到之处请谅解!!
还请大家有意见评论处指出来讨论下!!哈哈哈

全部资料51hei下载地址:
2_定时器0查询法使LED闪烁.zip (70.38 KB, 下载次数: 3)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

18#
ID:510365 发表于 2020-4-3 16:16 | 只看该作者
PDDDF 发表于 2020-4-3 09:12
有多少人在学校学单片机师傅教的是汇编的举个手

一开始学的就是汇编 到现在还是不会c
回复

使用道具 举报

17#
ID:282850 发表于 2020-4-3 14:51 | 只看该作者
楼上好多人说的很对,从简单到复杂是对的。
另外delay并不是一无是处,很多地方还是需要,那此地方一般不需要精度的延时。
  delayms、delayus就好象2个电阻,电阻在电路中是产生热量的的、浪费电能,但电阻是电路中很重要、很基本的元件。哪怕一块没有电阻在上边,只有IC的PCB板,实际上电阻有很多个在芯片内部。
回复

使用道具 举报

16#
ID:478073 发表于 2020-4-3 12:46 | 只看该作者
billaj 发表于 2020-4-2 15:50
对初学者来说,第一种是很好理解的,对于程序来说,不涉及跳转就很容易被理解的,所以并不是学校坑,是你已 ...

你说的很对,认识是要一个过程的
回复

使用道具 举报

15#
ID:235332 发表于 2020-4-3 10:37 | 只看该作者
PDDDF 发表于 2020-4-3 09:12
有多少人在学校学单片机师傅教的是汇编的举个手

汇编很高级,但是我没学过,哈哈
回复

使用道具 举报

14#
ID:601478 发表于 2020-4-3 09:12 | 只看该作者
有多少人在学校学单片机师傅教的是汇编的举个手
回复

使用道具 举报

13#
ID:235332 发表于 2020-4-2 18:29 | 只看该作者
ssk7793 发表于 2020-4-2 08:55
不可能一上来就教定时器,会晕的

只是想提醒初学者注意一下,注重编程思想。
回复

使用道具 举报

12#
ID:235332 发表于 2020-4-2 18:28 | 只看该作者
csmyldl 发表于 2020-4-1 23:46
完全造成楼上的说法,学习是循序渐进的,没有延时作为铺垫,怎么会有后的定时计时?编程思路是千变万化的, ...

是的  这里只是先举了个简单的例子,单一的点灯功能当然使用延时很方便,但是多功能集合就会乱套了不是,只是想先提醒一个要注意编程方式思想
回复

使用道具 举报

11#
ID:235332 发表于 2020-4-2 18:05 | 只看该作者
billaj 发表于 2020-4-2 15:50
对初学者来说,第一种是很好理解的,对于程序来说,不涉及跳转就很容易被理解的,所以并不是学校坑,是你已 ...

是的,主题是想提醒正在学习单片机的人,注意编程方式,养成一个好的习惯
回复

使用道具 举报

10#
ID:235332 发表于 2020-4-2 18:04 | 只看该作者
ssk7793 发表于 2020-4-2 08:55
不可能一上来就教定时器,会晕的

其实我想说的是编程方式,
回复

使用道具 举报

9#
ID:235332 发表于 2020-4-2 18:03 | 只看该作者
716gogo 发表于 2020-4-1 18:44
你又聪明完了!
怎么能说是残害呢,第一个是用来入门,提高兴趣的,也是对时间精确度要求不高的非精确延时 ...

这里只是例举了最简单的程序!而且这里想提醒的是正在学习单片机的人,形成一个好的编程方式,而非学成之人!谢谢
回复

使用道具 举报

8#
ID:388929 发表于 2020-4-2 15:50 | 只看该作者
对初学者来说,第一种是很好理解的,对于程序来说,不涉及跳转就很容易被理解的,所以并不是学校坑,是你已经入门了,对入门知识有一定既看法,实属正常
回复

使用道具 举报

7#
ID:377210 发表于 2020-4-2 12:06 | 只看该作者
大部分都是这样开始的吧?从简单延时到定时器中断延时,都是一步步来的。通过设置不同标志,一个定时器可以多次使用的
回复

使用道具 举报

6#
ID:47286 发表于 2020-4-2 09:52 | 只看该作者
同6楼 没教定时器之前都是用死循环 如果上来就讲一大堆寄存器 当时就晕菜了
回复

使用道具 举报

5#
ID:424598 发表于 2020-4-2 08:55 来自手机 | 只看该作者
不可能一上来就教定时器,会晕的
回复

使用道具 举报

地板
ID:217720 发表于 2020-4-2 08:04 | 只看该作者
LZ贴出的内容,正常的高校《单片机原理与接口技术》课程中均会安排对应的教学课时,特别是定时器的使用,属于万年不变的期末考重点
回复

使用道具 举报

板凳
ID:235200 发表于 2020-4-1 23:46 | 只看该作者
完全造成楼上的说法,学习是循序渐进的,没有延时作为铺垫,怎么会有后的定时计时?编程思路是千变万化的,一个程序完成一个功能就可以了,要移植到另外的程序,肯定还需要统调
回复

使用道具 举报

沙发
ID:695749 发表于 2020-4-1 22:41 | 只看该作者
从入门到工程师的转变,也是初学都经历的,谢谢分享!
回复

使用道具 举报

楼主
ID:713580 发表于 2020-4-1 18:44 | 只看该作者
你又聪明完了!
怎么能说是残害呢,第一个是用来入门,提高兴趣的,也是对时间精确度要求不高的非精确延时,这个在实际中几乎不会用到,只是用来讲原理,教你如何调试程序,第二个用的是定时器。第一种情况的时间要自己去找断点调试,勉强达到要求,第二个是现成的,用除法,取余等计算出结果。性质都不一样。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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