久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 80487|回復: 5
收起左側

單片機LED流水燈實驗及流程圖源代碼詳解

  [復制鏈接]
ID:559093 發表于 2019-6-12 08:26 | 顯示全部樓層 |閱讀模式
利用實驗室提供的單片機實驗開發板的最小系統電路模塊、流水燈電路模塊,以及Protues仿真軟件搭建電路,實現I/O口循環流水燈演示效果。
LED流水燈控制電路如圖2-1所示,八個LED燈D0-D7(可選擇LED-RED)陽極接到+5V,陰極通過300歐姆電阻分別接到單片機的P1.0-P1.7八個IO口上。I/O口循環流水燈效果實現流程如圖2-2所示,依次從第一盞燈開始,分別點亮每一盞燈,中間調用延時子函數便可使得流水燈的效果清晰可見。點亮LED燈的具體實現方法與上節相同,只需讓相應的IO口輸出低電平即可,程序實現代碼已給出。按照上節給出的項目開發流程,從仿真電路搭建到程序編寫,再到仿真調試以及最后的實物調試完成循環流水燈的實現。
電路硬件連接圖

圖2-1 流水燈控制電路圖

程序流程圖
0.png

圖2-2 程序流程圖
實驗程序
#include "reg52.h"
void Delay(void)                                                        //延時子函數
{
              int i,j;
              for(i=0;i<1000;i++)
              for(j=0;j<100;j++)
              ;
}                                                                                                
void main(void)
{
              while(1)
              {
                            P1 = 0xfe;                                          //點亮第一盞燈
                            Delay();                                                        //延時
                            P1 = 0xfd;                                          //點亮第二盞燈
                            Delay();                                                        //延時
                            P1 = 0xfb;
                            Delay();
                            P1 = 0xf7;
                            Delay();
                            P1 = 0xef;
                            Delay();
                            P1 = 0xdf;
                            Delay();
                            P1 = 0xbf;
                            Delay();
                            P1 = 0x7f;
                            Delay();
              }
}
四、實驗內容及步驟:
1、采用移位的方式實現循環流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運行通過后,上傳至單片機系統進行觀察。
#include "reg52.h"
char temp = 0x01;                                                        //定義一個字符變量
void Delay(void)
{
              int i,j;
              for(i=0;i<1000;i++)
              for(j=0;j<100;j++)
              ;
}                                                                                                  //延時子函數
void main(void)
{
              while(1)
              {
                            P1 = ~temp;                                          //變量temp的值按位取反后賦給P1
                            temp = temp << 1;                            //變量temp左移1位
                            if(temp == 0)                                          //判斷變量temp的值是否為“0”
                            temp = 0x01;                                          //若temp的值為“0”,將其賦值為“0x01”
                            Delay();                                                        //調用延時函數
              }
}
【說明】觀察主函數死循環while(1)中的語句,其中temp初始值為0x01,對應二進制位00000001,“~”表示對temp進行按位取反,取反后結果為11111110,再將該結果賦給P1后,此時P1的值為11111110,即點亮P1.0口對應的LED燈。第二行代碼表示將temp的值也就是00000001左移1位,最右邊(也就是最低位)補“0”,左移后結果為00000010,并將其賦給temp,此時temp的值為00000010。第三行判斷temp是否為“0”,可以看出,此時temp并不等于“0”,不執行if后的賦值語句,直接執行Delay函數。延時一段時間后,又回到死循環中的第一條語句,將temp按位取反后,結果為11111101,賦值給P1,此時點亮P1.1口對應的LED燈。程序一直循環該流程,當temp=10000000時,再執行第二行語句,左移后,temp=00000000,此時條件“temp == 0”成立,將執行if后的賦值語句,將temp重新賦值為0x01,程序繼續循環執行,實現流水燈功能。
2、采用循環移位指令實現循環流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運行通過后,上傳至單片機系統進行觀察。
#include "reg52.h"
#include "intrins.h"                                                                      //包含本征庫函數
char temp = 0x01;                                                                      //定義一個字符變量
void Delay(void)                                                                        //延時子函數
{
              int i,j;
              for(i=0;i<1000;i++)
              for(j=0;j<100;j++)
              ;
}                                                                                                
void main(void)
{
              while(1)
              {
                            P1 = ~temp;                                                                      //變量temp的值按位取反后賦給P1
                            temp = _crol_(temp,1);                                          //變量temp左移1位
                            Delay();                                                                                    //調用延時函數
              }
}
【提高】根據上述流水燈循環方式(D0-D7循環)的程序,嘗試編寫程序實現雙向循環流水燈(D0-D7-D0-D7……)。
編程實現D0-D7的變速循環流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運行通過后,上傳至單片機系統進行觀察。
#include "reg52.h"
#include "intrins.h"
char temp = 0x01;                                                                      //定義一個字符變量
int time = 1000;                                                                      //定義一個整形變量
void Delay(int T)                                                                      //延時子函數,延時時間與T值成比例
{
              int i,j;
              for(i=0;i<T;i++)
              for(j=0;j<100;j++)
              ;
}                                                                                                
void main(void)
{
              while(1)
              {
                            P1 = ~temp;                                                        //變量temp的值按位取反后賦給P1
                            temp = _crol_(temp,1);                            //變量temp左移1位
                            if(temp == 0x01)                                          //判斷變量temp的值是否為“0x01”
                            {
                                          time = time - 200;                            //延時時間遞減200
                                          if(time < 100)                                          //判斷延時時間是否小于100
                                          time = 1000;                                          //若延時時間小于100,將其重新賦值為1000
                            }            
                            Delay(time);                                                        //調用延時函數                           
              }
}
【說明】本程序中有兩個不同,首先延時子函數Delay(int T)可通過對T進行賦值(傳入參數值)來改變延時的時間;其次while(1)死循環中在判斷temp值是否為“0x01”中增加了三個語句,其作用是每循環一次流水燈,延時的時間遞減200(若延時時間低于100,將其賦值為1000),實現了變速流水燈的功能。
編程實現用按鍵切換雙樣式流水燈顯示:按一下按鍵,流水燈以樣式1循環;再按一下按鍵,流水燈以樣式2循環,如此反復。
實驗程序如下,編譯程序生成.hex文件,仿真運行通過后,上傳至單片機系統進行觀察。
#include "reg52.h"
#include "intrins.h"
char temp = 0x01;                                                                      //定義字符變量
int Yangshi;                                                                                    //定義整形變量
sbit KEY = P2^0;                                                                      //定義按鍵位變量
void Delay(void)                                                                      //定義延時子函數
{
              int i,j;
              for(i=0;i<1000;i++)
              for(j=0;j<100;j++)
              if(KEY == 0)                                                                      //判斷按鍵是否按下
              {
                            Yangshi++;                                                        //若按下,Yangshi值加1
                            while(!KEY);                                                        //等待按鍵松開
              }
}
void Yangshi1(void)                                                        //定義Yangshi1子函數
{
              P1 = ~temp;                                                                      //變量temp的值按位取反后賦給P1
              temp = _crol_(temp,1);                                          //temp值左移1位
              Delay();                                                                                    //調用延時子函數
}
void Yangshi2(void)                                                        //定義Yangshi2子函數
{
              P1 = ~temp;                                                                      //變量temp的值按位取反后賦給P1
              temp = _cror_(temp,1);                                          //temp值左移1位
              Delay();                                                                                    //調用延時子函數
}                                                                                   
void main(void)
{
              while(1)
              {
                            switch(Yangshi%2)                                          //Yangshi的值對2求余
                            {
                                          case 0:                                                         //若值為0
                                                                      Yangshi1();               //調用Yangshi1子函數
                                                                      break;
                                          case 1:                                                         //若值為1
                                                                      Yangshi2();               //調用Yangshi2子函數
                                                                      break;                                         
                            }            
              }
}

