找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3825|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)與學(xué)校不一樣的編程方式

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235332 發(fā)表于 2020-4-1 14:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
寫出此主題主要是因?yàn)楸救酥氨粚W(xué)校教的編程方式殘害,所以思量很久,還是想發(fā)出此貼,共和大家一起討論話不多少,直接進(jìn)入正題。
拿一個(gè)最簡(jiǎn)單得例子,在學(xué)校我們寫的最簡(jiǎn)單得51單片機(jī)的程序肯定都是點(diǎn)亮一個(gè)LED了,那么讓LED閃爍可用用的都是亮一下LED,然后延時(shí)一下,然后在滅LED,然后再延時(shí),循環(huán)往復(fù),達(dá)到延時(shí)的功能。
程序如下:
void delay(uint m)        //延時(shí)程序
{
        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);
        }
}

這里對(duì)于單個(gè)模塊來說是沒有問題的,但是一旦幾個(gè)模塊組合在一起,時(shí)間就不對(duì)了,然后延時(shí)還會(huì)影響到其他程序的運(yùn)行,所以,在主循環(huán)里。我們應(yīng)當(dāng)盡量去減少使用延時(shí)的情況。需要延時(shí)我們應(yīng)當(dāng)采用主循環(huán)計(jì)數(shù)的方式去實(shí)現(xiàn),那么在這里,我們就應(yīng)當(dāng)設(shè)定一個(gè)基準(zhǔn),也就是主循環(huán)應(yīng)當(dāng)多久跑一次呢?有人會(huì)問:主循環(huán)的時(shí)間我們還能設(shè)定?在這里其實(shí)我們說的是,主循環(huán)在跑,但是真正我們執(zhí)行的功能函數(shù)時(shí)間我們是可以設(shè)定的,話不多說先看程序:
void main()
{
        TMOD=0x01;//定時(shí)器工作在方式        
        TH0=(65536-50000)/256;//初值是15536,定時(shí)50ms
        TL0=(65536-50000)%256;
        TR0=1;//開始計(jì)數(shù)
        TF0 = 0;//溢出標(biāo)志清零
        while(1)//主循環(huán)
        {
                        if(TF0)//50ms到了
                        {
                                TF0 = 0;//清零
                                TH0=(65536-50000)/256;//重新賦初值
                                TL0=(65536-50000)%256;
                                V_TempData++;//計(jì)數(shù)加加
                                if(V_TempData >= 10)//500ms到了
                                {
                                        V_TempData = 0;//清零
                                        P_LEDPort ^= 1; //異或取反
                                }
                        }
        }        
}

在這里,我們簡(jiǎn)單的描述了一下,將功能函數(shù)設(shè)定為50ms跑一次,那么跑十次,就是500ms了,此時(shí)再將LED的狀態(tài)反轉(zhuǎn)一下,就可以達(dá)到閃爍的小伙了,這里只用到了一個(gè)功能,如果增加一個(gè)功能,比如讓蜂鳴器響1秒鐘然后滅一秒,就只需要增加一個(gè)計(jì)數(shù)就好了,然后和上面的LED一樣操作就好了,但是如果使用延時(shí),這是不是就會(huì)麻煩很多呢?
整個(gè)工程和仿真就放在下面附件吧!
樓主初次寫此類文章,不到之處請(qǐng)諒解!
還請(qǐng)大家有意見評(píng)論處指出來討論下!哈哈哈

全部資料51hei下載地址:
2_定時(shí)器0查詢法使LED閃爍.zip (70.38 KB, 下載次數(shù): 3)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:713580 發(fā)表于 2020-4-1 18:44 | 只看該作者
你又聰明完了!
怎么能說是殘害呢,第一個(gè)是用來入門,提高興趣的,也是對(duì)時(shí)間精確度要求不高的非精確延時(shí),這個(gè)在實(shí)際中幾乎不會(huì)用到,只是用來講原理,教你如何調(diào)試程序,第二個(gè)用的是定時(shí)器。第一種情況的時(shí)間要自己去找斷點(diǎn)調(diào)試,勉強(qiáng)達(dá)到要求,第二個(gè)是現(xiàn)成的,用除法,取余等計(jì)算出結(jié)果。性質(zhì)都不一樣。
回復(fù)

使用道具 舉報(bào)

板凳
ID:695749 發(fā)表于 2020-4-1 22:41 | 只看該作者
從入門到工程師的轉(zhuǎn)變,也是初學(xué)都經(jīng)歷的,謝謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:235200 發(fā)表于 2020-4-1 23:46 | 只看該作者
完全造成樓上的說法,學(xué)習(xí)是循序漸進(jìn)的,沒有延時(shí)作為鋪墊,怎么會(huì)有后的定時(shí)計(jì)時(shí)?編程思路是千變?nèi)f化的,一個(gè)程序完成一個(gè)功能就可以了,要移植到另外的程序,肯定還需要統(tǒng)調(diào)
回復(fù)

使用道具 舉報(bào)

5#
ID:217720 發(fā)表于 2020-4-2 08:04 | 只看該作者
LZ貼出的內(nèi)容,正常的高!秵纹瑱C(jī)原理與接口技術(shù)》課程中均會(huì)安排對(duì)應(yīng)的教學(xué)課時(shí),特別是定時(shí)器的使用,屬于萬年不變的期末考重點(diǎn)
回復(fù)

使用道具 舉報(bào)

6#
ID:424598 發(fā)表于 2020-4-2 08:55 來自手機(jī) | 只看該作者
不可能一上來就教定時(shí)器,會(huì)暈的
回復(fù)

使用道具 舉報(bào)

