chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊流水燈的寫法

單片機(jī)技術(shù)宅 ? 來源:單片機(jī)技術(shù)宅 ? 作者:單片機(jī)技術(shù)宅 ? 2021-03-02 15:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

流水燈,學(xué)單片機(jī)時,編程第一課的內(nèi)容,多少小伙伴的單片機(jī)之路都是從流水燈開始的。那有沒有想過,我們能用幾種方式來寫流水燈,各有什么優(yōu)缺點(diǎn)呢?今天小代就來聊聊流水燈的寫法。

硬件介紹:小代采用自己畫的STC15開發(fā)板,8位LED接P0口,陽極驅(qū)動,共陰連接方式,就這么多。

(實(shí)際測試時用的數(shù)碼管模擬,昨天剛接了線,懶得再次重新接線,直接用數(shù)碼管來代替LED,原理都一樣,能驗證就好)

1.初學(xué)者入門法

直接上代碼看后再說

#include"STC15.h"#defineu8unsignedchar#defineu16unsignedintvoid delay_ms(u16x);//ms延時函數(shù)void main(){u8led=0x01;u8i=0;P0M1=0x00;//STC15單片機(jī)把IO設(shè)為推挽輸出P0M0=0xff;P2M1=0x00;P2M0=0xff;P2=0xff;//數(shù)碼管位選驅(qū)動,硬件介紹上已經(jīng)說明原因while(1){//①初學(xué)者常見delay延時方式流水燈led=0x01;for(i=0;i<8;i++){????????????P0=led;????????????delay_ms(1000);????????????led=led<<1;????????}?????}??????//while(1)?結(jié)束}//main結(jié)束 //************************************//功能:ms延時函數(shù)?//參數(shù):x--延時的時間長短,x=1000約為1s 24M晶振//作者:小代//微信關(guān)注:單片機(jī)技術(shù)宅//************************************void delay_ms(u16?x){????u16?i,j,k;????for(k=0;k

一看代碼37行,太多了,仔細(xì)一看,注釋和空行占據(jù)了一大半,這樣一想就開心多了。這個代碼沒有更多需要解釋的,采用最常見的,初學(xué)者最喜歡的方式,delay延時方式實(shí)現(xiàn),下面聊優(yōu)缺點(diǎn)。

優(yōu)點(diǎn):簡單粗暴好理解,能看懂文字(字母)的都知道

缺點(diǎn):代碼執(zhí)行效率太低,太低,太低

程序流程圖如下圖所示,CPU更多的時間是花在“等待1s”上,效率太低,單純的這樣演示流水燈,那這個程序沒有任何問題,當(dāng)在這個程序中再加入其它的程序,必然會出問題,第一流水燈會被執(zhí)行慢了,第二,新加入的功能反應(yīng)會很慢,特別是一些實(shí)時性有要求的代碼。加到這里就會有問題了。為了解決這些問題,我們引出了第二種方式的流水燈。

2.記錄主程序執(zhí)行次數(shù)方式

還是先上代碼再聊

#include "STC15.h"

#define u8 unsigned char

#define u16 unsigned int

//************************************

//功能:主函數(shù)入口 main

//參數(shù):無

//作者:小代

//微信關(guān)注:單片機(jī)技術(shù)宅

//************************************

voidmain(){

u8 led=0x01;

u16main_cnt=0;

P0M1=0x00; //STC15單片機(jī)把IO設(shè)為推挽輸出

P0M0=0xff;

P2M1=0x00;

P2M0=0xff;

P2=0xff; //數(shù)碼管位選驅(qū)動,硬件介紹上已經(jīng)說明原因

while(1){

//②主程序循環(huán)次數(shù)實(shí)現(xiàn)延時方式流水燈

main_cnt++; //主程序每運(yùn)行一次,main_cnt將會被加1

//通過if語句實(shí)現(xiàn)內(nèi)部代碼塊的運(yùn)行速率降低

//只有主程序循環(huán)60000此后,if語句內(nèi)的代碼塊才被執(zhí)行一次

//如若需要更低的執(zhí)行速率,可以采用兩層變量嵌套計數(shù)

P0=led;

if(main_cnt>60000){

main_cnt=0; //次數(shù)記錄清零,為下一次記錄準(zhǔn)備

if(led==0x80){

led=0x01;

}

else{

led=led<<1;

}

}

} //while(1) 結(jié)束

}

//main結(jié)束

還是40+行代碼,還是注釋+空行占據(jù)了一半左右。以上代碼最大的特點(diǎn)就是沒有之前執(zhí)行效率很低的delay函數(shù),也算是升級了吧。沒了delay延時,那如何實(shí)現(xiàn)等待的呢?小代慢慢聊。