完整的Word格式文檔51黑下載地址:
LED流水燈實驗.docx (51.68 KB, 下載次數: 81)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:496061 發表于 2019-8-12 13:42 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:552117 發表于 2019-9-8 10:16 來自觸屏版 | 顯示全部樓層
感謝大佬
回復

使用道具 舉報

ID:738667 發表于 2020-4-26 17:01 | 顯示全部樓層
大佬求這個程序的原理圖。謝謝
回復

使用道具 舉報

ID:762275 發表于 2020-5-27 10:40 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:748788 發表于 2020-5-28 09:48 | 顯示全部樓層
寫的不錯,由淺入深,展現了編程的魅力與樂趣,尤其適合初學者
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久星辰影院 | 国产乱码久久久 | 啪啪精品| 免费人成在线观看网站 | 免费视频一区 | 在线免费中文字幕 | 国产精品久久久久久久久久久久 | 久久久成人免费视频 | 四虎永久免费影院 | 国产三区四区 | 国产精品久久久久9999鸭 | 久久综合一区 | 亚州影院 | 一级片在线观看 | 伊人成人免费视频 | 国产精品成人一区二区三区 | 亚洲永久字幕 | 四虎成人免费电影 | 久久久久国产一区二区 | 欧美综合国产精品久久丁香 | 四虎影院在线播放 | 精品国产亚洲一区二区三区大结局 | 91社区视频 | 亚洲欧美日本在线 | 成人在线观看网址 | 亚洲精品亚洲人成人网 | 福利视频一区二区 | 成年免费在线观看 | 精品欧美一区二区三区久久久 | 久久福利网站 | 欧美亚洲国语精品一区二区 | 久久久久久久久久久久一区二区 | 美国av毛片| 国产日韩精品一区二区三区 | 久久久精品久久久 | 武道仙尊动漫在线观看 | 国产精品久久久 | 中文字幕乱码亚洲精品一区 | 国产精品视频免费 | 五月婷婷在线视频 | 偷牌自拍|