7#
ID:47286 發(fā)表于 2020-4-2 09:52 | 只看該作者
同6樓 沒教定時(shí)器之前都是用死循環(huán) 如果上來就講一大堆寄存器 當(dāng)時(shí)就暈菜了
回復(fù)

使用道具 舉報(bào)

8#
ID:377210 發(fā)表于 2020-4-2 12:06 | 只看該作者
大部分都是這樣開始的吧?從簡(jiǎn)單延時(shí)到定時(shí)器中斷延時(shí),都是一步步來的。通過設(shè)置不同標(biāo)志,一個(gè)定時(shí)器可以多次使用的
回復(fù)

使用道具 舉報(bào)

9#
ID:388929 發(fā)表于 2020-4-2 15:50 | 只看該作者
對(duì)初學(xué)者來說,第一種是很好理解的,對(duì)于程序來說,不涉及跳轉(zhuǎn)就很容易被理解的,所以并不是學(xué)?,是你已經(jīng)入門了,對(duì)入門知識(shí)有一定既看法,實(shí)屬正常
回復(fù)

使用道具 舉報(bào)

10#
ID:235332 發(fā)表于 2020-4-2 18:03 | 只看該作者
716gogo 發(fā)表于 2020-4-1 18:44
你又聰明完了!
怎么能說是殘害呢,第一個(gè)是用來入門,提高興趣的,也是對(duì)時(shí)間精確度要求不高的非精確延時(shí) ...

這里只是例舉了最簡(jiǎn)單的程序!而且這里想提醒的是正在學(xué)習(xí)單片機(jī)的人,形成一個(gè)好的編程方式,而非學(xué)成之人!謝謝
回復(fù)

使用道具 舉報(bào)

11#
ID:235332 發(fā)表于 2020-4-2 18:04 | 只看該作者
ssk7793 發(fā)表于 2020-4-2 08:55
不可能一上來就教定時(shí)器,會(huì)暈的

其實(shí)我想說的是編程方式,
回復(fù)

使用道具 舉報(bào)

12#
ID:235332 發(fā)表于 2020-4-2 18:05 | 只看該作者
billaj 發(fā)表于 2020-4-2 15:50
對(duì)初學(xué)者來說,第一種是很好理解的,對(duì)于程序來說,不涉及跳轉(zhuǎn)就很容易被理解的,所以并不是學(xué)?,是你已 ...

是的,主題是想提醒正在學(xué)習(xí)單片機(jī)的人,注意編程方式,養(yǎng)成一個(gè)好的習(xí)慣
回復(fù)

使用道具 舉報(bào)

13#
ID:235332 發(fā)表于 2020-4-2 18:28 | 只看該作者
csmyldl 發(fā)表于 2020-4-1 23:46
完全造成樓上的說法,學(xué)習(xí)是循序漸進(jìn)的,沒有延時(shí)作為鋪墊,怎么會(huì)有后的定時(shí)計(jì)時(shí)?編程思路是千變?nèi)f化的, ...

是的  這里只是先舉了個(gè)簡(jiǎn)單的例子,單一的點(diǎn)燈功能當(dāng)然使用延時(shí)很方便,但是多功能集合就會(huì)亂套了不是,只是想先提醒一個(gè)要注意編程方式思想
回復(fù)

使用道具 舉報(bào)

14#
ID:235332 發(fā)表于 2020-4-2 18:29 | 只看該作者
ssk7793 發(fā)表于 2020-4-2 08:55
不可能一上來就教定時(shí)器,會(huì)暈的

只是想提醒初學(xué)者注意一下,注重編程思想。
回復(fù)

使用道具 舉報(bào)

15#
ID:601478 發(fā)表于 2020-4-3 09:12 | 只看該作者
有多少人在學(xué)校學(xué)單片機(jī)師傅教的是匯編的舉個(gè)手
回復(fù)

使用道具 舉報(bào)

16#
ID:235332 發(fā)表于 2020-4-3 10:37 | 只看該作者
PDDDF 發(fā)表于 2020-4-3 09:12
有多少人在學(xué)校學(xué)單片機(jī)師傅教的是匯編的舉個(gè)手

匯編很高級(jí),但是我沒學(xué)過,哈哈
回復(fù)

使用道具 舉報(bào)

17#
ID:478073 發(fā)表于 2020-4-3 12:46 | 只看該作者
billaj 發(fā)表于 2020-4-2 15:50
對(duì)初學(xué)者來說,第一種是很好理解的,對(duì)于程序來說,不涉及跳轉(zhuǎn)就很容易被理解的,所以并不是學(xué)?,是你已 ...

你說的很對(duì),認(rèn)識(shí)是要一個(gè)過程的
回復(fù)

使用道具 舉報(bào)

18#
ID:282850 發(fā)表于 2020-4-3 14:51 | 只看該作者
樓上好多人說的很對(duì),從簡(jiǎn)單到復(fù)雜是對(duì)的。
另外delay并不是一無是處,很多地方還是需要,那此地方一般不需要精度的延時(shí)。
  delayms、delayus就好象2個(gè)電阻,電阻在電路中是產(chǎn)生熱量的的、浪費(fèi)電能,但電阻是電路中很重要、很基本的元件。哪怕一塊沒有電阻在上邊,只有IC的PCB板,實(shí)際上電阻有很多個(gè)在芯片內(nèi)部。
回復(fù)

使用道具 舉報(bào)

19#
ID:510365 發(fā)表于 2020-4-3 16:16 | 只看該作者
PDDDF 發(fā)表于 2020-4-3 09:12
有多少人在學(xué)校學(xué)單片機(jī)師傅教的是匯編的舉個(gè)手

一開始學(xué)的就是匯編 到現(xiàn)在還是不會(huì)c
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表