在while(1)循環(huán)里的第21行,只要主程序每運(yùn)行一次,21行就會對變量main_cnt加1,這個變量定義為16位無符號類型,最大可以到65535,在此,小代記錄60000此后就去點(diǎn)亮下一個流水燈的LED,顯示效果比方法1的略快,以上注釋也說了,如果單一變量記錄次數(shù)沒法滿足需要的等待時間,可以采用兩個變量嵌套記錄的方式。

通過這種方式點(diǎn)亮LED燈,真正的點(diǎn)燈程序段只有在主程序運(yùn)行60000后才會被運(yùn)行到一次。仔細(xì)看主程序里面,其實(shí)就只有一條語句,那就是對main_cnt做加1處理,完了每次都去判斷一下main_cnt有沒有到60000了,到了后才去處理LED點(diǎn)燈。下面聊聊優(yōu)缺點(diǎn)。

優(yōu)點(diǎn):程序簡單,效率高

缺點(diǎn):點(diǎn)燈的速度會隨著主程序內(nèi)循環(huán)語句的增多而降低。

也就是說如果主程序里增加了其他的運(yùn)行語句,那這里控制點(diǎn)燈的記錄次數(shù)值就不再是60000,需要減小,或者說60000得到的效果就會讓流水燈變慢。程序流程圖如下圖

到這里,程序執(zhí)行效率問題我們已經(jīng)解決了,在這程序基礎(chǔ)上加入其它代碼后,各個功能還是能運(yùn)行起來,但是還是有問題,流水燈的速度會改變,為解決這個問題,小代引出了第三種方法。

3.定時器實(shí)現(xiàn)

說到定時器,首先還得知道中斷的原理,但是,中斷和定時器,學(xué)單片機(jī)連這兩個知識點(diǎn)都沒學(xué)會,那怎好意思說你學(xué)過單片機(jī)。也就是說中斷和定時器就像單片機(jī)驅(qū)動IO口一樣的普通,一樣的簡單,不要想的多復(fù)雜。還是先上代碼再聊。

#include "STC15.h"

#define u8 unsigned char

#define u16 unsigned int

voiddelay_ms(u16 x); //ms延時函數(shù)

voidTimer0Init(void); //2毫秒@24.000MHz

u16 timer0_cnt=0;

bit timer0_1s_flag=0;

//************************************

//功能:主函數(shù)入口 main

//參數(shù):無

//作者:小代

//微信關(guān)注:單片機(jī)技術(shù)宅

//************************************

voidmain(){

u8 led=0x01;

u16main_cnt=0;

P0M1=0x00; //STC15單片機(jī)把IO設(shè)為推挽輸出

P0M0=0xff;

P2M1=0x00;

P2M0=0xff;

P2=0xff; //數(shù)碼管位選驅(qū)動

Timer0Init(); //定時器初始化

while(1){

//③通過定時器中斷控制流水燈效果

//主程序里只做LED的驅(qū)動

//如果任務(wù)少,判斷標(biāo)志位置位都可以放到定時器中斷里

//這里統(tǒng)一放到了主循環(huán)里

P0=led;

if(timer0_1s_flag==1){

timer0_1s_flag=0; //清除標(biāo)志位

if(led==0x80){ //是否移動了8次

led=0x01;

}

else{

led=led<<1;

}

}

}//while(1) 結(jié)束

}

//main結(jié)束

//************************************

//功能:定時器初始化函數(shù)

//參數(shù):無

//作者:小代

//微信關(guān)注:單片機(jī)技術(shù)宅

//************************************

voidTimer0Init(void) //2毫秒@24.000MHz

{

AUXR|=0x80; //定時器時鐘1T模式

TMOD&=0xF0; //設(shè)置定時器模式

TL0=0x80; //設(shè)置定時初值

TH0=0x44; //設(shè)置定時初值

TF0=0; //清除TF0標(biāo)志

TR0=1; //定時器0開始計時

ET0=1; //開中斷

EA=1;

}

//************************************

//功能:Timer0中斷函數(shù) 2ms中斷一次

//參數(shù):無

//作者:小代

//微信關(guān)注:單片機(jī)技術(shù)宅

//************************************

voidtimer0_int (void) interrupt 1 {

TF0=0;

timer0_cnt++;

if(timer0_cnt==500){

timer0_1s_flag=1;

timer0_cnt=0;

}

}

