娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

51單片機實現兩片聯級74HC595多任務并行處理兩路跑馬燈

發布者:科技創新實踐者最新更新時間:2021-11-10 來源: eefocus關鍵字:51單片機  跑馬燈 手機看文章 掃描二維碼
隨時隨地手機看文章

一、使用proteus繪制簡單的電路圖,用于后續仿真

二、編寫程序


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

---- @Project: LED-74HC595

---- @File: main.c

---- @Edit: ZHQ

---- @Version: V1.0

---- @CreationTime: 20200528

---- @ModifiedTime: 20200528

---- @Description: 第一路獨立運行的任務是:第1個至第8個LED燈,先依次逐個亮,再依次逐個滅。

---- 第二路獨立運行的任務是:第9個至第16個LED燈,依次逐個亮燈并且每次只能亮一個燈。第1至第8個LED燈一直滅。

---- 單片機:AT89C52

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

#include "reg52.h"

/*——————宏定義——————*/

#define FOSC 11059200L

#define T1MS (65536-FOSC/12/1000)   /*1ms timer calculation method in 12Tmode*/

 

#define const_time_level_01_08  400  

#define const_time_level_09_16  600   

 

 

/*——————變量函數定義及聲明——————*/

/*定義74HC595*/

sbit Hc595_Sh = P2^3;

sbit Hc595_St = P2^4;

sbit Hc595_Ds = P2^5;

 

unsigned char ucLED1 = 0;   /*代表16個燈的亮滅狀態,0代表滅,1代表亮*/

unsigned char ucLED2 = 0;

unsigned char ucLED3 = 0;

unsigned char ucLED4 = 0;

unsigned char ucLED5 = 0;

unsigned char ucLED6 = 0;

unsigned char ucLED7 = 0;

unsigned char ucLED8 = 0;

unsigned char ucLED9 = 0;

unsigned char ucLED10 = 0;

unsigned char ucLED11 = 0;

unsigned char ucLED12 = 0;

unsigned char ucLED13 = 0;

unsigned char ucLED14 = 0;

unsigned char ucLED15 = 0;

unsigned char ucLED16 = 0;

 

 

unsigned char ucLed_update = 0;  /*刷新變量。每次更改LED燈的狀態都要更新一次。*/

 

unsigned char ucLedStep_01_08 = 0; /*第1個至第8個LED跑馬燈的步驟變量*/

unsigned int  uiTimeCnt_01_08 = 0; /*第1個至第8個LED跑馬燈的統計定時中斷次數的延時計數器*/

 

unsigned char ucLedStep_09_16 = 0; /*第9個至第16個LED跑馬燈的步驟變量*/

unsigned int  uiTimeCnt_09_16 = 0; /*第9個至第16個LED跑馬燈的統計定時中斷次數的延時計數器*/

 

unsigned char ucLedStatus16_09 = 0;   /*代表底層74HC595輸出狀態的中間變量*/

unsigned char ucLedStatus08_01 = 0;   /*代表底層74HC595輸出狀態的中間變量*/

 

/**

* @brief  定時器0初始化函數

* @param  無

* @retval 初始化T0

**/

void Init_T0(void)

{

TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/

TL0 = T1MS;                     /*initial timer0 low byte*/

TH0 = T1MS >> 8;                /*initial timer0 high byte*/

}

/**

* @brief  外圍初始化函數

* @param  無

* @retval 初始化外圍

**/

void Init_Peripheral(void)

{

ET0 = 1;/*允許定時中斷*/

TR0 = 1;/*啟動定時中斷*/

EA = 1;/*開總中斷*/

 

}

 

/**

* @brief  初始化函數

* @param  無

* @retval 初始化單片機

**/

void Init(void)

{

Init_T0();

}

/**

* @brief  延時函數

* @param  無

* @retval 無

**/

void Delay_Long(unsigned int uiDelayLong)

