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

基于51單片機的可調數字時鐘程序

發布者:碼農創想家最新更新時間:2020-12-08 來源: 51hei關鍵字:51單片機  可調數字時鐘  定時器  中斷方式 手機看文章 掃描二維碼
隨時隨地手機看文章

使用51單片機內部定時器中斷方式一計算時間,在LCD1602液晶顯示小時、分鐘、秒,并且可以使用按鍵調整小時和分鐘,每次到整點時整點報時。


代碼如下:


//=============================================================

//功能描述:液晶顯示時鐘,可調時間,準備整點時報時

//MCU:STC89C51,晶振頻率:11.0592MHz

//=============================================================

#include  

#include  

#include  


sbit RS=P2^0;    //寄存器選擇位,將RS位定義為P2.0引腳

sbit RW=P2^1;    //讀寫選擇位,將RW位定義為P2.1引腳

sbit E=P2^2;     //使能信號位,將E位定義為P2.2引腳

sbit BF=P0^7;    //忙碌標志位,,將BF位定義為P0.7引腳

sbit k1=P1^0;    //按鍵調小時加

sbit k2=P1^1;    //按鍵調小時減

sbit k3=P1^2;    //按鍵調分鐘加

sbit k4=P1^3;    //按鍵調分鐘減

sbit beep=P1^4;  //蜂鳴器


unsigned char code digit[ ]={"0123456789"}; //定義字符數組顯示數字

unsigned char code string[ ]={"Weather:Sunny"}; //定義字符數組顯示提示信息

unsigned char count;   //定義變量統計中斷累計次數

unsigned char s,m,h;   //定義變量儲存秒、分鐘和小時

/*==================================================

函數功能:延時

(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒

==================================================*/

void delay1ms()        //@11.0592MHz

{

   unsigned char i,j;        

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

          for(j=0;j<33;j++);                 

}


void delay100ms()                //@11.0592MHz

{

        unsigned char i, j;

        i = 180;

        j = 73;

        do

        {

                while (--j);

        } while (--i);

}


/*==================================================

函數功能:延時若干毫秒

==================================================*/

void delay(unsigned char n)

