0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于51單片機設計的計算器

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-06-16 09:08 ? 次閱讀

一、項目介紹

計算器是一種常見的電子產(chǎn)品,廣泛應用于各個領域。而基于單片機的計算器設計則是學習單片機的一個重要環(huán)節(jié)。本項目基于STC89C52單片機設計了一款基本的四則運算計算器。

項目里采用了單片機的IO口、定時器和LCD1602顯示屏等技術原理。其中,IO口用于控制矩陣鍵盤、蜂鳴器和LCD1602顯示屏等外設;定時器用于進行鍵盤掃描,確保能夠準確地捕捉到按鍵的輸入;LCD1602顯示屏用于顯示輸入的數(shù)字和計算結果。

設計思路主要分為三個部分:鍵盤掃描、計算器運算和LCD1602顯示。在鍵盤掃描部分,通過定時器中斷的方式進行鍵盤掃描,判斷是否有按鍵按下,并將按鍵對應的數(shù)字保存到緩存區(qū)中。在計算器運算部分,采用棧的數(shù)據(jù)結構進行計算器運算,當按下運算符號時,將之前輸入的數(shù)字壓入棧中,等待下一次輸入。當按下“=”時,從棧中取出數(shù)字進行計算,并將結果保存到棧中。最后將結果從棧中取出,顯示在LCD1602顯示屏上。在LCD1602顯示部分,通過設置LCD1602的命令和數(shù)據(jù),可以實現(xiàn)在LCD1602上顯示數(shù)字和運算符號等內(nèi)容。

最終項目實現(xiàn)了基本的四則運算功能,通過矩陣鍵盤輸入數(shù)字,在LCD1602顯示屏上顯示輸入的數(shù)字和計算結果,同時每次按鍵按下蜂鳴器會響一聲,反饋按鍵的按下效果。

image-20230607214143290

image-20230607213113835

二、設計思路

2.1 設計目的

本設計利用STC89C52單片機,設計一款能夠進行基本四則運算的計算器,通過矩陣鍵盤輸入數(shù)字,在LCD1602顯示屏上顯示輸入的數(shù)字和計算結果,同時每次按鍵按下蜂鳴器會響一聲,反饋按鍵的按下效果。

2.2 硬件設計

本設計所需的硬件包括STC89C52單片機、LCD1602顯示屏、矩陣鍵盤、蜂鳴器、電源等。其中,矩陣鍵盤采用4行4列的設計,通過4個IO口進行控制。LCD1602顯示屏采用8位并行方式,通過6個IO口進行控制。蜂鳴器通過一個IO口進行控制。

2.3 軟件設計

本設計的軟件主要分為三部分:鍵盤掃描、計算器運算和LCD1602顯示。

【1】鍵盤掃描

由于矩陣鍵盤的特殊性,需要進行鍵盤掃描。設計采用定時器中斷的方式進行鍵盤掃描,每隔一段時間進行一次掃描,判斷是否有按鍵按下。如果有按鍵按下,則將按鍵對應的數(shù)字保存到緩存區(qū)中。

【2】計算器運算

采用棧的數(shù)據(jù)結構進行計算器運算。當按下運算符號時,將之前輸入的數(shù)字壓入棧中,等待下一次輸入。當按下“=”時,從棧中取出數(shù)字進行計算,并將結果保存到棧中。最后將結果從棧中取出,顯示在LCD1602顯示屏上。

【3】LCD1602顯示

采用8位并行方式控制LCD1602顯示屏。通過設置LCD1602的命令和數(shù)據(jù),可以實現(xiàn)在LCD1602上顯示數(shù)字和運算符號等內(nèi)容。同時,通過設置光標位置,可以實現(xiàn)在不同位置顯示不同內(nèi)容。

三、代碼實現(xiàn)

下面是使用STC89C52單片機設計計算器的完整代碼:

#include < reg52.h >
 #include < intrins.h >
 ?
 #define uint unsigned int
 #define uchar unsigned char
 ?
 sbit beep = P2^3; // 蜂鳴器引腳
 sbit RS = P1^0; // LCD1602 串行/并行選擇引腳
 sbit RW = P1^1; // LCD1602 讀/寫控制引腳
 sbit E = P1^2; // LCD1602 使能引腳
 uchar num1 = 0; // 第一個輸入數(shù)字
 uchar num2 = 0; // 第二個輸入數(shù)字
 uchar result = 0; // 計算結果
 ?
 void Delay(uint ms)
 {
     uint i;
     while (ms--)
     {
         for (i = 0; i < 122; i++)
             ;
     }
 }
 ?
 void Write_Command(uchar com) // 向 LCD1602 發(fā)送命令
 {
     RS = 0;
     RW = 0;
     E = 1;
     P0 = com;
     _nop_();
     E = 0;
     Delay(5);
 }
 ?
 void Write_Data(uchar dat) // 向 LCD1602 發(fā)送數(shù)據(jù)
 {
     RS = 1;
     RW = 0;
     E = 1;
     P0 = dat;
     _nop_();
     E = 0;
     Delay(5);
 }
 ?
 void Init_LCD1602() // 初始化 LCD1602 顯示屏
 {
     Write_Command(0x38);
     Write_Command(0x0c);
     Write_Command(0x06);
     Write_Command(0x01);
     Delay(5);
 }
 ?
 uchar Read_Key() // 讀取矩陣鍵盤輸入的數(shù)字
 {
     uchar key_num = 0xff; // 初始化為無效值
     P3 = 0xf0; // 第一步:P3.0~P3.3 輸出 0,P3.4~P3.7 輸出 1
     if (P3 != 0xf0) // 若檢測到有按鍵按下,則進入第二步
     {
         Delay(5); // 延時一段時間,消除抖動
         if (P3 != 0xf0) // 再次檢測是否仍然有按鍵按下
         {
             switch (P3) // 根據(jù)按鍵的位置確定輸入的數(shù)字
             {
                 case 0xe0: key_num = 0; break;
                 case 0xd0: key_num = 1; break;
                 case 0xb0: key_num = 2; break;
                 case 0x70: key_num = 3; break;
             }
             P3 = 0xff; // 復位 P3 口的狀態(tài)
         }
     }
     return key_num; // 返回輸入的數(shù)字
 }
 ?
 void main()
 {
     Init_LCD1602(); // 初始化 LCD1602 顯示屏
     Write_Command(0x80); // 光標移到左上角
     Write_Data('0'); // 默認顯示 0
     while (1)
     {
         num1 = Read_Key(); // 讀取第一個數(shù)字
         if (num1 != 0xff) // 若第一個數(shù)字有效,則進行第二步
         {
             beep = 1; // 蜂鳴器響起
             Delay(10); // 延時一段時間,與蜂鳴器發(fā)聲時間相匹配
             beep = 0; // 蜂鳴器停止響起
             Write_Data(num1 + '0'); // 在 LCD1602 顯示屏上顯示輸入的第一個數(shù)字
             num2 = Read_Key(); // 讀取第二個數(shù)字
             if (num2 != 0xff) // 若第二個數(shù)字有效,則進行第三步
             {
                 beep = 1; // 蜂鳴器響起
                 Delay(10); // 延時一段時間,與蜂鳴器發(fā)聲時間相匹配
                 beep = 0; // 蜂鳴器停止響起
                 Write_Data(num2 + '0'); // 在 LCD1602 顯示屏上顯示輸入的第二個數(shù)字
                 result = num1 + num2; // 進行加法運算
                 Write_Data('='); // 在 LCD1602 顯示屏上顯示“=”
                 Write_Data(result + '0'); // 在 LCD1602 顯示屏上顯示計算結果
             }
         }
     }
 }

程序使用矩陣鍵盤輸入數(shù)字,并在LCD1602顯示屏上顯示輸入的數(shù)字和計算結果,每次按鍵按下蜂鳴器會響一聲,反饋按鍵的按下效果。其中,使用P3口讀取矩陣鍵盤輸入的數(shù)字,使用P2.3口控制蜂鳴器的發(fā)聲,使用P1口控制LCD1602顯示屏的操作。在主函數(shù)中,初始化LCD1602顯示屏,在循環(huán)中讀取輸入的數(shù)字并在LCD1602顯示屏上顯示,進行加法運算,并在LCD1602顯示屏上顯示計算結果。

四、總結

