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

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

QQ登錄

只需一步,快速開始

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

c51單片機(jī)答題計(jì)算器Proteus仿真+程序設(shè)計(jì)

[復(fù)制鏈接]
ID:512142 發(fā)表于 2019-4-15 07:48 | 顯示全部樓層 |閱讀模式
簡易答題計(jì)算器
1)    采用LCD1602或者LCD12864液晶屏顯示。
2)    預(yù)計(jì)20道簡易加、減、乘、除的運(yùn)算式,隨機(jī)顯示其中一道運(yùn)算式進(jìn)行答題。
3)    使用4*4矩陣鍵盤輸入答案并顯示。
4)    判斷答案正確與否
5)    發(fā)揮部分: 其他創(chuàng)新功能。


單片機(jī)答題計(jì)算器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "key.h"
  6. #include "delay.h"
  7. #include "LCD1602.h"
  8. typedef unsigned char        u8;
  9. typedef unsigned short        u16;
  10. void  main()
  11. {
  12.         u8 key_down = 0;        //按鍵是否按下
  13.         u16 key_cnt = 0;        //持續(xù)按鍵計(jì)數(shù)
  14.         char key_bak = -1;        //上次掃描的按鍵信息
  15.         char key = -1;        //此次掃描的按鍵信息
  16.         LCD_Initial();//LCD初始化
  17.         new_q ();
  18.        
  19.         while(1)
  20.         {

  21.                 key = ScanKey();        //掃描鍵盤
  22.                 if(key)        //此次按鍵有效
  23.                 {
  24.                         if(!key_down)        //未曾按下鍵
  25.                         {
  26.                                 key_down = 1;
  27.                                 PressKey(key);// 處理按鍵值
  28.                         }
  29.                 }
  30.                 else        //無按鍵信息
  31.                 {
  32.                  key_down = 0;        //按下鍵標(biāo)志清零
  33.                 }
  34.                 key_bak = key;        //保存此次按鍵值

  35.                 Render();        //刷新顯示屏
  36.         }

  37. }