{

   unsigned char i;

         for(i=0;i         delay1ms();

}


/*==================================================

函數功能:蜂鳴器發出聲音

==================================================*/

void sound(){

         beep=0;

         delay100ms();

         beep=1;

         delay100ms();

}


/*==================================================

函數功能:判斷液晶模塊的忙碌狀態

==================================================*/

unsigned char BusyTest(void)

  {

    bit result;

                RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態

    RW=1;

    E=1;        //E=1,才允許讀寫

    _nop_();   //空操作

    _nop_();

    _nop_();

    _nop_();   //空操作四個機器周期,給硬件反應時間        

    result=BF;  //將忙碌標志電平賦給result

    E=0;         //將E恢復低電平

    return result;

  }

/*==================================================

函數功能:將模式設置指令或顯示地址寫入液晶模塊

==================================================*/

void WriteInstruction (unsigned char dictate)

{   

   while(BusyTest()==1); //如果忙就等待

         RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令

         RW=0;   

         E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,

                          // 就是讓E從0到1發生正跳變,所以應先置"0"

         _nop_();

         _nop_();             //空操作兩個機器周期,給硬件反應時間

         P0=dictate;            //將數據送入P0口,即寫入指令或地址

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四個機器周期,給硬件反應時間

         E=1;                   //E置高電平

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四個機器周期,給硬件反應時間

          E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*==================================================

函數功能:指定字符顯示的實際地址

==================================================*/

void WriteAddress(unsigned char x)

{

     WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"

}

/*==================================================

函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊

==================================================*/

void WriteData(unsigned char y)

{

    while(BusyTest()==1);  

          RS=1;           //RS為高電平,RW為低電平時,可以寫入數據

          RW=0;

          E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,

                       // 就是讓E從0到1發生正跳變,所以應先置"0"

          P0=y;           //將數據送入P0口,即將數據寫入液晶模塊

          _nop_();

          _nop_();

           _nop_();

     _nop_();       //空操作四個機器周期,給硬件反應時間

          E=1;          //E置高電平

          _nop_();

          _nop_();

          _nop_();

          _nop_();        //空操作四個機器周期,給硬件反應時間

          E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*==================================================

函數功能:對LCD的顯示模式進行初始化設置

==================================================*/

void LcdInitiate(void)

{

  delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間

  WriteInstruction(0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口

        delay(5);               //延時5ms ,給硬件一點反應時間

  WriteInstruction(0x38);

        delay(5);

        WriteInstruction(0x38); //連續三次,確保初始化成功

        delay(5);

        WriteInstruction(0x0c);  //顯示模式設置:顯示開,無光標,光標不閃爍

        delay(5);

        WriteInstruction(0x06);  //顯示模式設置:光標右移,字符不移

        delay(5);

        WriteInstruction(0x01);  //清屏幕指令,將以前的顯示內容清除

        delay(5);


}

/*==================================================

函數功能:顯示小時、調整小時時間                          

==================================================*/

void DisplayHour()

{

  unsigned char i,j;

        if(k1==0)           //按鈕k1按下時

                delay(10);        //延時消抖

        if(k1==0)            //判斷k1按下

        {

                while(!k1);         //k1狀態取反

                h++;               //小時數增加

        }

        if(k2==0)            //按鈕k2按下時

                delay(10);         //延時消抖

        if(k2==0)            //判斷k1按下

        {

                while(!k2);        //k2狀態取反

                if(h/10==0&&h%10==0)  //判斷時間是否在24小時上

                {

                h=24;                 //當小時在24小時

                h--;                  //小時數減少為23

                }

                else

                        h--;                //小時數減少

        }

        i=h/10;                //取整運算,求得十位數字

        j=h%10;                //取余運算,求得各位數字

  WriteAddress(0x44);   //寫顯示地址,將十位數字顯示在第2行第5列

        WriteData(digit[i]);  //將十位數字的字符常量寫入LCD

        WriteData(digit[j]);  //將個位數字的字符常量寫入LCD


}

/*==================================================

函數功能:顯示分鐘、調整分鐘時間                           

==================================================*/

void DisplayMinute()

{

  unsigned char i,j;

  i=m/10;                //取整運算,求得十位數字

        j=m%10;                //取余運算,求得各位數字

                if(k3==0)             //按鈕k3按下時

[1] [2]
關鍵字:51單片機  可調數字時鐘  定時器  中斷方式 引用地址:基于51單片機的可調數字時鐘程序

上一篇:基于單片機的帶溫度顯示的電子鐘
下一篇:溫濕度傳感器sht20 STC15單片機驅動程序

推薦閱讀最新更新時間:2025-04-24 22:32

STM32通過中斷方式實現USART1通信
1.前言 這個例程花了我好幾天的時間,涉及到的內容比較多,走了很多彎路,一定要總結一下! 首先說明,我的開發板不是比較流行的正點原子家的,而是普中的STM32F1,原子家的開發板太貴了。到目前為止,我還沒有發現我的開發板出現硬件上的問題,就是客服很不給力,關于仿真器配置的一個小問題就解決不了。好在網上資料比較豐富,慢慢也能解決自己遇到的一些問題。 思路和程序網上大家列舉的都一樣。在上網查資料的過程中發現,ARM開發板就是厲害,我想找什么問題,不管大家用什么型號的開發板,程序幾乎一點都沒有變化,問題討論起來方便多了! 2.程序摘要 分為4部分:GPIO配置、USART參數配置、NVIC總中斷配置、中斷函數; 在主函數中初始
[單片機]
淺談 STM32 硬件I2C的使用 (中斷方式 無DMA 無最高優先級)
引子 STM32的硬件I2C很多人都對它望而卻步。因為很多電工都說,STM32 硬件 I2C有BUG、不穩定、死機等等……最后都使用GPIO模擬I2C。 的確,模擬I2C好用。但是在我看來在一個72M的Cortex-M3的MCU上這樣做非常不妥。一般來說I2C是一種慢速總線,就算工作在400kHz的快速模式上,I2C傳送每個字節仍需要至少23us——還沒有計算地址、起始信號和結束信號的發送。如果使用GPIO模擬的I2C,這23us的CPU時間都在空轉中浪費了,而這23us已經可以做不少的事情了,所以在STM32上I2C還是使用硬件為佳——雖然它多多少少有點缺陷。 這篇文章不是給完全沒有接觸過STM32 硬件I2C的新手看的,看這篇
[單片機]
淺談 STM32 硬件I2C的使用 (<font color='red'>中斷</font><font color='red'>方式</font> 無DMA 無最高優先級)
基于MCS-51單片機使用定時器編寫時鐘程序(匯編)
1、仔細想想還不錯的思路 用定時器寫一個時鐘程序,想想都覺得頭大。撇開其他花里胡哨的功能,先從最基本的時間顯示開始吧,剩下的以后再說。 我們一般希望的是時鐘能不停地計時,在需要的時候調用顯示來顯示當前時間,同時也可以干其他事,所以當然不能用延時來寫,不然這個時鐘除了只能顯示時間之外就是個廢物了。 我們希望每定時到一秒的時候來個中斷,在中斷里使存儲里的時間序列加一秒(時間序列以時分秒各一個字節的方式存儲)。51單片機定時器0方式1的最大定時時間是216=65536μs,也就是大約65ms出頭。但我們可以每50ms來一次中斷,中斷到第20次的時候時間序列加一秒;或者每20ms來一次中斷,到第50次的時候時間序列加一秒。一般來說
[單片機]
基于MCS-<font color='red'>51單片機</font>使用<font color='red'>定時器</font>編寫時鐘程序(匯編)
51單片機T0定時器應用2
1.實驗任務   用AT89S51的定時/計數器T0產生2秒鐘的定時,每當2秒定時到來時,更換指示燈閃爍,每個指示閃爍的頻率為0.2秒,也就是說,開始L1指示燈以0.2秒的速率閃爍,當2秒定時到來之后,L2開始以0.2秒的速率閃爍,如此循環下去。0.2秒的閃爍速率也由定時/計數器T0來完成。 2.電路原理圖 圖4.16.1 3.系統板硬件連線 (1).把“單片機系統”區域中的P1.0-P1.3用導線連接到“八路發光二極管指示模塊”區域中的L1-L4上 4.程序設計內容 (1).由于采用中斷方式來完成,因此,對于中斷源必須它的中斷入口地址,對于定時/計數器T0來說,中斷入口地址為000BH,因此在中斷入口地方加入長跳轉指令來執行中
[單片機]
<font color='red'>51單片機</font>T0<font color='red'>定時器</font>應用2
C51單片機運用定時器T0中斷實現電子時鐘
上面是 電路原理圖 下面是程序源代碼: /***************************************************************************** 功能描述:運用定時器T0實現 電子時鐘 **************************************************************************/ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit p32=P3^2; sbit p33=P
[單片機]
C<font color='red'>51單片機</font>運用<font color='red'>定時器</font>T0<font color='red'>中斷</font>實現電子時鐘
STM32定時器有什么功能?STM32的用法詳解
2.2 計數器模式 TI M2-TIM5可以由向上計數、向下計數、向上向下雙向計數。向上計數模式中,計數器從0計數到自動加載值(TIMx_ARR計數器內容),然后重新從0開始計數并且產生一個計數器溢出事件。 在向下模式中,計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。而中央對齊模式(向上/向下計數)是計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然后向下計數到1并且產生一個計數器溢出事件;然后再從0開始重新計數。 2.3 編程 步驟 1. 配置系統 時鐘 ; 2. 配置NVIC; 3. 配置GPIO; 4. 配置TIMER; 其中
[單片機]
STM32<font color='red'>定時器</font>有什么功能?STM32的用法詳解
STM32CubeMx定時器編碼器模式基本使用方法
前言: 增量式編碼器在實際應用中還是很常見。 stm32的定時器帶的也有編碼器模式。 所用的編碼器是有ABZ三相,其中ab相是用來計數,z相輸出零點信號。 AB相根據旋轉的方向不同,輸出的波形如下圖所示: 第一步:具體配置如下圖: 重點說明: 一、如果編碼模式設置為 Encoder Mode TI1 and TI2 則會默認檢測AB相的上升沿與下降沿; 每一個上升沿和下降沿都觸發計數,所以每轉一格計數器就會+4;那么上圖計數周期設置為400; 也就是編碼器轉100格,計數器就會置零,重新開始計數! 二、關于Polarity參數:這個參數的意思是在檢測到上升沿的時候就觸發encoder捕獲AB相的值,而并不是這里設置的是上
[單片機]
STM32CubeMx<font color='red'>定時器</font>編碼器模式基本使用方法
stm32f103zet6定時器詳解及應用
  1、stm32f103zet6芯片及引腳圖        2、stm32f103xx器件功能與配置      3、stm32f103zet6 定時器   大容量的STM32F103XX增強型系列產品包含最多2個高級控制定時器、4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。   下表比較了高級控制定時器、普通定時器和基本定時器的功能:   定時器功能比較      1)計數器三種計數模式   向上計數模式:從0開始,計到arr預設值,產生溢出事件,返回重新計時   向下計數模式:從arr預設值開始,計到0,產生溢出事件,返回重新計時   中央對齊模式:從0開始向上計數,計到arr產生溢出事件,然后
[單片機]
stm32f103zet6<font color='red'>定時器</font>詳解及應用
小廣播
設計資源 培訓 開發板 精華推薦

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

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

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 云浮市| 洛川县| 分宜县| 泗水县| 云和县| 丰都县| 平原县| 汤阴县| 辰溪县| 南和县| 嘉义市| 株洲市| 泰安市| 广汉市| 丽江市| 台山市| 平山县| 红桥区| 南宫市| 赞皇县| 汝城县| 汝阳县| 太谷县| 兖州市| 尉犁县| 蒙山县| 桃园市| 株洲市| 元氏县| 黄骅市| 中西区| 扎赉特旗| 根河市| 定陶县| 沅江市| 焉耆| 合山市| 北海市| 阿城市| 盐津县| 宣城市|