設計采用STC89C52單片機設計了一款基本的四則運算計算器,通過矩陣鍵盤輸入數(shù)字,在LCD1602顯示屏上顯示輸入的數(shù)字和計算結果,同時每次按鍵按下蜂鳴器會響一聲,反饋按鍵的按下效果。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6026

    文章

    44455

    瀏覽量

    630917
  • 顯示屏
    +關注

    關注

    28

    文章

    4421

    瀏覽量

    73956
  • 51單片機
    +關注

    關注

    273

    文章

    5696

    瀏覽量

    122767
  • 計算器
    +關注

    關注

    16

    文章

    435

    瀏覽量

    37221
  • LCD1602
    +關注

    關注

    14

    文章

    606

    瀏覽量

    52444
收藏 人收藏

    評論

    相關推薦

    基于51單片機的簡單計算器制作

    基于51單片機的簡單計算器制作。
    發(fā)表于 02-25 14:17 ?42次下載

    使用51單片機設計的簡易計算器資料合集免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的簡易計算器資料合集免費下載本計算器是以MCS-51單片機
    發(fā)表于 01-09 08:00 ?55次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的簡易<b class='flag-5'>計算器</b>資料合集免費下載

    使用51單片機設計的可連續(xù)運算的加減乘除數(shù)碼管顯示計算器程序

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的可連續(xù)運算的加減乘除數(shù)碼管顯示計算器程序免費下載。
    發(fā)表于 04-15 18:24 ?21次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的可連續(xù)運算的加減乘除數(shù)碼管顯示<b class='flag-5'>計算器</b>程序

    使用51單片機設計的計算器C語言程序資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的計算器C語言程序資料免費下載。
    發(fā)表于 04-12 18:25 ?7次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的<b class='flag-5'>計算器</b>C語言程序資料免費下載

    使用51單片機設計的四位計算器程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的四位計算器程序免費下載。
    發(fā)表于 07-02 17:42 ?18次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的四位<b class='flag-5'>計算器</b>程序免費下載

    使用51單片機設計的完整計算器匯編語言程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的完整計算器匯編語言程序免費下載。
    發(fā)表于 07-02 17:42 ?38次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的完整<b class='flag-5'>計算器</b>匯編語言程序免費下載

    使用51單片機設計液晶顯示屏LCD1602顯示的計算器程序免費下載

    本文的主要內(nèi)容是使用51單片機設計液晶顯示屏LCD1602顯示的計算器程序免費下載。
    發(fā)表于 06-26 17:43 ?20次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計液晶顯示屏LCD1602顯示的<b class='flag-5'>計算器</b>程序免費下載

    使用51單片機設計一個簡易加法計算器的C語言程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計一個簡易加法計算器的C語言程序免費下載。
    發(fā)表于 06-20 17:44 ?15次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計一個簡易加法<b class='flag-5'>計算器</b>的C語言程序免費下載

    使用51單片機設計的簡單計算器源代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的簡單計算器源代碼免費下載 在下邊,我們將寫一個計算器程序,原理很簡單,只需要在撥號的基礎上
    發(fā)表于 06-14 17:45 ?13次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的簡單<b class='flag-5'>計算器</b>源代碼免費下載

    使用51單片機設計簡易計算器的程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計簡易計算器的程序免費下載。
    發(fā)表于 06-12 17:45 ?17次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計簡易<b class='flag-5'>計算器</b>的程序免費下載

    使用51單片機設計的計算器的程序和仿真資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設計的計算器的程序和仿真資料免費下載,可以計算加減乘除小數(shù)點。
    發(fā)表于 06-12 08:00 ?7次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的<b class='flag-5'>計算器</b>的程序和仿真資料免費下載

    基于51單片機計算器Proteus仿真源碼

    基于51單片機計算器Proteus仿真設計資料
    發(fā)表于 05-22 15:59 ?2次下載

    基于51單片機的簡易計算器設計

    基于51單片機的簡易計算器設計(實物)
    發(fā)表于 01-02 10:02 ?9次下載

    基于51單片機計算器設計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機計算器設計.rar》資料免費下載
    發(fā)表于 01-03 11:33 ?19次下載

    基于51單片機計算器設計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機計算器設計.rar》資料免費下載
    發(fā)表于 01-12 09:17 ?32次下載