找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5389|回复: 5
收起左侧

基于AT89C51单片机的一位计算器仿真设计

  [复制链接]
ID:269295 发表于 2017-12-30 19:57 | 显示全部楼层 |阅读模式
单片机一位计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include <reg51.h>
  2. sbit LCD_RS = P2^0;
  3. sbit LCD_EN = P2^1;
  4. unsigned char KeyValue = 255;
  5. unsigned char DisCache[6]={0};
  6. unsigned char StartFlag = 0;
  7. void DelayTime10us(unsigned int DelayValue)
  8. {
  9. unsigned int a = 0,b = 0;
  10. for(a =0 ;a < DelayValue; a++)
  11.      for(b =0 ;b < 18; b++);
  12. }
  13. void DelayTime10ms(unsigned int DelayValue)
  14. {
  15. unsigned int a = 0,b = 0;
  16. for(a =0 ;a < DelayValue; a++)
  17.      for(b =0 ;b < 1828; b++);
  18. }
  19. void SendDataToLCD(unsigned char LCDData)
  20. {
  21.     LCD_RS = 1;
  22.     P0 = LCDData;
  23.     LCD_EN = 1;
  24.     DelayTime10us(10);  
  25.     LCD_EN = 0;
  26.     DelayTime10us(10);
  27. }
  28. void SendPositionToLCD(unsigned char LCDPosition)
  29. {
  30.     LCD_RS = 0;
  31.     P0 = LCDPosition;
  32.     LCD_EN = 1;
  33.     DelayTime10us(10);  
  34.     LCD_EN = 0;
  35.     DelayTime10us(10);
  36. }
  37. void DisStr(unsigned char *point)
  38. {
  39.         char i = 0;
  40.         for(;;)
  41.         {
  42.                 SendDataToLCD( *point);
  43.                 point++;
  44.                 if(*point =='\0')
  45.                 break;
  46.         }
  47. }
  48. void DisStr1()
  49. {
  50.   char i = 0;
  51.         for(i=0;i<6;i++)
  52.         {
  53.                 SendDataToLCD(DisCache[i]);
  54.         }
  55. }
  56. void KeyScan()
  57. {
  58.         int  KeyTemp  = 0;
  59.         P3 = 0xfe;
  60.         KeyTemp = P3&0xf0;
  61.         if(KeyTemp!=0xf0)
  62.                 {
  63.                         DelayTime10ms(1);
  64.                         P3 = 0xf0;
  65.       KeyTemp = P3&0xf0;
  66.       if(KeyTemp!=0xf0)
  67.                                 {
  68.                                         switch(KeyTemp)
  69.                                         {
  70.                                                 case 0xe0:KeyValue =7;break;
  71.                                                 case 0xd0:KeyValue =8;break;
  72.                                                 case 0xb0:KeyValue =9;break;
  73.                                                 case 0x70:KeyValue =10;break;
  74.                                         }
  75.                                 }
  76.                 }
  77. P3 = 0xfd;
  78. KeyTemp = P3&0xf0;
  79. if(KeyTemp!=0xf0)
  80.         {
  81.                 DelayTime10ms(1);
  82.                 P3 = 0xf0;
  83.     KeyTemp = P3&0xf0;
  84.     if(KeyTemp!=0xf0)
  85.                 {
  86.                                 switch(KeyTemp)
  87.                                 {
  88.                                         case 0xe0:KeyValue =4;break;
  89.                                         case 0xd0:KeyValue =5;break;
  90.                                         case 0xb0:KeyValue =6;break;
  91.                                         case 0x70:KeyValue =11;break;
  92.                                 }
  93.      }
  94.         }
  95. P3 = 0xfb;
  96. KeyTemp = P3&0xf0;
  97. if(KeyTemp!=0xf0)
  98.         {
  99.                 DelayTime10ms(1);
  100.                 P3 = 0xf0;
  101.     KeyTemp = P3&0xf0;
  102.     if(KeyTemp!=0xf0)
  103.                 {
  104.                         switch(KeyTemp)
  105.                         {
  106.                                 case 0xe0:KeyValue =1;break;
  107.                                 case 0xd0:KeyValue =2;break;
  108.                                 case 0xb0:KeyValue =3;break;
  109.                                 case 0x70:KeyValue =12;break;
  110.                         }
  111.     }
  112.         }
  113. P3 = 0xf7;
  114. KeyTemp = P3&0xf0;
  115. if(KeyTemp!=0xf0)
  116.         {
  117. DelayTime10ms(1);
  118. P3 = 0xf0;
  119.      KeyTemp = P3&0xf0;
  120.      if(KeyTemp!=0xf0)
  121.                         {
  122.                                         switch(KeyTemp)
  123.                                  {
  124.                                                 case 0xe0:KeyValue =15;break;
  125.                                                 case 0xd0:KeyValue =0;break;
  126.                                                 case 0xb0:KeyValue =14;break;
  127.                                                 case 0x70:KeyValue =13;break;
  128.                                         }
  129.                         }
  130.         }       
  131. }
  132. void main()
  133. {
  134.     // 01 06 0c 38
  135.     SendPositionToLCD(0x01);
  136.     SendPositionToLCD(0x06);
  137.     SendPositionToLCD(0x0c);
  138.     SendPositionToLCD(0x38);
  139.                 SendPositionToLCD(0x80);
  140.     DisStr("calculator!");
  141.     for(;;)
  142.                 {
  143.                         KeyScan();
  144.                         SendPositionToLCD(0xc0);
  145.                 //DisStr(DisCache);
  146.                         DisStr1();
  147. if((KeyValue>=0)&&(KeyValue<=9)&&(StartFlag==0))
  148.         {
  149.                 DisCache[0]=KeyValue+48;
  150.                 StartFlag=1;
  151.         }       
  152. if(KeyValue==15)
  153.         {
  154.                 StartFlag = 0;
  155.                 DisCache[0]=48;
  156.                 DisCache[1]=0;
  157.                 DisCache[2]=0;
  158.                 DisCache[3]=0;
  159.                 DisCache[4]=0;
  160.                 DisCache[5]=0;
  161.                 DisCache[6]=0;
  162.         }
  163. if((KeyValue>=10)&&(KeyValue<=13)&&(StartFlag==1))
  164.         {
  165.                 StartFlag=2;
  166.                 switch(KeyValue)
  167.                 {
  168.                 case 10:DisCache[1]= 47;break;
  169.                 case 11:DisCache[1]= 42;break;
  170.                 case 12:DisCache[1]= 45;break;
  171.                 case 13:DisCache[1]= 43;break;
  172.                 }
  173.         }
  174. if((KeyValue>=0)&&(KeyValue<=9)&&(StartFlag==2))
  175.         {
  176. ……………………

  177. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
计算机2017-12-4.zip (147.09 KB, 下载次数: 123)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:350401 发表于 2018-6-12 16:35 | 显示全部楼层
没有黑币
回复

使用道具 举报

ID:353807 发表于 2018-6-18 18:55 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:701236 发表于 2020-3-2 16:38 | 显示全部楼层
怎么是80C51,标题上是AT89C51
回复

使用道具 举报

ID:701325 发表于 2020-3-2 18:59 来自手机 | 显示全部楼层
能问下楼主,能通过这个做出简易计算器么!
回复

使用道具 举报

ID:701341 发表于 2020-3-2 19:42 | 显示全部楼层
学习一下看看怎么样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表