久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5504|回復: 1
打印 上一主題 下一主題
收起左側

基于51單片機簡易計算器,c程序+proteus仿真+原理圖+PCB圖+簡易文檔

[復制鏈接]
跳轉到指定樓層
樓主
ID:874677 發(fā)表于 2021-1-12 10:51 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機簡易計算器的原理圖如下

基于51單片機簡易計算器的pcb圖如下


任務書如下
一. 設計要求
(一) 基本任務
該簡易計算器設計硬件電路采用三部分電路模塊構成, 第一部分是鍵盤模塊
電路, 采用 4*4 矩陣式鍵盤作為輸入電路; 第二部分是 LCD1602 液晶顯示模塊;
第三部分是以 51 單片機作為控制核心。 軟件程序主要由三部分組成: 主程序、
按鍵掃描程序和 LCD1602 顯示程序。
(二) 性能指標
(1) 用單片機 stc89C51 設計一個簡易計算器, 并用 1602 液晶顯示相應的
數(shù)據(jù)。
(2) 可以進行簡單的加減乘除運算。
(3) 最大可以 9999*9999, 。
(4) 可以通過 proteus 仿真。

附: 可供選用的元件清單
1)1602 液晶
2)排針*16
3)16p 母座
4)STC89C51 單片機
5)40 腳 IC 座
6)10k 電阻*2
7)1.5k 電阻
8)103 排阻
9)10uf 電解電容
10)12M 晶振
11)30pf 電容*2
12)按鍵*17
13)自鎖開關等等
  
Proteus仿真如下


單片機源程序如下:
  1. #include "reg52.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #include "lcd1602.h"
  5. #include "keyboard.h"

  6. #define keydeng                14
  7. #define keyzuoyi  12

  8. code unsigned char KeyDisPlaybuf[16] =
  9. {
  10.     '1', '2', '3', '+',\
  11.     '4', '5', '6', '-',\
  12.     '7', '8', '9', '*',\
  13.     '<', '0', '=', '/'
  14. };

  15. long Count(char *ch, char len)//簡單計算器 僅支持+-*/
  16. {
  17.     unsigned char i = 0;
  18.     char Operation;
  19.     long Num1=0,Num2=0;
  20.     while(i<len && ch[i]!='+' && ch[i]!='-' && ch[i]!='*' && ch[i]!='/')
  21.     {
  22.         Num1*=10;
  23.         Num1+=ch[i]-'0';
  24.         i++;
  25.     }
  26.     Operation=ch[i++];
  27.     while(i<len && ch[i]!='=')
  28.     {
  29.         Num2*=10;
  30.         Num2+=ch[i]-'0';
  31.         i++;
  32.     }
  33.     switch(Operation)
  34.     {
  35.         case'+':return Num1+Num2;
  36.         case'-':return Num1-Num2;
  37.         case'*':return Num1*Num2;
  38.         case'/':return Num1/Num2;
  39.     }
  40.         return 0;
  41. }

  42. void EasyCounter(void)
  43. {
  44.         unsigned char buff[30];
  45.         unsigned char text[30];
  46.         unsigned char key;
  47.         unsigned char i = 0;
  48.         do
  49.   {
  50.                         key = keycan();//讀取鍵值       
  51.                         if(key!=0xff)//鍵值不等于0
  52.                         {
  53.                                 text[i++]=KeyDisPlaybuf[key];//記錄鍵值對應的字符
  54.                                 text[i]='\0';
  55.         LCD_ShowStr(0,0,"                ");
  56.                                 LCD_ShowStr(16-strlen(text),0,text);
  57.                         }
  58.         if(key==keyzuoyi&&i>0)//按下"<"時刪除一位
  59.           i-=2;
  60.         }while(key!=keydeng);//按下'='時結束輸入
  61.         sprintf(buff, "%ld", Count(text, strlen(text)));
  62.   LCD_ShowStr(0,1,"                ");
  63.         LCD_ShowStr(16-strlen(buff),1,buff);
  64. }

  65. void main(void)
  66. {
  67.   LCD_Init();
  68.   while(1)
  69.   {
  70.     EasyCounter();
  71.   }
  72. }