看到這,一看代碼量暴增,一下子就是原來的兩倍,其實(shí)更多的也還是注釋,代碼量是有所增加,因為用到了定時器和中斷,需要對定時器進(jìn)行初始化,完了還需要一個中斷函數(shù)。在這個程序,定時T0每2ms中斷一次,進(jìn)入中斷后,中斷處理函數(shù)直接對timer0_cnt變量加1記錄,當(dāng)記錄500次后,說明1s時間到,此時置位1s時間標(biāo)志位timer0_1s_flag=1。在主程序,只做點(diǎn)燈和判斷1s時間到來沒有,當(dāng)1s時間到來后,主程序就去處理LED的移位操作。

優(yōu)點(diǎn):效率極高,實(shí)時性好,時間穩(wěn)定

缺點(diǎn):非要說,那就是用到了定時器和中斷,初學(xué)者會覺得難

通過這種方式實(shí)現(xiàn)流水燈,還可以在主程序中加入其它的代碼,并不會影響到流水燈的運(yùn)行。其實(shí)這只是一個最簡單的模型,在復(fù)雜項目中同樣可以用這模型,比如,1s點(diǎn)亮一個LED燈,1ms刷新一次數(shù)碼管,10ms讀取一次按鍵,500ms讀取一次ADC的值等等。這樣很多的功能都可以采用這樣的模型來實(shí)現(xiàn),并且各個功能之間是互不干擾的。

到此,今天的內(nèi)容聊完了,其實(shí)第三種方式就是“狀態(tài)機(jī)”或者“分時處理”等等一些比較高級的名稱就是這么一回事。下次再聽到這些高大上的名稱時,一定要知道,這并不是什么高深的東西。更重要的是在以后的復(fù)雜項目中要會用這樣的方式去處理各個功能之間的切換。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45476

    瀏覽量

    669455
  • 流水燈
    +關(guān)注

    關(guān)注

    21

    文章

    435

    瀏覽量

    61646
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4965

    瀏覽量

    73844

原文標(biāo)題:你有幾種方法寫流水燈

