欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)LED流水燈實(shí)驗(yàn)及流程圖源代碼詳解
[打印本頁(yè)]
作者:
mp6
時(shí)間:
2019-6-12 08:26
標(biāo)題:
單片機(jī)LED流水燈實(shí)驗(yàn)及流程圖源代碼詳解
利用實(shí)驗(yàn)室提供的單片機(jī)實(shí)驗(yàn)開發(fā)板的最小系統(tǒng)電路模塊、流水燈電路模塊,以及Protues仿真軟件搭建電路,實(shí)現(xiàn)I/O口循環(huán)流水燈演示效果。
LED流水燈控制電路如圖2-1所示,八個(gè)LED燈D0-D7(可選擇LED-RED)陽(yáng)極接到+5V,陰極通過(guò)300歐姆電阻分別接到單片機(jī)的P1.0-P1.7八個(gè)IO口上。I/O口循環(huán)流水燈效果實(shí)現(xiàn)流程如圖2-2所示,依次從第一盞燈開始,分別點(diǎn)亮每一盞燈,中間調(diào)用延時(shí)子函數(shù)便可使得流水燈的效果清晰可見。點(diǎn)亮LED燈的具體實(shí)現(xiàn)方法與上節(jié)相同,只需讓相應(yīng)的IO口輸出低電平即可,程序?qū)崿F(xiàn)代碼已給出。按照上節(jié)給出的項(xiàng)目開發(fā)流程,從仿真電路搭建到程序編寫,再到仿真調(diào)試以及最后的實(shí)物調(diào)試完成循環(huán)流水燈的實(shí)現(xiàn)。
電路硬件連接圖
圖2-1 流水燈控制電路圖
程序流程圖
0.png
(15.92 KB, 下載次數(shù): 137)
下載附件
2019-6-12 17:44 上傳
圖2-2 程序流程圖
實(shí)驗(yàn)程序
#include "reg52.h"
void Delay(void) //延時(shí)子函數(shù)
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<100;j++)
;
}
void main(void)
{
while(1)
{
P1 = 0xfe; //點(diǎn)亮第一盞燈
Delay(); //延時(shí)
P1 = 0xfd; //點(diǎn)亮第二盞燈
Delay(); //延時(shí)
P1 = 0xfb;
Delay();
P1 = 0xf7;
Delay();
P1 = 0xef;
Delay();
P1 = 0xdf;
Delay();
P1 = 0xbf;
Delay();
P1 = 0x7f;
Delay();
}
}
四、實(shí)驗(yàn)內(nèi)容及步驟:
1、采用移位的方式實(shí)現(xiàn)循環(huán)流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運(yùn)行通過(guò)后,上傳至單片機(jī)系統(tǒng)進(jìn)行觀察。
#include "reg52.h"
char temp = 0x01; //定義一個(gè)字符變量
void Delay(void)
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<100;j++)
;
} //延時(shí)子函數(shù)
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(); //調(diào)用延時(shí)函數(shù)
}
}
【說(shuō)明】觀察主函數(shù)死循環(huán)while(1)中的語(yǔ)句,其中temp初始值為0x01,對(duì)應(yīng)二進(jìn)制位00000001,“~”表示對(duì)temp進(jìn)行按位取反,取反后結(jié)果為11111110,再將該結(jié)果賦給P1后,此時(shí)P1的值為11111110,即點(diǎn)亮P1.0口對(duì)應(yīng)的LED燈。第二行代碼表示將temp的值也就是00000001左移1位,最右邊(也就是最低位)補(bǔ)“0”,左移后結(jié)果為00000010,并將其賦給temp,此時(shí)temp的值為00000010。第三行判斷temp是否為“0”,可以看出,此時(shí)temp并不等于“0”,不執(zhí)行if后的賦值語(yǔ)句,直接執(zhí)行Delay函數(shù)。延時(shí)一段時(shí)間后,又回到死循環(huán)中的第一條語(yǔ)句,將temp按位取反后,結(jié)果為11111101,賦值給P1,此時(shí)點(diǎn)亮P1.1口對(duì)應(yīng)的LED燈。程序一直循環(huán)該流程,當(dāng)temp=10000000時(shí),再執(zhí)行第二行語(yǔ)句,左移后,temp=00000000,此時(shí)條件“temp == 0”成立,將執(zhí)行if后的賦值語(yǔ)句,將temp重新賦值為0x01,程序繼續(xù)循環(huán)執(zhí)行,實(shí)現(xiàn)流水燈功能。
2、采用循環(huán)移位指令實(shí)現(xiàn)循環(huán)流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運(yùn)行通過(guò)后,上傳至單片機(jī)系統(tǒng)進(jìn)行觀察。
#include "reg52.h"
#include "intrins.h" //包含本征庫(kù)函數(shù)
char temp = 0x01; //定義一個(gè)字符變量
void Delay(void) //延時(shí)子函數(shù)
{
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(); //調(diào)用延時(shí)函數(shù)
}
}
【提高】根據(jù)上述流水燈循環(huán)方式(D0-D7循環(huán))的程序,嘗試編寫程序?qū)崿F(xiàn)雙向循環(huán)流水燈(D0-D7-D0-D7……)。
編程實(shí)現(xiàn)D0-D7的變速循環(huán)流水燈功能。
將上述LED流水燈的程序更改如下,重新編譯程序生成.hex文件,仿真運(yùn)行通過(guò)后,上傳至單片機(jī)系統(tǒng)進(jìn)行觀察。
#include "reg52.h"
#include "intrins.h"
char temp = 0x01; //定義一個(gè)字符變量
int time = 1000; //定義一個(gè)整形變量
void Delay(int T) //延時(shí)子函數(shù),延時(shí)時(shí)間與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; //延時(shí)時(shí)間遞減200
if(time < 100) //判斷延時(shí)時(shí)間是否小于100
time = 1000; //若延時(shí)時(shí)間小于100,將其重新賦值為1000
}
Delay(time); //調(diào)用延時(shí)函數(shù)
}
}
【說(shuō)明】本程序中有兩個(gè)不同,首先延時(shí)子函數(shù)Delay(int T)可通過(guò)對(duì)T進(jìn)行賦值(傳入?yún)?shù)值)來(lái)改變延時(shí)的時(shí)間;其次while(1)死循環(huán)中在判斷temp值是否為“0x01”中增加了三個(gè)語(yǔ)句,其作用是每循環(huán)一次流水燈,延時(shí)的時(shí)間遞減200(若延時(shí)時(shí)間低于100,將其賦值為1000),實(shí)現(xiàn)了變速流水燈的功能。
編程實(shí)現(xiàn)用按鍵切換雙樣式流水燈顯示:按一下按鍵,流水燈以樣式1循環(huán);再按一下按鍵,流水燈以樣式2循環(huán),如此反復(fù)。
實(shí)驗(yàn)程序如下,編譯程序生成.hex文件,仿真運(yùn)行通過(guò)后,上傳至單片機(jī)系統(tǒng)進(jìn)行觀察。
#include "reg52.h"
#include "intrins.h"
char temp = 0x01; //定義字符變量
int Yangshi; //定義整形變量
sbit KEY = P2^0; //定義按鍵位變量
void Delay(void) //定義延時(shí)子函數(shù)
{
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子函數(shù)
{
P1 = ~temp; //變量temp的值按位取反后賦給P1
temp = _crol_(temp,1); //temp值左移1位
Delay(); //調(diào)用延時(shí)子函數(shù)
}
void Yangshi2(void) //定義Yangshi2子函數(shù)
{
P1 = ~temp; //變量temp的值按位取反后賦給P1
temp = _cror_(temp,1); //temp值左移1位
Delay(); //調(diào)用延時(shí)子函數(shù)
}
void main(void)
{
while(1)
{
switch(Yangshi%2) //Yangshi的值對(duì)2求余
{
case 0: //若值為0
Yangshi1(); //調(diào)用Yangshi1子函數(shù)
break;
case 1: //若值為1
Yangshi2(); //調(diào)用Yangshi2子函數(shù)
break;
}
}
}
完整的Word格式文檔51黑下載地址:
LED流水燈實(shí)驗(yàn).docx
(51.68 KB, 下載次數(shù): 81)
2019-6-12 08:25 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
1035510176
時(shí)間:
2019-8-12 13:42
謝謝分享
作者:
wwmisty
時(shí)間:
2019-9-8 10:16
感謝大佬
作者:
1091928263
時(shí)間:
2020-4-26 17:01
大佬求這個(gè)程序的原理圖。謝謝
作者:
zcd1031
時(shí)間:
2020-5-27 10:40
感謝分享
作者:
wwh2382
時(shí)間:
2020-5-28 09:48
寫的不錯(cuò),由淺入深,展現(xiàn)了編程的魅力與樂(lè)趣,尤其適合初學(xué)者
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1