1. <span id="4x4v6"></span>

    1. <button id="4x4v6"><acronym id="4x4v6"></acronym></button>

      <tbody id="4x4v6"></tbody>

      <dd id="4x4v6"><pre id="4x4v6"></pre></dd>

      當前位置 博文首頁 > Moqim的博客:單片機學習(3——點亮LED燈)

        Moqim的博客:單片機學習(3——點亮LED燈)

        作者:[db:作者] 時間:2021-09-26 09:51

        注:此單片機型號為STC15F2K60S2.

        原理圖片來源:我自己:)

        如圖,發光二極管L1—L8共陽接法,VCC為電源正極,高電平。
        已知發光二極管正向導通反向截至,要使得二極管發光,就要讓Q1—Q8為低電平?煽毓苣_為P00—P07,所以要輸入P00—P07為低電平。為了讓P0能夠影響到Q1—Q8,就要使得鎖存器M74HC573M1R導通,即要讓管腳LE為高電平。又管腳LE與Y4C連接,所以Y4C也為高電平。
        圖片來源:我自己:)
        圖片來源:我自己:)
        又Y4C連接了一個或非門,或非門的輸入端為Y4和WR。因為WR已用跳線帽與GND連接在了一起,GND為接地,所以WR為0(低電平)。
        根據或非門邏輯表格:

        Y4	      WR	   Y4C
        0	       0	     1
        0          1   	     0
        1	       0	     0
        1	       1	     0
        

        所以,當Y4C為0時,Y4為1;當Y4C為1時,Y4為0.
        所以,要使得Y4C為高電平,Y4就要為低電平,即Y4為0.
        圖片來源:我自己:)
        又Y4是由74HC138位譯碼器的輸入端A、B、C來控制,以C、B、A為邏輯順序,CBA組成二進制數,來選中Y0—Y7,被選中者即為低電平。

        所以,要使得Y4為低電平,CBA要為100.

        另外,由于P0口是復用的,意味著也要控制別的器件,所以如果一直讓LE為高,那么就在控制別的器件的時候就會影響到LED,所以在鎖存器導通后,應該截止保存住它的狀態。

        整理邏輯

        點亮LED:
        Q1—Q8為低電平 —> P00-P07為低電平 -> 導通鎖存器,LE為高電平 ->
        Y4C為高電平 -> 或非門,Y4為低電平 -> 譯碼器,CBA組合為100 ->
        鎖存狀態,斷開鎖存器,LE為低電平,Y4C為低電平 -> 
        或非門,Y4為高電平 -> 譯碼器,CBA組合為000.(不為100即可)
        
        同理,熄滅LED:
        Q1—Q8為高電平 —> P00-P07為高電平 -> 導通鎖存器,LE為高電平 ->
        Y4C為高電平 -> 或非門,Y4為低電平 -> 譯碼器,CBA組合為100 ->
        鎖存狀態,斷開鎖存器,LE為低電平,Y4C為低電平 -> 
        或非門,Y4為高電平 -> 譯碼器,CBA組合為000.(不為100即可)
        

        代碼

        來源:藍橋杯官方資料。

        #include "reg52.h"
        // #include "absacc.h"
        // 關閉外設
        void Cls_Peripheral(void)
        { // IO模式(J13-2和J13-3相連)
          P0 = 0xFF;
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
          P0 = 0;
          P2 = P2 & 0x1F | 0xA0;			// P27~P25清零,再定位Y5C
          P2 &= 0x1F;						// P27~P25清零
        //XBYTE[0x8000] = 0xFF;				// MM模式(J13-2和J13-1相連)
        //XBYTE[0xA000] = 0;
        }
        // LED顯示
        void Led_Disp(unsigned char ucLed)
        { // IO模式(J13-2和J13-3相連)
          P0 = ~ucLed;                      //unsigned char
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
        //XBYTE[0x8000] = ~ucLed;			// MM模式(J13-2和J13-1相連)
        }
        // 延時函數(最小約1ms@12MHz)
        void Delay(unsigned int num)
        {
          unsigned int i;
          while(num--)
            for(i=0; i<628; i++);
        }
        // 主函數
        void main(void)
        {
          unsigned char i, j;
        
          Cls_Peripheral();
        
          while(1)
          { // 4個亮度等級
            for(i=0; i<4; i++)
              for(j=0; j<100; j++)
              {
                Led_Disp(0xff);
                Delay(i+1);
                Led_Disp(0);
                Delay(4-i);
              }
          }
        }
        
        

        第一段:關閉外設。
        因為C51單片機默認P口為高電平,所以LED和蜂鳴器等等在程序運行前就會工作。具體原理看這個@我的頭絕不是面團捏的——藍橋杯單片機比賽系列1初探關閉外設。
        代碼就直接放這了:

        // 關閉外設
        void Cls_Peripheral(void)
        { // IO模式(J13-2和J13-3相連)
          P0 = 0xFF;
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
          P0 = 0;
          P2 = P2 & 0x1F | 0xA0;			// P27~P25清零,再定位Y5C
          P2 &= 0x1F;						// P27~P25清零
        //XBYTE[0x8000] = 0xFF;				// MM模式(J13-2和J13-1相連)
        //XBYTE[0xA000] = 0;
        }
        

        (注:這個IO模式還是不懂誒,懂了我再填上,先放個參考博客——liu_endong——51單片機——IO口工作模式及配置)

        第二段:LED顯示

        // LED顯示
        void Led_Disp(unsigned char ucLed)
        { // IO模式(J13-2和J13-3相連)
          P0 = ~ucLed;                      //unsigned char
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
        //XBYTE[0x8000] = ~ucLed;			// MM模式(J13-2和J13-1相連)
        }
        

        先設置P0口,選擇要點亮的燈的編碼 ucled ,再選中Y4導通鎖存器,在LED點亮后再鎖存。

        第三段:延時函數

        // 延時函數(最小約1ms@12MHz)
        void Delay(unsigned int num)
        {
          unsigned int i;
          while(num--)
            for(i=0; i<628; i++);
        }
        

        這個就不用說了吧,應該都懂。

        第四段:主函數

        void main(void)
        {
          unsigned char i, j; //設置無符號char型參數  i,j.
        
          Cls_Peripheral();   //關閉外設
        
          while(1)            //循環
          { // 4個亮度等級
            for(i=0; i<4; i++)
              for(j=0; j<100; j++)
              {
                Led_Disp(0xff);//1111 1111,全滅
                Delay(i+1);    //設置延遲時間
                Led_Disp(0);   //0000 0000  全亮
                Delay(4-i);    //
              }
          }
        }
        

        呼吸燈其實就是以不同的亮度點亮led燈,關鍵就在于如何以不同的亮度來點亮led燈,也就是改變led燈的亮度。簡單的方法就是在肉眼觀察不到的時間范圍內,改變led點亮時間的占比,從而形成不同亮度的視覺效果。

        // 4個亮度等級
        for(i=0; i<4; i++)
              for(j=0; j<100; j++)
              {
                Led_Disp(0xff);//1111 1111,全滅
                Delay(i+1);    //設置延遲時間
                Led_Disp(0);   //0000 0000  全亮
                Delay(4-i);    //
              }
        

        兩個循環,第一個循環和Delay函數一起用來設置亮與滅的時間,從而設置燈的亮度等級。第二個循環則設置每一個亮度等級的運行時間。
        第二個循環內的內容,是將亮與滅的時間分為四份,按照不同搭配組合調節燈的亮度。

        跑馬燈代碼

        來源:@圖靈小跟班——1.51單片機_關于LED點亮/閃爍/跑馬燈/呼吸燈_零基礎_基于某單片機A6。

        #include<reg51.h>
        #include<intrins.h>	//該庫里面有關于左右移函數
        #define  led P0
        
        typedef unsigned int u16;
        typedef unsigned char u8;
        
        
        void delay(u16 i)
        {
        	while(i--);
        }
        
        void main()	//方式1
        {
        	u8 i;
        	led = ~0x01;//取反   0000 0001
        	delay(50000);
        	while(1)
        	{
        		for(i=0; i<8; i++)//左移使得LED從左往右亮
        		{
        			led = ~(0x01<<i);  //0000 0001
        			delay(50000);
        		}
        
        		for(i=0; i<8; i++)//右移使得LED從右往左亮
        		{
        			led = ~(0x80>>i);  //1000 0000
        			delay(50000);
        		}
        	}
        }
        		
        /***************方式2*****************************/
         /*
        void main()
        {
        	u8 i;
        	led = ~0x01;
        	delay(50000);
        	while(1)
        	{
        		for(i=0; i<7; i++)		 //for的模板:for(1賦值/運算;2需要滿足的條件;3運算)
        		{						 			 //	{語句;}
        			led=_crol_(led,1);	 
        			delay(50000);
        		}						 	//一開始先進行1,然后2,然后3,然后2……直到不滿足條件2時退出
        
        		for(i=0; i<7; i++)
        		{
        			led=_cror_(led,1);
        			delay(50000);
        		}
        
        	}
        }  */
        
        
        cs
      英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 PHP中16個高危函數 PHP讀取word文檔的方法分析 匯編語言和c語言的區別有哪些 怎么判斷流量波動?網站流量日記法介紹 這些網站優化常見問題站長必知 C# 顯示、隱藏窗口對應的任務欄 PyCharm插件開發實踐之PyGetterAndSetter詳解 基于IntelliJ IDEA/Android Studio插件開發指南(推薦) 解決啟用 Spring-Cloud-OpenFeign 配置可刷新項目無法啟動的問題 深入淺析Go中三個點(...)用法 VeriSign要求注冊商對Com域名資料進行審查 聊聊golang怎么調用php7 新鮮出爐的Go面試題(百度和米哈游) php8的注解你了解多少? 網站SEO優化選擇關鍵詞的5大注意事項 seo引流技巧:思維與實操層面上的內容+渠道方是推廣優化的主導 使用spring框架實現數據庫事務處理方式 SpringBoot默認使用HikariDataSource數據源方式 spring boot中配置hikari連接池屬性方式 Feign 使用HttpClient和OkHttp方式
      成本人片无码中文字幕免费

      1. <span id="4x4v6"></span>

        1. <button id="4x4v6"><acronym id="4x4v6"></acronym></button>

          <tbody id="4x4v6"></tbody>

          <dd id="4x4v6"><pre id="4x4v6"></pre></dd>