国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【單片機】06流水燈

這篇具有很好參考價值的文章主要介紹了【單片機】06流水燈。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

上次課布置的流水燈實驗,硬件上我們用8根導(dǎo)線分別將P1口的第0腳接到第0個燈,第1腳接到第1個燈,以此類推,直到將第7腳接到第7個燈上。軟件上相信大家能想到的最簡單的辦法是先將第0個燈點亮,延時,再將1個燈點亮,再延時,依次類推直到將第7個燈點亮,延時,再將上面的步驟無限的循環(huán)執(zhí)行,代碼如下:

#include <reg51.h>
void main()
{
	unsigned int i;
	while(1)
	{
		P1=0xFE;             
		//11111110B 第0個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xFD;             
		//11111101B 第1個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xFB;             
		//11111011B 第2個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xF7;             
		//11110111B 第3個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xEF;             
		//11101111B 第4個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xDF;             
		//11011111B 第5個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0xBF;             
		//10111111B 第6個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
		P1=0x7E;             
		//01111111B 第7個燈亮,其他的燈滅
		for(i=0;i<=10000;i++);  //延時
	}
}

將上面的程序我們編譯下載到單片機中運行,我們看到了LED燈依次點亮的流水燈效果。我們來分析一下上面的程序的還能不能優(yōu)化。

我們發(fā)現(xiàn)點亮每個燈的語句都差不多,都是給P1賦值,然后延時,我們能不能用循環(huán)來做呢?能否用循環(huán)來做,取決于點亮每個燈的語句中不同部分是否有規(guī)律,若有規(guī)律我們就能用循環(huán)來寫。我們發(fā)現(xiàn)從第0個燈到第7個燈點亮賦的值不同,這些值程序中使用的是16進制形式,看不出規(guī)律,但我們分析這些值的二進制(見上面程序的注釋部分),發(fā)現(xiàn)每次賦的值是將上次賦的值循環(huán)左移了一下,初始值為0xFE,那我們有沒有循環(huán)左移操作符呢?匯編語言中有循環(huán)左移指令,這里我們不做介紹,那C51中有循環(huán)移位運算符嗎?答案是否定的。我們直接能想到的是C語言中有“<<”(左移)和“>>”(右移)運算符。下面我們詳細復(fù)習(xí)一下這個運算符的使用。
1、“<<”(左移)
“<<”表達式的形式是:操作數(shù)<<n,意思是將操作數(shù)按二進制的形式,每位向左移n位,最右邊空出來的n位統(tǒng)一全補0。例如0xFE<<1結(jié)果是多少呢?我們先把0xFE寫成二進制形式111111110B,左移一位后得到11111100B,最后的結(jié)果是0xFA。
2、“>>”(右移)
“>>”表達式的形式是:操作數(shù)<<n,意思是將操作數(shù)按二進制的形式,每位向右移n>>位,這里要注意最左邊空出來的n位,若操作數(shù)是無符號數(shù)則補0,若操作數(shù)是有符號數(shù)則>>補符號位。例如:
unsignedchar x=0xFE;
x=x>>1;
上面的語句x定義的是無符號字符型,x的初始值寫成二進制是111111110B,x>>1后x的值為01111111B,空出的最高位補的是0。但若是下面的語句結(jié)果就不一樣了。
char x=0xFE;
x=x>>1;
上面的語句x定義的是有符號字符型,x的初始值寫成二進制是111111110B,注意了符號位是1,x>>1后x的值為11111111B,空出的最高位補的是符號位1。再看下面的語句。
char x=0x7E;
x=x>>1;
上面的語句x定義的是有符號字符型,x的初始值寫成二進制是011111110B,注意了符號位是0,x>>1后x的值為00111111B,空出的最高位補的是符號位0。