文章出處:【微信號:chuxue_MCU,微信公眾號:單片機(jī)技術(shù)宅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    **CW32L012****開發(fā)評估板的第一個程序**

    。 首先是打開了活動網(wǎng)站,可以看到網(wǎng)站的資料挺豐富的,這極大的滿足了我后續(xù)學(xué)習(xí)資料短缺的問題。 可以看到一共有10個實(shí)驗,我趕緊下載了流水燈實(shí)驗。 我是DAPLink下載器,所以settings這里選擇
    發(fā)表于 11-22 00:09

    流水線基本結(jié)構(gòu)

    3級流水線(Cortex-M0) 分為以下三個階段: 取指(Fetch):從存儲器中讀取指令。 解碼(Decode):解析指令的操作類型和操作數(shù)。 執(zhí)行(Execute):執(zhí)行指令(如算術(shù)運(yùn)算、內(nèi)存
    發(fā)表于 11-21 07:35

    蜂鳥E203在黑金XC7A200T型FPGA上點(diǎn)亮LED并實(shí)現(xiàn)流水燈

    一、隊伍介紹 本篇介紹的內(nèi)容是蜂鳥E203在黑金XC7A200T型FPGA上點(diǎn)亮LED并實(shí)現(xiàn)流水燈。 二、前言 在此之前我們已經(jīng)將蜂鳥E203在黑金XC7A200T型FPGA開發(fā)板上,所以
    發(fā)表于 10-31 09:04

    聊聊FPGA中的TDC原理

    今天我們不談高大上的物理學(xué),只聊聊如何在 FPGA 中,用一串加法器和 D 觸發(fā)器,“數(shù)清楚時間”——這就是時間數(shù)字轉(zhuǎn)換器(TDC)的魅力。
    的頭像 發(fā)表于 09-02 15:15 ?1957次閱讀
    <b class='flag-5'>聊聊</b>FPGA中的TDC原理

    激光振鏡運(yùn)動控制器在流水線激光打標(biāo)上的應(yīng)用

    正運(yùn)動流水線激光打標(biāo)解決方案
    的頭像 發(fā)表于 08-05 11:26 ?983次閱讀
    激光振鏡運(yùn)動控制器在<b class='flag-5'>流水</b>線激光打標(biāo)上的應(yīng)用

    尋開發(fā)伙伴 一起搞細(xì)胞電阻儀,有興趣的朋友來聊聊!

    尋開發(fā)伙伴 一起搞細(xì)胞電阻儀,有興趣的朋友來聊聊!
    發(fā)表于 07-10 15:51

    【沁恒CH585開發(fā)板免費(fèi)試用體驗】GPIO 流水燈

    開發(fā)環(huán)境: IDE:MounRiver Studio MCU:CH585 1 GPIO工作原理 熟悉單片機(jī)的朋友都知道,學(xué)習(xí)的第一個例程就是流水燈,要想實(shí)現(xiàn)流水燈,首先必須了解GPIO的工作原理
    發(fā)表于 07-04 22:55

    自動化開裝封碼流水線數(shù)據(jù)采集解決方案

    在智能制造加速推進(jìn)的時代背景下,自動化開裝封碼流水線廣泛應(yīng)用于食品、藥品、日化、電子等眾多行業(yè),承擔(dān)著產(chǎn)品自動開箱、裝填、封箱、貼標(biāo)及碼垛的核心生產(chǎn)任務(wù)。隨著生產(chǎn)規(guī)模擴(kuò)大和精細(xì)化管理需求的提升,對流水
    的頭像 發(fā)表于 06-27 15:56 ?746次閱讀
    自動化開裝封碼<b class='flag-5'>流水</b>線數(shù)據(jù)采集解決方案

    水燈具好不好?水下燈具氣密性檢測儀測過才知道

    在現(xiàn)代照明領(lǐng)域,防水燈具的應(yīng)用越來越廣泛,無論是戶外景觀照明,還是水下特殊環(huán)境照明,都離不開防水燈具的支持。然而,防水燈具的氣密性直接關(guān)系到其防水性能、使用壽命和安全性,水下燈具氣密性檢測儀則成為
    的頭像 發(fā)表于 06-14 15:09 ?416次閱讀
    防<b class='flag-5'>水燈</b>具好不好?水下燈具氣密性檢測儀測過才知道

    遠(yuǎn)程io模塊在汽車流水線的應(yīng)用

    在汽車制造領(lǐng)域,生產(chǎn)流水線的高效、穩(wěn)定運(yùn)行是保障產(chǎn)品質(zhì)量與生產(chǎn)效率的關(guān)鍵。隨著工業(yè) 4.0 和智能制造理念的深入,汽車生產(chǎn)企業(yè)對流水線自動化控制提出了更高要求,不僅要實(shí)現(xiàn)設(shè)備間的精準(zhǔn)協(xié)同作業(yè),還需
    的頭像 發(fā)表于 06-11 15:26 ?661次閱讀

    【RA-Eco-RA4M2開發(fā)板評測】流水燈練習(xí)

    ,LED的驅(qū)動。做一個流水燈效果 參考代碼如下: #include \"hal_data.h\" FSP_CPP_HEADER void R_BSP_WarmStart
    發(fā)表于 05-29 19:04

    【RA-Eco-RA4M2開發(fā)板評測】點(diǎn)燈實(shí)現(xiàn)6種LED花式流水燈操作

    很高興收到瑞薩電子提供的RA4M2開發(fā)板,這次帖子就專門用來說說專業(yè)點(diǎn)燈操作,實(shí)現(xiàn)各種花式的流水燈,可以十分方便地控制LED的各種狀態(tài),甚至多個LED組合控制,如跑馬燈等。 打開原理圖,可以看到3個
    發(fā)表于 04-28 21:28

    【RA-Eco-RA4M2開發(fā)板評測】2 初識GPIO流水燈

    工作原理 熟悉單片機(jī)的朋友都知道,學(xué)習(xí)的第一個例程就是流水燈,要想實(shí)現(xiàn)流水燈,首先必須了解GPIO的工作原理。GPIO的基本結(jié)構(gòu)如下圖所示。 Figure ? GPIO的基本結(jié)構(gòu) 和其他
    發(fā)表于 04-25 23:06

    新概念51單片機(jī)C語言教程入門、提高、開發(fā)、拓展全攻略

    庫函數(shù)實(shí)現(xiàn)流水燈 第2篇 內(nèi)外部資源操作篇 3.1 數(shù)碼管顯示原理 3.2 數(shù)碼管靜態(tài)顯示 3.3 數(shù)碼管動態(tài)顯示 3.4 中斷概念 3.5 單片機(jī)的定時器中斷 4.1 獨(dú)立鍵盤檢測 4.2 矩陣鍵盤
    發(fā)表于 04-15 13:57

    RISC-V五級流水線CPU設(shè)計

    本文實(shí)現(xiàn)的CPU是一個五級流水線的精簡版CPU(也叫PCPU,即pipeline),包括IF(取指令)、ID(解碼)、EX(執(zhí)行)、MEM(內(nèi)存操作)、WB(回寫)。
    的頭像 發(fā)表于 04-15 09:46 ?1700次閱讀
    RISC-V五級<b class='flag-5'>流水</b>線CPU設(shè)計