{

   unsigned int i;

   unsigned int j;

   for(i=0;i   {

      for(j=0;j<500;j++)  /*內嵌循環的空指令數量*/

          {

             ; /*一個分號相當于執行一條空語句*/

          }

   }

}

/**

* @brief  延時函數

* @param  無

* @retval 無

**/

void Delay_Short(unsigned int uiDelayShort)

{

   unsigned int i;

   for(i=0;i   {

; /*一個分號相當于執行一條空語句*/

   }

}

 

/**

* @brief  595驅動函數

* @param  無

* @retval * 兩個聯級74HC595的工作過程:

* 每個74HC595內部都有一個8位的寄存器,兩個聯級起來就有兩個寄存器。ST引腳就相當于一個刷新

* 信號引腳,當ST引腳產生一個上升沿信號時,就會把寄存器的數值輸出到74HC595的輸出引腳并且鎖存起來,

* DS是數據引腳,SH是把新數據送入寄存器的時鐘信號。也就是說,SH引腳負責把數據送入到寄存器里,ST引腳

* 負責把寄存器的數據更新輸出到74HC595的輸出引腳上并且鎖存起來。

**/

void HC595_Drive(unsigned char ucLedStatusTemp16_09, unsigned char ucLedStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

Hc595_Sh = 0;

Hc595_St = 0;

ucTempData = ucLedStatusTemp16_09; /*先送高8位*/

for(i = 0; i < 8; i ++)

{

if(ucTempData >= 0x80)

{

Hc595_Ds = 1;

}

else

{

Hc595_Ds = 0;

}

Hc595_Sh = 0; /*SH引腳的上升沿把數據送入寄存器*/

Delay_Short(15); 

Hc595_Sh = 1;

Delay_Short(15);

ucTempData = ucTempData <<1;

}

ucTempData = ucLedStatusTemp08_01; /*再先送低8位*/

for(i = 0; i < 8; i ++)

{

if(ucTempData >= 0x80)

{

Hc595_Ds = 1;

}

else

{

Hc595_Ds = 0;

}

Hc595_Sh = 0; /*SH引腳的上升沿把數據送入寄存器*/

Delay_Short(15); 

Hc595_Sh = 1;

Delay_Short(15);

ucTempData = ucTempData <<1;

}

Hc595_St = 0; /*ST引腳把兩個寄存器的數據更新輸出到74HC595的輸出引腳上并且鎖存起來*/

Delay_Short(15);

Hc595_St = 1;

Delay_Short(15);

Hc595_Sh = 0; /*拉低,抗干擾就增強*/

Hc595_St = 0;

Hc595_Ds = 0;

}

/**

* @brief  LED更新函數

* @param  無

* @retval 

* 把74HC595驅動程序翻譯成類似單片機IO口直接驅動方式的過程。

* 每次更新LED輸出,記得都要把ucLed_update置1表示更新。

**/

void LED_Update()

{

if(ucLed_update == 1)

{

ucLed_update = 0; /*及時清零,讓它產生只更新一次的效果,避免一直更新。*/

if(ucLED1 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x01;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xfe;

}

if(ucLED2 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x02;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xfd;

}

if(ucLED3 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x04;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xfb;

}

if(ucLED4 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x08;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xf7;

}

if(ucLED5 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x10;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xef;

}

if(ucLED6 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x20;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xdf;

}

if(ucLED7 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x40;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0xbf;

}

if(ucLED8 == 1)

{

ucLedStatus08_01 = ucLedStatus08_01 | 0x80;

}

else

{

ucLedStatus08_01 = ucLedStatus08_01 & 0x7f;

}

if(ucLED9 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x01;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xfe;

}

if(ucLED10 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x02;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xfd;

}

if(ucLED11 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x04;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xfb;

}

if(ucLED12 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x08;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xf7;

}

if(ucLED13 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x10;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xef;

}

if(ucLED14 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x20;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xdf;

}

if(ucLED15 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x40;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0xbf;

}

if(ucLED16 == 1)

{

ucLedStatus16_09 = ucLedStatus16_09 | 0x80;

}

else

{

ucLedStatus16_09 = ucLedStatus16_09 & 0x7f;

}

HC595_Drive(ucLedStatus16_09, ucLedStatus08_01);

}

}

/**

* @brief  LED服務函數

* @param  無

* @retval 無

**/

void LED_Flicker_01_08(void)

{

switch(ucLedStep_01_08)

{

case 0:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED1 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 1;

}

break;

case 1:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED2 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 2;

}

break;

case 2:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED3 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 3;

}

break;

case 3:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

 

ucLED4 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 4;

}

break;

case 4:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED5 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 5;

}

break;

case 5:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

 

ucLED6 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 6;

}

break;

case 6:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED7 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 7;

}

break;

case 7:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED8 = 1;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 8;

}

break;

case 8:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED8 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 9;

}

break;

case 9:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED7 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 10;

}

break;

case 10:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED6 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 11;

}

break;

case 11:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED5 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 12;

}

break;

case 12:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED4 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 13;

}

break;

case 13:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED3 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 14;

}

break;

case 14:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED2 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 15;

}

break;

case 15:

if(uiTimeCnt_01_08 >= const_time_level_01_08)

{

uiTimeCnt_01_08 = 0; /*時間計數器清零*/

ucLED1 = 0;

ucLed_update = 1;  /*更新顯示*/

ucLedStep_01_08 = 0;

}

break;

[1] [2]
關鍵字:51單片機  跑馬燈 引用地址:51單片機實現兩片聯級74HC595多任務并行處理兩路跑馬燈

上一篇:51單片機實現兩片聯級74HC595控制跑馬燈
下一篇:51單片機實現兩片聯級74HC595依次點亮且每次只能點亮一個

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 玛沁县| 鸡泽县| 神池县| 察哈| 荔浦县| 东兰县| 鸡泽县| 镇沅| 内丘县| 松原市| 新安县| 内乡县| 汨罗市| 镇平县| 蓬莱市| 漳浦县| 林口县| 陵川县| 社会| 循化| 湟源县| 富宁县| 日土县| 巴塘县| 利津县| 青浦区| 沿河| 华阴市| 自治县| 江津市| 阿拉善左旗| 嘉荫县| 陆良县| 太仆寺旗| 游戏| 曲阜市| 石楼县| 江达县| 获嘉县| 富川| 新化县|