綜上分析,C51沒有直接的循環(huán)移位運算符,但在intrins.h頭文件中已經(jīng)定義了這些功能的函數(shù),可以直接調(diào)用,移位函數(shù)有:
(1)unsigned char cror (unsigned char, unsignedchar);無符號字符型變量循環(huán)右移位
函數(shù)。
(2)unsigned int iror (unsigned int, unsigned char);無符號整型變量循環(huán)右移位函
數(shù)。
(3)unsigned long lror (unsigned long, unsigned char);無符號長整型變量循環(huán)右移位
函數(shù)
(4)unsigned char crol (unsigned char, unsigned char);無符號字符型變量循環(huán)左移位
函數(shù)。
(5)unsigned int irol (unsigned int, unsigned char);無符號字符型變量循環(huán)左移位
函數(shù)。
(6)unsigned long lrol (unsigned long, unsigned char);無符號字符型變量循環(huán)左移位
函數(shù)。
以上6個函數(shù)第一形參是循環(huán)移位的數(shù)據(jù),第二形參是循環(huán)移位的次數(shù),例如要將P0寄存器循環(huán)左移一位,函數(shù)的調(diào)用形式為:
P0=_crol_ (P0, 1);
所以上面的流水燈代碼可以改寫為循環(huán)結(jié)構(gòu):

#include <reg51.h>
#include <intrins.h>
void main()
{
	unsigned int i;
	P1=0xFE;
	while(1)
	{
		for(i=0;i<=10000;i++);  //延時
		P1=_crol_(P1, 1);//循環(huán)左移1位
	}
}

大家思考一下,如果沒有這樣的庫函數(shù),我們怎么自己寫出循環(huán)左移1的功能代碼呢?
我們分析發(fā)現(xiàn),循環(huán)左移1位就是左移一位后,最右邊空出來位補最左邊移出去的那個位,我們可以先讓操作數(shù)的值“左移”一位,最右邊的位補的0,得到一個值1,再將操作數(shù)里的值右移7位,也就是,將被左移出去的最高位移到最低位上,得到值2,再將值1和值2或一下,就能實現(xiàn)循環(huán)左移功能了。例如,將P0循環(huán)左移一位我們可以寫成如下代碼:
P0=(P0<<1) | ( P0>>7);
上面的流水燈還可以用下面的代碼實現(xiàn):

#include <reg51.h>
#include <intrins.h>
void main()
{
	unsigned int i;
	P1=0xFE;
	while(1)
	{
		for(i=0;i<=10000;i++);  //延時
		P1=(P1<<1) | ( P1>>7);//循環(huán)左移1位
	}
}

1111 1110
1111 1100 | 0000 0001 = 1111 1101
1111 1010 | 0000 0001 = 1111 1011
… = 0111 1111
1111 1110 | 0000 0000 = 1111 1110
1111 1100 | 0000 0001 = 1111 1101
1111 1010 | 0000 0001 = 1111 1011
文章來源地址http://www.zghlxwxcb.cn/news/detail-718122.html

