本站所列毕业设计(论文)资料均属于原创者所有,初衷是为大家在毕业设计(论文)过程中参考和学习交流之用。

毕业设计我帮你

基于C52单片机简易计算器设计

基于C52单片机简易计算器设计

本次做毕业设计选题,我就想用C52单片机做一个简易的加减乘除计算器。简易计算器具有加功能、减功能、乘功能、除功能。当出现计算值超出所设计的计算范围时具有报警功能。

如需购买请QQ扫描右边二维码或者加QQ 3449649974 咨询 毕业设计(论文)代做请加QQ 2269757180 微信号:bylwwwww


  • 详细描述

    基于C52单片机简易计算器设计
    摘 要
    利用C52单片机制作一个用数码管显示的四位数字简易计算器,简易计算器功能为若按下的是功能键则显示器上的数值不变,按下等于键后显示器显示出计算结果。当运算结果为五位数或者为负数时,蜂鸣器鸣叫,并进行报警提示,同时显示器也进行错误提示,按下清零键后报警现象消失。
    关键词:C52单片机;数码管;计算器
     
    目  录
    1. 系统结构 4
    2. 系统硬件及工作原理 4
    3.1单片机最小系统 4
    3.2按键输入模块 5
    3.3数码管显示模块 5
    3.4报警模块 6
    4软件介绍 6
    4.1程序流程图 6
    4.2键盘扫描函数 7
    4.3显示模块函数 11
    4.4报警模块函数 13
    5.结论 13
    参考文献 13
    致  谢 13
    附录:主程序 14
     
    结论
    本设计制作一个基于STC89C52单片机简易计算器,基本上完成了简易加、减、乘、除功能。设计的介绍。经过自己的努力,也终于把作品焊接、调试成功。作品制作基本成功,但也还有很多待改善的地方。
    参考文献
    [1]郭天祥.《新概念51单片机C语言教程—入门、提高、开发、扩展全攻略》.北京:电子工业出版社,2009.
    [2]邓会敏 李向阳 张文梅.《C语言程序设计教程》.北京:清华大学出版社,2013
    [3]曹巧媛主编. 单片机原理及应用(第二版). 北京:电子工业出版社,2002

    附录:主程序
    #include <reg52.H>
    #define uchar unsigned char 
    #define uint unsigned int  
    #define dxuan P0//定义数码管显示段选
    #define wxuan P2//定义数码管显示位选 
    #define key P1//定义键盘接口 
    sbit OFF = P3^4;//定义关机键 
    sbit speaker=P2^4; 
    unsigned long int num1,num2;//进行运算的两个变量数 
    uchar num;////键盘扫描返回值  
    char flagkaiji,flagshu,flagfuhao,fuhao,newkey,update; 
     //flagkaiji开机标志 ,newkey新按键标志,fuhao运算符,update表示等于号 
    char key_shu;//按键值 
    unsigned char code Wei[]={0x10,0x20,0x40,0x80,};//四位共阳位选
    unsigned char code Duan[]={0xc0,0xf9,0xa4,   
    0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; 
    // 0~9编码及无显示编码
    uchar saomiao();//键盘扫描函数  
    void display(unsigned long int );//数码管显示函数
    void Speaker (unsigned long ) ;//蜂鸣器发声函数
    void delay(uint n)//延时函数
     { 
      while(n--); 
      }  
     /*********************************************** 
      主函数  
      ************************************************/
       void main()
        { 
    speaker=0;
    flagkaiji=0;//标志关机 
       while(1)
        {   
        if(saomiao()==15)//先进行开机检测,如果按下开机键
      {   
      flagkaiji=1;//标志开机 
      
      num1=num2=fuhao=flagshu=newkey=0;//初始化变量 
      while(flagkaiji)// 当确认开机后
    {  
      
    if(!flagfuhao)
    {display(num1);//如果按下的是数字键,显示num1
      }
        else {
    display(num2); //如果按下的是符号键键,显示num2
     
    }
    key_shu=saomiao(); //获取扫描到的键值  
    if(newkey==1)//有新键值,每扫描到一次按键行为,newkey就会置1  
    if(key_shu==15)//如果按下的是清零功能的ON/C键, 
    flagfuhao=0;update=0;// 全部初始化  
    num1=num2=fuhao=flagshu=newkey=0;//全部初始化 
      }   
    else if(key_shu==14&&flagshu==1&&fuhao)
    //按下"=",数字键标志位为1,有数字键按下
       {   
         switch(fuhao) // 
         {   
           case 10:num1=num2+num1;break;// 符号值为按键值, 
           case 11:num1=num2-num1;break;  
       case 12: num1=num2/num1;break;
       case 13: num1=num2*num1;break;
       }
       fuhao=0; //运算完后,符号键值为零,switch失效
       flagfuhao=0;update=1; //符号键标志位置零,
        }   
        else if((key_shu>=0)&&(key_shu<=9))//按下数字键 
    { flagfuhao=0; 
    //符号标志位置0,防止符号键运行,上一句else if失效
         if(update)num1=0; 
    //如果上一步棸是计算完,先把shu1置0,进行下一步
       if(num1<1000) 
    //△ 控制数码管能显示几位数字,△shu1超过这个数,再按键无效不会存入shu1中, 
       {num1=key_shu+num1*10;
    //这步是关键,单个按键值通过对单一变量乘10来变成多位数
        flagshu=1;//标志数按下了数字键
       } 
       update=0;
    //运算标志位,也是更新shu1,更新由update标志进入后执行更新shu1语句,置零,避免进入
        }  
        else if((key_shu>=10)&&(key_shu<=13))//按下运算符 
    {  
    flagfuhao=1;update=0;  
    if(flagshu==1)// 如果之前按下了数字键 
    {   
      if(fuhao==0)//如果没按符号键,是在按下了运算符的情况 
    {   
    num2=num1;num1=0; //把shu1的值赋给shu2,
         fuhao=key_shu;flagshu=2; 
        }  
      else 
    {  
    switch(fuhao)  
      {   
       case 10:num2=num2-num1;break;  
       case 11:num2=num2+num1;break;  
       case 12:num1=num2/num1;break;  
       case 13:num1=num2*num1;break;
      } 
      
    num1=0;fuhao=key_shu;
    }  
    }  
      else if(flagshu==2)  
      fuhao=key_shu; 
    }  
    newkey=0; 
      }  
       } 
        }
    }
    收缩