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

歷史上的今天

今天是:2024年11月09日(星期六)

正在發生

2021年11月09日 | 51單片機實現數碼管中的倒計時程序

發布者:HeavenlyClouds 來源: eefocus關鍵字:51單片機  數碼管  倒計時程序 手機看文章 掃描二維碼
隨時隨地手機看文章

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

二、編寫程序


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

---- @Project: LED-74HC595

---- @File: main.c

---- @Edit: ZHQ

---- @Version: V1.0

---- @CreationTime: 20200607

---- @ModifiedTime: 20200611

---- @Description: 啟動和暫停鍵對應S1鍵,復位鍵對應S5鍵。

---- 按下啟動暫停按鍵時,倒計時開始工作,再按一次啟動暫停按鍵時,

---- 則暫停倒計時。在任何時候,按下復位按鍵,倒計時將暫停工作,

---- 并且恢復倒計時當前默認值99。

---- 單片機:AT89C52

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

#include "reg52.h"

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

#define FOSC 11059200L

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

 

#define const_voice_short 40 /*蜂鳴器短叫的持續時間*/

#define const_voice_long 200 /*蜂鳴器長叫的持續時間*/

 

#define const_key_time1 20 /*按鍵去抖動延時的時間*/

#define const_key_time2 20 /*按鍵去抖動延時的時間*/

 

#define const_dpy_time_half 200 /*數碼管閃爍時間的半值*/

#define const_dpy_time_all 400 /*數碼管閃爍時間的全值 一定要比const_dpy_time_half 大*/

 

/* 

* 如何知道1秒鐘需要多少個定時中斷?

* 這個需要編寫一段小程序測試,得到測試的結果后再按比例修正。

* 步驟:

* 第一步:在程序代碼上先寫入1秒鐘大概需要100個定時中斷。

* 第二步:把程序燒錄進單片機后,上電開始測試,手上同步打開手機里的秒表。

*         如果單片機倒計時跑完了99秒,而手機上的秒表才走了156秒。

* 第三步:那么最終得出1秒鐘需要的定時中斷次數是:const_1s=(100*99)/156=64

*/

 

#define const_1s  64 /*大概一秒鐘所需要的定時中斷次數*/

 

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

/*定義數碼管的74HC595*/

sbit Dig_Hc595_Sh = P2^0;

sbit Dig_Hc595_St = P2^1;

sbit Dig_Hc595_Ds = P2^2;

 

/*定義蜂鳴器*/

sbit Beep = P2^7;

 

/*作為中途暫停指示燈 亮的時候表示中途暫停*/

sbit LED = P3^5;

 

/*定義按鍵*/

sbit Key_S1 = P0^0; /*對應S1*/

sbit Key_S2 = P0^1; /*對應S5*/

 

sbit Key_GND = P0^4; /*模擬獨立按鍵的地GND,因此必須一直輸出低電平*/

 

unsigned char ucKeySec = 0; /*被觸發的按鍵編號*/

unsigned int uiKeyTimeCnt1 = 0; /*按鍵去抖動延時計數器*/

unsigned char ucKeyLock1 = 0; /*按鍵觸發后自鎖的變量標志*/

unsigned int uiKeyTimeCnt2 = 0; /*按鍵去抖動延時計數器*/

unsigned char ucKeyLock2 = 0; /*按鍵觸發后自鎖的變量標志*/

 

unsigned char ucDigShow8;   /*第8位數碼管要顯示的內容*/

unsigned char ucDigShow7;   /*第7位數碼管要顯示的內容*/

unsigned char ucDigShow6;   /*第6位數碼管要顯示的內容*/

unsigned char ucDigShow5;   /*第5位數碼管要顯示的內容*/

unsigned char ucDigShow4;   /*第4位數碼管要顯示的內容*/

unsigned char ucDigShow3;   /*第3位數碼管要顯示的內容*/

unsigned char ucDigShow2;   /*第2位數碼管要顯示的內容*/

unsigned char ucDigShow1;   /*第1位數碼管要顯示的內容*/

 

unsigned char ucDigDot8;   /*數碼管8的小數點是否顯示的標志*/

unsigned char ucDigDot7;   /*數碼管7的小數點是否顯示的標志*/

unsigned char ucDigDot6;   /*數碼管6的小數點是否顯示的標志*/

unsigned char ucDigDot5;   /*數碼管5的小數點是否顯示的標志*/

unsigned char ucDigDot4;   /*數碼管4的小數點是否顯示的標志*/

unsigned char ucDigDot3;   /*數碼管3的小數點是否顯示的標志*/