到了這里,關(guān)于【單片機】06流水燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 51單片機實現(xiàn)流水燈

    51單片機實現(xiàn)流水燈

    我們之前說過可以控制管腳口電平來控制LED的亮滅,低電平燈亮,高電平燈滅,具體可以看我之前的博客。 P20~P27可以用八位二進制數(shù)來表示每一位的電平,第八位是P20,第一位是P27,那么11111110就代表P20亮,其他滅,11101111就代表P24亮,其他滅。流水燈的代碼就可以寫成這樣

    2024年02月11日
    瀏覽(18)
  • 【51單片機】鍵控流水燈

    設(shè)置k3作為啟動鍵,只有先按下k3才能開始控制流水燈,按下k3后LED閃爍提示開始成功。 在按下k3后,其余鍵即可控制流水燈。其中k1執(zhí)行從右到左,k2執(zhí)行從左到右。 按下k4,執(zhí)行外部中斷,立馬中止流水燈運行,需重新按下啟動鍵重啟。

    2024年02月06日
    瀏覽(21)
  • 51單片機入門流水燈

    上次已經(jīng)實現(xiàn)了LED的點亮了,這篇文章將帶大家實現(xiàn)流水燈。 要想實現(xiàn)流水燈首先就得知道什么是延時函數(shù),延時函數(shù)的作用就是等待。比如延時一毫秒就是讓程序在這里等待一毫秒。延時函數(shù)的本質(zhì)就是執(zhí)行一些空指令,因為執(zhí)行指令需要耗費時間,所以執(zhí)行一定數(shù)量的空

    2024年02月04日
    瀏覽(22)
  • 51單片機按鍵控制流水燈

    51單片機按鍵控制流水燈

    1獨立按鍵的原理圖 按鍵所對應(yīng)的引腳為P3的0、1、2、3引腳口,并且這里總共有四個獨立按鍵,它們公共的一段都接到了 GND 電源的負極。這樣我們就知道按鍵上電的默認電平為高電平。所以我們只需要控制按鍵按下時給一個低電平0,不按下時默認高電平1就行。 ?2按鍵控制

    2024年02月11日
    瀏覽(19)
  • 【51單片機】:閃燈、流水燈(從左往右)、流水燈(從右往左)、蜂鳴器。

    【51單片機】:閃燈、流水燈(從左往右)、流水燈(從右往左)、蜂鳴器。

    ? ? ? ? 言歸正傳,一切都回歸本源,從51再來一次,首先就是最簡單的點燈大師。 ? ? ? ? 這么些年從51 到? 32? 再到? arduino? 再到? ESP? 等等,都是從點燈大師開始的。 于是介紹如下: 閃燈 流水燈(從左往右) 流水燈(從右往左) 蜂鳴器 ????????LED燈的原理:LED是發(fā)

    2024年02月11日
    瀏覽(26)
  • 51單片機通過兩個按鍵控制流水燈方向

    按鍵一接單片機P3_1,按鍵2接P3_0 8個流水燈接P2口 以下是代碼:

    2024年02月11日
    瀏覽(23)
  • 基于51單片機設(shè)計的花樣流水燈設(shè)計

    基于51單片機設(shè)計的花樣流水燈設(shè)計

    花樣流水燈是一種常見的LED燈效果,被廣泛應(yīng)用于舞臺表演、節(jié)日慶典、晚會演出等場合。在現(xiàn)代智能家居、電子產(chǎn)品中,花樣流水燈也被廣泛使用,通過調(diào)整亮滅順序和時間,可以實現(xiàn)各種炫酷的燈光效果,增強用戶體驗。而51單片機作為一種常見的嵌入式開發(fā)平臺,具有

    2024年02月09日
    瀏覽(20)
  • 【51單片機】按鍵操作(單個燈閃爍&&流水燈)

    【51單片機】按鍵操作(單個燈閃爍&&流水燈)

    ??專欄【51單片機】 ??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。 ??音樂分享【如愿】 大一同學(xué)小吉,歡迎并且感謝大家指出我的問題?? 目錄 ?注意 ??同一個燈? ??????效果 ??????代碼 ??????問題分析 ?注意 ?P3_1=0,表示按下按鍵? ?為什么while(

    2024年02月01日
    瀏覽(20)
  • 單片機c51中斷 — 中斷鍵控流水燈

    單片機c51中斷 — 中斷鍵控流水燈

    項目文件 文件 關(guān)于項目的內(nèi)容知識點可以見專欄單片機原理及應(yīng)用 的第五章,中斷 ? 在第4章的實例2中,按鍵檢測是采用查詢法進行的,其流程圖如圖所示 問題是這樣的:由于查詢法 -按鍵查詢、標(biāo)志位修改及彩燈循環(huán)幾個環(huán)節(jié)是串聯(lián)關(guān)系,當(dāng)CPU運行于彩燈時,將因不能及

    2024年02月08日
    瀏覽(31)
  • 51單片機流水燈三種實現(xiàn)方法

    51單片機流水燈三種實現(xiàn)方法

    流水燈可以用三種方法實現(xiàn) 一.通過移位函數(shù) ?_crol_() ?和 ?_cror_() 二.位移實現(xiàn)流水燈 三.數(shù)組流水燈實現(xiàn) 首先說一下流水燈的原理 讓0從左往右位移或者從右往左位移 從而實現(xiàn)流水燈依次點亮 電路圖如下,使用軟件是project 使用左移函數(shù)代碼如下 ?///運行結(jié)果是LED燈從上到

    2023年04月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包