找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10567|回复: 8
收起左侧

51单片机简易计算器(单片机小实验,含C程序和Ptotues电路图)

  [复制链接]
ID:331936 发表于 2018-5-17 10:44 | 显示全部楼层 |阅读模式
51单片机简易计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"math.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define key P3
  6. #define duan P2
  7. #define wei P1

  8. sbit led=P0^0;
  9. sbit buzzer=P0^1;

  10. uchar num,temp,num1,i=0;
  11. long bczs=0,czs=0,jiguo=0,jiguo1=0;
  12. uchar czs12=1;          //输入数的选择标志位,1为第一个数,2为第二个数
  13. uchar yiweiflag,qinflag;  //移位标志

  14. uchar code shuzi[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};         //0~9,-,
  15. uchar code weizi[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  16. uchar code error[10]={0xff,0xaf,0xc0,0xaf,0xaf,0x86,0xff,0xff,0xff};//error
  17. uchar playshuzu[9],fuhao;
  18. uchar zhi,weishu=0;

  19. void init();                  //函数申明
  20. uchar keyscan();
  21. uchar scanzhi();
  22. void display();
  23. void duzhichuli();
  24. void zhuandisplayjiguo();
  25. void jiafa();
  26. void jianfa();
  27. void chengfa();
  28. void chufa();
  29. void qin();
  30. void displayerror();
  31. //======================================
  32. void main()                          //主函数
  33. {
  34.         init();
  35.         display();
  36.         while(1)
  37.         {
  38.                 duzhichuli();
  39.         }
  40. }
  41. //===============================================================================
  42. void init()
  43. {
  44.         uchar i;
  45.         czs12=1;
  46.         yiweiflag=1;  //1不移
  47.         qinflag=0;    //不清除
  48.         duan=shuzi[8];
  49.         wei=weizi[5];
  50.         playshuzu[1]=shuzi[0];
  51.         for(i=2;i<9;i++)
  52.                 playshuzu[i]=shuzi[10];
  53.                
  54.         bczs=0;czs=0;jiguo=0,jiguo1=0;               
  55. }
  56. //===============================================================================
  57. void delay(uint x)
  58. {
  59.         uchar y;
  60.         for(x;x>0;x--)
  61.                 for(y=112;y>0;y--);
  62. }

  63. //====================================
  64. uchar keyscan()
  65. {
  66. unsigned char recode,i,j;
  67.         for(i=0;i<4;i++)
  68.                 {
  69.                         P3=~(0x01<<i);
  70.                         recode=P3>>4;
  71.                         if(recode<0x0f)
  72.                         {
  73.                         for(j=0;j<4;j++)
  74.                         {if(!(recode&0x01<<j))break;}
  75.                         return (i<<2)+(j+1); //返回键值 1-16
  76.                         }
  77.                         delay(5); //延时5ms
  78.                 }
  79.    return 0; //无按键返回
  80. }
  81. //========================================
  82. uchar scanzhi()
  83. {
  84.         uchar zhi,k;
  85.         k=keyscan();
  86.         switch(k)
  87.         {
  88.                 case 0: zhi=27;break;
  89.                 case 1: zhi=7;break;
  90.                 case 2: zhi=8;break;
  91.                 case 3: zhi=9;break;
  92.                 case 4: zhi=24;break;   // /

  93.                 case 5: zhi=4;break;
  94.                 case 6: zhi=5;break;
  95.                 case 7: zhi=6;break;
  96.                 case 8: zhi=23;break;   //*

  97.                 case 9: zhi=1;break;
  98.                 case 10: zhi=2;break;
  99.                 case 11: zhi=3;break;
  100.                 case 12: zhi=22;break;   //-

  101.                 case 13: zhi=26;break;        //nc
  102.                 case 14: zhi=0;break;
  103.                 case 15: zhi=25;break;  //=
  104.                 case 16: zhi=21;break;  //+
  105.         }
  106.         return(zhi);
  107. }
  108. //===========================================
  109. void duzhichuli()
  110. {
  111.         uchar tt,u;

  112.         tt=scanzhi();
  113.         if(tt!=27)
  114.         {
  115.                 led=0;
  116.                 buzzer=0;
  117.                 if(tt<=9)//数字输入
  118.                 {
  119.                         if(qinflag==1)  qin();
  120.                                 qinflag=0;
  121.                         if(yiweiflag!=1)
  122.                         {
  123.                                 for(u=8;u>1;u--)                         //移位输入
  124.                                 {
  125.                                         playshuzu[u]=playshuzu[u-1];
  126.                                 }
  127.                         }
  128.                         yiweiflag=0;    //移位
  129.                         playshuzu[1]=shuzi[tt];       
  130.                         if(czs12==1)   bczs=bczs*10+tt;                        //
  131.                         if(czs12==2)   czs=czs*10+tt;               
  132.                 }
  133.                 if(tt>20)//符号输入
  134.                 {
  135.                         switch(tt)
  136.                         {
  137.                                 case 21:         jiafa();break;                //+
  138.                                 case 22:    jianfa();break;                //-
  139.                                 case 23:    chengfa();break;        //*
  140.                                 case 24:    chufa();break;
  141.                                 case 25:    zhuandisplayjiguo();break;                //=
  142.                                 case 26:    init();break;                //nc
  143.                         }               
  144.                 }
  145.         }
  146.   //-----------------------------------------------
  147.         while(tt!=27)           //松手检测
  148.         {
  149.                 led=0;
  150.                 buzzer=0;
  151.                 tt=scanzhi();
  152.                 delay(1);
  153.                 if(tt==27) goto chu;
  154.         }

  155.         chu: delay(1);
  156.         led=1;
  157.         buzzer=1;
  158. }

  159. //============================================
  160. void display()
  161. {

  162.         TMOD=0x01;
  163.         TH0=(65536-200)/256;
  164.         TL0=(65536-200)%256;
  165.         EA=1;
  166.         ET0=1;
  167.         TR0=1;

  168. }
  169. void TIME0(void) interrupt 1
  170. {
  171.         TH0=(65536-200)/256;
  172.         TL0=(65536-200)%256;
  173.         i++;
  174.         if(i==9) i=1;
  175.             wei=weizi[i];
  176.             duan=playshuzu[i];       
  177. }
  178. //===============================================           //显示数转操作数
  179. void zhuandisplayjiguo()
  180. {
  181.         uchar i,k;
  182.         long ttt;

  183.         for(i=1;i<9;i++)
  184.                 playshuzu[i]=shuzi[10];
  185.     //----------------------------------------
  186.         switch(fuhao)
  187.         {
  188.                 case 1: jiguo=bczs+czs;break;
  189.                 case 2: jiguo=bczs-czs;break;
  190.                 case 3: jiguo=bczs*czs;break;
  191.                 case 4: jiguo=bczs/czs;break;
  192.                 case 0: jiguo=jiguo1;break;
  193.         }
  194.         fuhao=0;

  195.         //----------------------------------------
  196.         ttt=jiguo;
  197.         jiguo1=jiguo;                                                           //显示处理
  198.         k=1;                                        //取数的个数
  199.     for(i=1;i<=8;i++)
  200.            {
  201.                            if(ttt/10!=0)  k++;
  202.                         ttt=ttt/10;       
  203.            }       

  204.         for(i=8;i>k;i--)
  205.            {
  206.                            playshuzu[i]=shuzi[10];
  207.            }
  208.         if(jiguo<0)  { jiguo=fabs(jiguo);playshuzu[k+1]=shuzi[11]; }   //取正加负号
  209.        
  210.         for(i=1;i<=k;i++)
  211.            {
  212.                            playshuzu[i]=shuzi[jiguo%10];
  213.                         jiguo=jiguo/10;       
  214.            }
  215.         if(jiguo1>99999999) displayerror();
  216.        
  217. }
  218. //===================================================
  219. void qin()
  220. {
  221.         uchar i;
  222.         yiweiflag=1;  //1不移
  223.         playshuzu[1]=shuzi[0];
  224.         for(i=2;i<9;i++)
  225.                 playshuzu[i]=shuzi[10];
  226. }
  227. //===================================================
  228. void displayerror()
  229. {
  230.         uchar i;
  231.         for(i=1;i<=8;i++)
  232.                 playshuzu[i]=error[i];
  233. }
  234. //===================================================
  235. void jiafa()   //+
  236. {

  237.         qinflag=1;
  238.     if(jiguo1!=0) bczs=jiguo1;
  239.         czs=0;
  240.         czs12=2;
  241. ……………………

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

所有资料51hei提供下载:
51单片机简易计算器.rar (50.16 KB, 下载次数: 208)

评分

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

查看全部评分

回复

使用道具 举报

ID:429614 发表于 2018-11-21 10:19 | 显示全部楼层
谢谢 我刚好要学习一下
回复

使用道具 举报

ID:427256 发表于 2018-12-16 15:44 | 显示全部楼层
跪谢大佬,救了我的课程设计
回复

使用道具 举报

ID:461954 发表于 2019-1-4 22:29 来自手机 | 显示全部楼层
1444522629 发表于 2018-12-16 15:44
跪谢大佬,救了我的课程设计

运行成功了吗?
回复

使用道具 举报

ID:542290 发表于 2019-5-26 11:24 | 显示全部楼层
1444522629 发表于 2018-12-16 15:44
跪谢大佬,救了我的课程设计

可以用吗?
回复

使用道具 举报

ID:547782 发表于 2019-5-26 19:31 | 显示全部楼层
第一次来,向你学习!!
回复

使用道具 举报

ID:548144 发表于 2019-5-28 08:14 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:385168 发表于 2020-2-15 15:32 | 显示全部楼层
今天来学习计算器,谢谢分享。
回复

使用道具 举报

ID:922067 发表于 2021-5-16 12:31 | 显示全部楼层
头文件math.h可以分享一下么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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