unsigned char ucDigDot2;   /*數碼管2的小數點是否顯示的標志*/

unsigned char ucDigDot1;   /*數碼管1的小數點是否顯示的標志*/

 

unsigned char ucDigShowTemp = 0; /*臨時中間變量*/

unsigned char ucDisplayDriveStep = 1; /*動態掃描數碼管的步驟變量*/

 

unsigned char ucWd1Update = 1; /*窗口1更新顯示標志*/

unsigned char ucWd = 1; /*本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。*/

 

unsigned char ucCountDown = 99; /*倒計時的當前值*/

unsigned char ucStartFlag = 0; /*暫停與啟動的標志位*/

unsigned int uiTimeCnt = 0; /*倒計時的時間計時器*/

 

unsigned char ucTemp1 = 0; /*中間過渡變量*/

unsigned char ucTemp2 = 0; /*中間過渡變量*/

unsigned char ucTemp3 = 0; /*中間過渡變量*/

unsigned char ucTemp4 = 0; /*中間過渡變量*/

unsigned char ucTemp5 = 0; /*中間過渡變量*/

unsigned char ucTemp6 = 0; /*中間過渡變量*/

unsigned char ucTemp7 = 0; /*中間過渡變量*/

unsigned char ucTemp8 = 0; /*中間過渡變量*/

 

unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續時間計數器*/

 

void Dig_Hc595_Drive(unsigned char, unsigned char);

 

/*根據原理圖得出的共陰數碼管字模表*/

code unsigned char Dig_Table[] =

{

0x3f,  /*0       序號0*/

0x06,  /*1       序號1*/

0x5b,  /*2       序號2*/

0x4f,  /*3       序號3*/

0x66,  /*4       序號4*/

0x6d,  /*5       序號5*/

0x7d,  /*6       序號6*/

0x07,  /*7       序號7*/

0x7f,  /*8       序號8*/

0x6f,  /*9       序號9*/

0x00,  /*不顯示  序號10*/

0x40,  /*-    序號11*/

0x73,  /*P       序號12*/

};

 

/**

* @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)

{

ucDigDot8 = 0;  

ucDigDot7 = 0; 

ucDigDot6 = 0; 

ucDigDot5 = 0;   

ucDigDot4 = 0;

ucDigDot3 = 0;   

ucDigDot2 = 0;  

ucDigDot1 = 0; 

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

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

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

}

 

/**

* @brief  初始化函數

* @param  無

* @retval 初始化單片機

**/

void Init(void)