復(fù)制代碼
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "LCD1602.h"
  6. #include "key.h"
  7. #include "delay.h"
  8. #include "LCD1602.h"
  9. typedef unsigned char        u8;
  10. typedef unsigned short        u16;
  11. void Update();
  12. enum {PLUS = 1, MINUS, TIME, DIVIDE};

  13. float input;

  14. //矩陣鍵盤排列
  15. char code key_map[4][4] =
  16. {
  17.         '7', '8', '9', ' ',  //鍵盤對(duì)應(yīng)順序表
  18.         '4', '5', '6', ' ',
  19.         '1', '2', '3', ' ',
  20.         '0', 'C', '=', ' ',
  21. };

  22. u8 code disp_num[10] = {'0','1','2','3','4','5','6','7','8','9',};
  23. u8   disp_buf[16] = "                ";        //顯示緩沖區(qū)
  24. u8   disp_buf2[16] = "                ";        //顯示緩沖區(qū)
  25. //計(jì)算器操作
  26. float op_a = 0.0f;        //操作數(shù)A,數(shù)碼管顯示的都是op_a
  27. float op_b = 0.0f;        //操作數(shù)B
  28. u8 op_m = 0;        //運(yùn)算方式

  29. //輔助操作
  30. u8 z;
  31. void new_q ();//數(shù)學(xué)運(yùn)算


  32. float Calc(float a, float b, u8 op)
  33. {
  34.         float result = 0.0f;
  35.         switch(op)
  36.         {
  37.                 case 1: result = a + b; break;
  38.                 case 2: result = a - b; break;
  39.                 case 3: result = a * b; break;
  40.                 case 4: result = a / b;        break;
  41.         }

  42.         return result;
  43. }

  44. ////////////////////////////////////////////////////////////////////////////////

  45. //按下數(shù)字鍵
  46. void PressN(unsigned char  num)
  47. {
  48.         float tmp;
  49.         tmp = input * 10 + num;
  50.         input = tmp;        //保存當(dāng)前數(shù)據(jù)
  51.        
  52. }



  53. //按下等于號(hào),執(zhí)行運(yùn)算
  54. void PressEQ()
  55. {
  56.         if (input == Calc(op_a, op_b, op_m))        // 計(jì)算
  57.          {
  58.                  disp_buf[7]=' ';
  59.                  disp_buf[8]='Y';
  60.                  disp_buf[9]='E';
  61.                  disp_buf[10]='S';
  62.                  disp_buf[15]=' ';
  63.          }
  64.          else
  65.          {
  66.                  disp_buf[7]='N';
  67.                  disp_buf[8]='O';

  68.         }
  69. }


  70. //鍵盤掃描,無按鍵返回0
  71. char ScanKey()
  72. {
  73.         char ret = 0;
  74.         u8 key;
  75.         u8 line, row;//line行,row列

  76.         do
  77.         {
  78.                 P2 = 0x0f;        //掃描列
  79.                 key =P2;
  80.                 if(key == 0x0f) break;        //沒有鍵按下
  81.                 //有鍵按下
  82.                 delay(10);        //延時(shí)消除抖動(dòng)
  83.                 key = P2;        //再次讀端口值
  84.                 if(key == 0x0f) break;        //沒有鍵按下
  85.                 switch(key)        //有鍵按下,記錄行值
  86.                 {
  87.                         case 0x07: line = 0; break;
  88.                         case 0x0b: line = 1; break;
  89.                         case 0x0d: line = 2; break;
  90.                         case 0x0e: line = 3; break;
  91.                 }

  92.                 P2 = 0xf0;        //掃描行
  93.                 key = P2;
  94.                 if(key == 0xf0) break;        //沒有鍵按下
  95.                 //有鍵按下
  96.                 delay(10);        //延時(shí)消除抖動(dòng)
  97.                 key = P2;        //再次讀端口值
  98.                 if(key == 0xf0) break;        //沒有鍵按下
  99.                 switch(key)        //有鍵按下,記錄列值
  100.                 {
  101.                         case 0x70: row = 3; break;
  102.                         case 0xb0: row = 2; break;
  103.                         case 0xd0: row = 1; break;
  104.                         case 0xe0: row = 0; break;
  105.                 }
  106.                 //查找對(duì)應(yīng)的鍵值
  107.                 ret = key_map[line][row];                        // 行列
  108.         } while(0);
  109.         return ret;
  110. }
  111. void clear ()
  112. {
  113.          u8 i;
  114.         input = 0.0f;
  115.         z=0;
  116.         for(i=0;i<16;i++)
  117.                 disp_buf[i] =' ';
  118. }


  119. //按鍵操作
  120. void PressKey(char key)
  121. {

  122.         if((key!='=') && (key!=' '))        // 數(shù)字鍵檢測 用于在屏上顯示 輸入的數(shù)字
  123.         {
  124.         disp_buf[z++]=key; //加載顯示值
  125.         }
  126.         switch(key)
  127.         {
  128.                 case '0': case '1': case '2': case '3': case '4':        //0-9 屬于數(shù)字鍵進(jìn)行數(shù)字處理
  129.                 case '5': case '6': case '7': case '8': case '9':
  130.                 PressN(key - '0');
  131.                 break;

  132.                 case '=': PressEQ();  break;
  133.                 case ' ': new_q();  break;
  134.                                                                                                                                                                                                                     
  135.                 case 'C': clear();  break;
  136.         }
  137. }



  138. ////////////////////////////////////////////////////////////////////////////////
  139. //把浮點(diǎn)數(shù)值轉(zhuǎn)換成字符串形式放到s中,返回小數(shù)點(diǎn)位置
  140. void Format(float val, char *s)
  141. {
  142.         int dot = 0;
  143.         char *p = NULL;//NULL 表示未定義內(nèi)容

  144.         //格式化字符串
  145.         sprintf(s, "%-8g", val);        //把ual 變成字符存放到S

  146. //        去掉后面的空格
  147.         p = strchr(s, ' ');
  148.         if(p) *p = 0;
  149. }


  150. //將當(dāng)前操作數(shù)轉(zhuǎn)換成字符形式放到顯示緩沖區(qū)中
  151. void Update_question()
  152. {
  153.                 char idata s[16] = "";
  154.                 int len1,len2;
  155.                 int i;
  156.                  memset(disp_buf2, ' ', sizeof(disp_buf2));                //把DISP BUF 內(nèi)存給' '                        sizeof(disp_buf)測量disp_buf 容量
  157.                 //當(dāng)前操作數(shù)轉(zhuǎn)換成可顯示的字符串
  158.                 Format(op_a, s);        //計(jì)算小數(shù)點(diǎn)位置
  159.                 len1 = strlen(s);                        // 計(jì)算字符串長度
  160.                
  161.                 //可顯示的字符串逆序放到顯示緩沖區(qū)中
  162.                 for(i=0; i<len1; i++)
  163.                 {
  164.                  disp_buf2[i]=s[i];
  165.                 }
  166.                 switch (op_m)
  167.                 {
  168.                         case 1:
  169.                                 disp_buf2[len1] = '+';
  170.                         break;
  171.                         case 2:
  172.                                 disp_buf2[len1] = '-';
  173.                         break;
  174.                         case 3:
  175.                                 disp_buf2[len1] = '*';
  176.                         break;
  177.                         case 4:
  178.                                 disp_buf2[len1] = '/';
  179.                         break;
  180.                 }
  181.                 //當(dāng)前操作數(shù)轉(zhuǎn)換成可顯示的字符串
  182.                 Format(op_b, s);        //計(jì)算小數(shù)點(diǎn)位置
  183.                 len2 = strlen(s);                        // 計(jì)算字符串長度

  184.                 for(i=len1+1; i<len2+len1+1; i++)
  185.                 {
  186.                  disp_buf2[i]=s[i-len1-1];
  187.                 }
  188.                 GotoXY(0,0);
  189.                 PrintLCD(disp_buf2);
  190. }

  191. //將顯示緩沖區(qū)的內(nèi)容顯示到數(shù)碼管上
  192. void Render()
  193. {
  194.         GotoXY(0,1);
  195.         PrintLCD(disp_buf);
  196. }

  197. int code question[20][3] =//題目
  198. {
  199.         2,3,PLUS,//+
  200.         6,8,PLUS,//+
  201.         36,24,PLUS,//+
  202.         32,2,PLUS,//+
  203.         16,20,PLUS,//+
  204.         20,15,MINUS,//-
  205.         40,5,MINUS,//-
  206.         10,5,MINUS,
  207.         30,6,MINUS,//-
  208.         50,25,MINUS,//-
  209.         12,2,TIME,//*
  210.         6,5,TIME,//*
  211.         7,7,TIME,//*
  212.         4,9,TIME,//*
  213.         12,8,TIME,//*
  214.         10,2,DIVIDE,//÷
  215.         16,4,DIVIDE,//÷
  216.         50,25,DIVIDE,//÷
  217.         99,33,DIVIDE,//÷
  218.         64,16,DIVIDE,//÷
  219. };

  220. void new_q ()
  221. {
  222.         char i = rand()%20;
  223.         op_a = question[i][0];
  224.         op_b = question[i][1];
  225.         op_m = question[i][2];
  226.         Update_question();

  227.         clear();
  228. }
