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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5557|回復(fù): 1
收起左側(cè)

基于51單片機(jī)簡(jiǎn)易計(jì)算器,c程序+proteus仿真+原理圖+PCB圖+簡(jiǎn)易文檔

[復(fù)制鏈接]
ID:874677 發(fā)表于 2021-1-12 10:51 | 顯示全部樓層 |閱讀模式
基于51單片機(jī)簡(jiǎn)易計(jì)算器的原理圖如下
2021-01-12_100911.png
基于51單片機(jī)簡(jiǎn)易計(jì)算器的pcb圖如下
2021-01-12_101016.png

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

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

單片機(jī)源程序如下:
  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)//簡(jiǎn)單計(jì)算器 僅支持+-*/
  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];//記錄鍵值對(duì)應(yīng)的字符
  54.                                 text[i]='\0';
  55.         LCD_ShowStr(0,0,"                ");
  56.                                 LCD_ShowStr(16-strlen(text),0,text);
  57.                         }
  58.         if(key==keyzuoyi&&i>0)//按下"<"時(shí)刪除一位
  59.           i-=2;
  60.         }while(key!=keydeng);//按下'='時(shí)結(jié)束輸入
  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. }
復(fù)制代碼
  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. }
復(fù)制代碼
  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. }
復(fù)制代碼
2021-01-12_103212.png





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

2021-01-12_103522.png


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:849787 發(fā)表于 2021-2-1 17:03 | 顯示全部樓層
樓主的那個(gè)代碼,關(guān)于LCD1602中RS和EN腳的標(biāo)注是錯(cuò)位的,移植代碼的時(shí)候要注意。功能能正常實(shí)現(xiàn),就是對(duì)于除法和乘法,不能保留小數(shù)位,感覺實(shí)用性就不是很強(qiáng)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二 | 日本高清不卡视频 | 美女视频h | 亚洲高清免费 | 亚洲精品视频在线看 | a级片在线 | 亚洲网站在线播放 | 国产日韩欧美在线观看 | 综合国产| 亚洲国产精品va在线看黑人 | 中文天堂网 | 国产九一精品 | 天天拍天天色 | 亚洲精品国产综合区久久久久久久 | 毛片.com | 91黄在线观看 | 伊人伊人 | 韩国av网站在线观看 | 福利网址| 国产在线观看一区二区 | 91精品国产综合久久久久久丝袜 | 国产综合在线视频 | 国产精品久久久久久久久免费高清 | 99爱在线视频 | 中文在线a在线 | 韩国理论电影在线 | 久久午夜视频 | 欧美日韩高清在线一区 | 97久久精品午夜一区二区 | 91毛片在线观看 | 在线观看亚 | 国产一伦一伦一伦 | 中文在线一区二区 | 欧美成人h版在线观看 | 免费看片在线播放 | 成人高清视频在线观看 | 国产成人综合亚洲欧美94在线 | 欧美在线色视频 | 色婷婷亚洲 | 中文字幕在线人 | 国产99久久精品一区二区永久免费 |