{

LED = 0;

Beep = 1;

Key_GND = 0;

Dig_Hc595_Drive(0x00, 0x00); /*關閉所有經過另外兩個74HC595驅動的LED燈*/

 

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  顯示數碼管字模的驅動函數

* @param  無

* @retval 動態驅動數碼管的原理

* 在八位數碼管中,在任何一個瞬間,每次只顯示其中一位數碼管,另外的七個數碼管

* 通過設置其公共位com為高電平來關閉顯示,只要切換畫面的速度足夠快,人的視覺就分辨不出來,感覺八個數碼管

* 是同時亮的。以下dig_hc595_drive(xx,yy)函數,其中第一個形參xx是驅動數碼管段seg的引腳,第二個形參yy是驅動

* 數碼管公共位com的引腳。

**/

void Display_Drive(void)

{

switch(ucDisplayDriveStep)

{

case 1: /*顯示第1位*/

ucDigShowTemp = Dig_Table[ucDigShow1];

if(ucDigDot1 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xfe);

break;

case 2: /*顯示第2位*/

ucDigShowTemp = Dig_Table[ucDigShow2];

if(ucDigDot2 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xfd);

break;

case 3: /*顯示第3位*/

ucDigShowTemp = Dig_Table[ucDigShow3];

if(ucDigDot3 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xfb);

break;

case 4: /*顯示第4位*/

ucDigShowTemp = Dig_Table[ucDigShow4];

if(ucDigDot4 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xf7);

break;

case 5: /*顯示第5位*/

ucDigShowTemp = Dig_Table[ucDigShow5];

if(ucDigDot5 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xef);

break;

case 6: /*顯示第6位*/

ucDigShowTemp = Dig_Table[ucDigShow6];

if(ucDigDot6 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xdf);

break;

case 7: /*顯示第7位*/

ucDigShowTemp = Dig_Table[ucDigShow7];

if(ucDigDot7 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0xbf);

break;

case 8: /*顯示第8位*/

ucDigShowTemp = Dig_Table[ucDigShow8];

if(ucDigDot8 == 1)

{

ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/

}

Dig_Hc595_Drive(ucDigShowTemp, 0x7f);

break;

}

ucDisplayDriveStep ++; /*逐位顯示*/

if(ucDisplayDriveStep > 8) /*掃描完8個數碼管后,重新從第一個開始掃描*/

{

ucDisplayDriveStep = 1;

}

}

/**

* @brief  數碼管的595驅動函數

* @param  無

* @retval 

* 如果直接是單片機的IO口引腳驅動的數碼管,由于驅動的速度太快,此處應該適當增加一點delay延時或者

* 用計數延時的方式來延時,目的是在八位數碼管中切換到每位數碼管顯示的時候,都能停留一會再切換到其它

* 位的數碼管界面,這樣可以增加顯示的效果。但是,由于是間接經過74HC595驅動數碼管的,

* 在單片機驅動74HC595的時候,dig_hc595_drive函數本身內部需要執行很多指令,已經相當于delay延時了,

* 因此這里不再需要加delay延時函數或者計數延時。

**/

void Dig_HC595_Drive(unsigned char ucDigStatusTemp16_09, unsigned char ucDigStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

Dig_Hc595_Sh = 0;

Dig_Hc595_St = 0;

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

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

{

if(ucTempData >= 0x80)

{

Dig_Hc595_Ds = 1;

}

else

{

Dig_Hc595_Ds = 0;

}

/*注意,此處的延時delay_short必須盡可能小,否則動態掃描數碼管的速度就不夠。*/

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

Delay_Short(1); 

Dig_Hc595_Sh = 1;

Delay_Short(1);

ucTempData = ucTempData <<1;

}

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

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

{

if(ucTempData >= 0x80)

{

Dig_Hc595_Ds = 1;

}

else

{

Dig_Hc595_Ds = 0;

}

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

Delay_Short(1); 

Dig_Hc595_Sh = 1;

Delay_Short(1);

ucTempData = ucTempData <<1;

}

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

Delay_Short(1);

Dig_Hc595_St = 1;

Delay_Short(1);

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

Dig_Hc595_St = 0;

Dig_Hc595_Ds = 0;

}

/**

* @brief  掃描按鍵

* @param  無

* @retval 放在定時中斷里

**/

void Key_Scan(void)

{

if(Key_S1 == 1) /*IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位*/

{

ucKeyLock1 = 0;

uiKeyTimeCnt1 = 0;

}

else if(ucKeyLock1 == 0) /*有按鍵按下,且是第一次被按下*/

{

uiKeyTimeCnt1 ++; /*累加定時中斷次數*/

if(uiKeyTimeCnt1 > const_key_time1)

{

uiKeyTimeCnt1 = 0;

ucKeyLock1 = 1; /*自鎖按鍵置位,避免一直觸發*/

ucKeySec = 1;

}

}

 

if(Key_S2 == 1) /*IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位*/

{

ucKeyLock2 = 0;

uiKeyTimeCnt2 = 0;

}

else if(ucKeyLock2 == 0) /*有按鍵按下,且是第一次被按下*/

{

uiKeyTimeCnt2 ++; /*累加定時中斷次數*/

if(uiKeyTimeCnt2 > const_key_time2)

{

uiKeyTimeCnt2 = 0;

ucKeyLock2 = 1; /*自鎖按鍵置位,避免一直觸發*/

ucKeySec = 2;

}

}

}

/**

* @brief  按鍵服務的應用程序

* @param  無

* @retval 無

**/

void Key_Service(void)

{

switch(ucKeySec) /*啟動和暫停按鍵*/

{

case 1: /*加按鍵,對應S1*/

switch(ucWd) /*在不同的窗口下,設置不同的參數*/

{

case 1:

ucStartFlag = !ucStartFlag;

break;

}

uiVoiceCnt = const_voice_short; /*按鍵聲音觸發,滴一聲就停。*/

[1] [2]
關鍵字:51單片機  數碼管  倒計時程序 引用地址:51單片機實現數碼管中的倒計時程序

上一篇:51單片機實現能設置速度檔位的數碼管倒計時程序
下一篇:51單片機實現數碼管通過一二級菜單來設置數據的綜合程序

推薦閱讀

11月8日,京東物流公布數據顯示,今年11.11全球好物節期間,京東全國規模最大的機器人倉群已經投入使用,不同層級的無人倉數量達到50個,分布在北京、上海、武漢、深圳、廣州等全國多地。同時,16座大型智能化物流中心“亞洲一號”將繼續發揮運營能力。另外,京東物流全球首個100%由配送機器人組成的智能配送旗艦站已在長沙投入試運營,截至目前,覆蓋...
  用于工業流量測量方面的儀表設備種類多樣,在工業儀表的使用中,因為使用場合環境的不同而選擇使用不同的儀表設備也可以說是而今選擇儀表使用的一種形式,而對于各類相似但卻不一的儀表,用戶在使用中難免會出現選擇錯誤,一下就介紹渦街與渦輪流量計的比較,以方便我們后期的選擇。  渦街流量計:  渦街流量計是根據卡門渦街原理設計制造的。應用...
蘋果公司于 2020 年 3 月提交了一份關于車載激光雷達設備的專利申請,該設備設計用于安裝在車輛擋風玻璃后面,可為自動駕駛汽車提供實時 3D 視覺。 1. 把激光雷達裝上手機在今年蘋果發布會上,iPhone 12 正式面世。與基本機型相比,iPhone 12 Pro 和 iPhone 12 Pro Max 的后置攝像頭除了多一枚長焦鏡頭,還增加了一顆 LiDAR。 蘋果搭...
??? 磁敏傳感器是將磁場信息轉換成各種有用信號的裝置。它是各種測磁儀器的核心。為了檢測并利用磁碭,人們研制了各種測磁儀器。到目前為止,已形成了十多種常用的測磁方法,研制和生產出了幾十個大類上百種測磁儀器。??一般的測磁儀器都是由磁敏元件、轉換器、信號處理電路和讀出電路組成。儀器的基本性能(例如靈敏度、動態范圍、精確度),主要由它...

史海拾趣

問答坊 | AI 解惑

單片機C語言集錦

收集的單片機C語言編程集錦,與大家共享!喜歡的頂下吧!…

查看全部問答∨

Intel Atom系統顯示驅動4.0版

本帖最后由 paulhyde 于 2014-9-15 08:56 編輯 Intel Atom系統顯示驅動4.0版 和Atom處理器配套是945GC+ICH7芯片組,雖然945GC 的原型945G系列的顯示驅動已經不再更新,不過intel 對945GC 卻是關愛有加,專門為其開發有專用驅動,而且還保持 ...…

查看全部問答∨

wince下usb轉串口問題

小弟最近在做wince上面的usb轉串口驅動,用的是public下面的usbser,編譯到系統里面后能識別usb轉串口的線了,并模擬為串口1,但是操作的時候用一款usb轉串口線只能收,發不出來,用另外一款收發都有數但是數不對現象就像是串口速率不一樣,但是這 ...…

查看全部問答∨

請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口?

請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口? 請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口? 還有如何提取內置在筆記本中的EASYPORT的驅動? 謝謝!13956302025  heroxgy@163.com&n ...…

查看全部問答∨

mobile sdarm

各位同仁,大家好. 首先我向各位同仁表示歉意,在此留下廣告信息. 我公司是韓國FIDELIX半導體. www.fidelix.co.kr 我公司的主要產品是PSRAM,MOBILE SDRAM,MOBILE DDR(KGD/BGA) 哪位同仁有相 ...…

查看全部問答∨

請教一下:關于GPIO的,

本帖最后由 dontium 于 2015-1-23 13:38 編輯 這是我的程序: #include \\"DSP28_Device.h\\" #include \\"DSP28_Globalprototypes.h\\" // Prototype statements for functions found within this file. // interrupt void ISRTimer2( ...…

查看全部問答∨

關于欠壓保護?

SVSCTL|=VLDON; if (SVSCTL&BIT1)//為1時,欠壓 { P2OUT&=~BIT0;//報警 LCDM9=0x20;//顯示“欠壓” } 這樣能實現嗎?剛開啟就判斷是不是判斷不出來啊,有必要加個延時嗎?如果延時沿多長時間呢? 謝謝啊!…

查看全部問答∨

求助!!!!!!!

WDT_MDLY_32 WDT_ADLY_1000 WDT_MRST_32 WDT_ARST_1000 這4個有什么區別? 請各位高手指教!!!!!…

查看全部問答∨

TI公司提供的MSP430C源代碼

初學430的同胞可以看看…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 晋城| 屏南县| 嘉峪关市| 凤庆县| 吉安市| 马关县| 洛南县| 黎川县| 阿图什市| 武汉市| 张掖市| 永嘉县| 阜阳市| 西充县| 平江县| 新和县| 正镶白旗| 宁阳县| 江口县| 读书| 阜宁县| 民权县| 汶川县| 泾源县| 红桥区| 杭锦后旗| 苍山县| 张家界市| 景东| 赤城县| 惠水县| 普兰县| 丰镇市| 汤原县| 宁海县| 特克斯县| 长寿区| 英德市| 湛江市| 沁源县| 遵义市|