復(fù)制代碼

0.png

所有資料51hei提供下載:
基于單片機(jī)設(shè)計(jì)的答題計(jì)算器.rar (217.94 KB, 下載次數(shù): 27)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 四虎影音| 亚洲免费精品 | 日本成人二区 | 精品入口麻豆88视频 | 欧美999| 亚洲精品一区二区在线观看 | 视频一区在线播放 | 天天爱爱网 | 欧美精品久久久 | 欧美一区二区另类 | 中文字幕成人av | 自拍在线 | 久久精品高清视频 | 欧美一级黄 | 久久69精品久久久久久久电影好 | 操人网站| 视频一区二区在线观看 | a级片在线观看 | 欧美日韩一区在线 | 一级欧美一级日韩片免费观看 | 日韩精品中文字幕在线 | 成人av一区二区亚洲精 | 欧美激情久久久久久 | 超碰3 | 国产精品一区二区视频 | h视频免费在线观看 | 成人夜晚看av | 成人视屏在线观看 | 国产黄色网址在线观看 | 亚洲欧美一区二区三区国产精品 | 欧美日韩高清 | 天天做日日做 | 91精品国产日韩91久久久久久 | 国产一区久久久 | 久久成人高清视频 | 一区二区在线免费观看 | 黄色精品 | 免费国产精品久久久久久 | 欧美视频一级 | 成人午夜电影在线观看 | 精品国产一区二区三区成人影院 |