復制代碼
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit LCD_RS= P2^4;
  4. sbit LCD_RW = P2^5;
  5. sbit LCD_E = P2^6;

  6. #define LCD_DATA P0

  7. static void LCD_Delay(unsigned char ms)
  8. {
  9.   unsigned char i;
  10.   while(ms--)
  11.   {
  12.     for(i = 0; i< 250; i++)
  13.     {
  14.       _nop_();
  15.       _nop_();
  16.       _nop_();
  17.       _nop_();
  18.     }
  19.   }
  20. }

  21. bit LCD_Busy()
  22. {
  23.   bit result;
  24.   LCD_RS = 0;
  25.   LCD_RW = 1;
  26.   LCD_E = 1;
  27.   _nop_();
  28.   _nop_();
  29.   _nop_();
  30.   _nop_();
  31.   result = (bit)(LCD_DATA & 0x80);
  32.   LCD_E = 0;
  33.   return result;
  34. }

  35. void LCD_WriteCmd(unsigned char cmd)
  36. {
  37.   while(LCD_Busy());
  38.   LCD_RS = 0;
  39.   LCD_RW = 0;
  40.   LCD_E = 0;
  41.   _nop_();
  42.   _nop_();
  43.   LCD_DATA = cmd;
  44.   _nop_();
  45.   _nop_();
  46.   _nop_();
  47.   _nop_();
  48.   LCD_E = 1;
  49.   _nop_();
  50.   _nop_();
  51.   _nop_();
  52.   _nop_();
  53.   LCD_E = 0;
  54. }

  55. void LCD_Pos(unsigned char row,unsigned char pos)
  56. {
  57.   row &= 0x1;
  58.   pos &= 0xF;
  59.   if (row) pos |= 0x40;
  60.   LCD_WriteCmd(pos | 0x80);
  61. }

  62. void LCD_WriteDat(unsigned char dat)
  63. {
  64.   while(LCD_Busy());
  65.   LCD_RS = 1;
  66.   LCD_RW = 0;
  67.   LCD_E = 0;
  68.   LCD_DATA = dat;
  69.   _nop_();
  70.   _nop_();
  71.   _nop_();
  72.   _nop_();
  73.   LCD_E = 1;
  74.   _nop_();
  75.   _nop_();
  76.   _nop_();
  77.   _nop_();
  78.   LCD_E = 0;
  79. }

  80. void LCD_ShowStr(unsigned char x, unsigned char y, unsigned char *dat)
  81. {
  82.   unsigned char i=0;
  83.   LCD_Pos(y,x);
  84.   while(dat[i] != '\0')
  85.   {
  86.     LCD_WriteDat(dat[i]);
  87.     i++;
  88.   }
  89. }

  90. void LCD_Init(void)
  91. {
  92.   LCD_WriteCmd(0x38);
  93.   LCD_Delay(1);
  94.   LCD_WriteCmd(0x0c);
  95.   LCD_Delay(1);
  96.   LCD_WriteCmd(0x06);
  97.   LCD_Delay(1);
  98.   LCD_WriteCmd(0x01);
  99.   LCD_Delay(1);
  100. }
復制代碼
  1. #include "reg52.h"
  2. #include "keyboard.h"

  3. #define Key   P1

  4. code unsigned char KeyValueL[]={0xf7,0xfb,0xfd,0xfe};
  5. code unsigned char KeyValueH[]={0x70,0xb0,0xd0,0xe0};

  6. void KeyDelay(unsigned char xms)
  7. {
  8.   unsigned char i;
  9.   while(xms--)
  10.   {
  11.     for(i=0; i<120; i++);
  12.   }
  13. }
  14. unsigned char keycan(void)
  15. {
  16.   unsigned char i,j;
  17.   unsigned char tmp;
  18.   Key=0xf0;
  19.   if(Key!=0xf0)
  20.   {
  21.     KeyDelay(10);
  22.     if(Key!=0xf0)
  23.     {
  24.       for(i=0; i<4; i++)
  25.       {
  26.         Key=KeyValueL[i];
  27.         for(j=0; j<4; j++)
  28.         {
  29.           if((Key&0xf0)==KeyValueH[j])
  30.           {
  31.             tmp=i+j*4;
  32.             while(Key!=KeyValueL[i]);
  33.             return tmp;
  34.           }
  35.         }
  36.       }
  37.     }
  38.   }
  39.   return 0xff;
  40. }
復制代碼






所有資料51hei提供下載:
原理圖andPCB圖.zip (9.1 MB, 下載次數(shù): 61) 簡易計算器.doc (676.5 KB, 下載次數(shù): 55) c程序,和仿真.zip (89.59 KB, 下載次數(shù): 79)




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:849787 發(fā)表于 2021-2-1 17:03 | 只看該作者
樓主的那個代碼,關于LCD1602中RS和EN腳的標注是錯位的,移植代碼的時候要注意。功能能正常實現(xiàn),就是對于除法和乘法,不能保留小數(shù)位,感覺實用性就不是很強了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频网 | 免费一级淫片aaa片毛片a级 | 久久精品福利视频 | 欧美va大片 | 国产探花在线精品一区二区 | 成人网址在线观看 | 激情网站在线观看 | www日本在线| 91欧美精品成人综合在线观看 | 四虎影音| www.性色| 国产精品视频一二三区 | 欧美日本一区 | 香蕉视频黄色 | 日韩在线观看网站 | 日韩精品一区二区三区在线观看 | 成人黄色电影在线播放 | av网站在线播放 | 亚洲综合色婷婷 | 91在线精品一区二区 | aaaaaaa片毛片免费观看 | com.色.www在线观看 | 久久久精品久久久 | 亚洲区一区二 | 亚洲午夜电影 | 欧美中文在线 | 欧美日韩亚洲视频 | 日韩在线观看一区 | 精品久久久久一区二区国产 | 在线看一区二区三区 | 国产精品视频999 | www国产成人免费观看视频,深夜成人网 | www.一区二区三区 | 中日韩欧美一级片 | 中文字幕 国产精品 | 欧美久久久久久久久中文字幕 | 91午夜在线| 黄网站在线播放 | 91精品久久| 成人久久久久 | 黑人巨大精品 |