找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4677|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机+LCD1602做的计算器 共享代码原理图与实物图

[复制链接]
跳转到指定楼层
楼主
  最近课程设计做了个计算器 ,MCU用STC89C51 ,显示部分用LCD1602,矩阵按键和独立按键输入.
  功能有 加减乘除 乘方运算,可输入小数点, 可连续运算,结果超过蜂鸣器会警告,24C02可以掉电保存运算结果.
  分享给需要的人!!!!

1.基本的加减乘除运算,输入输出全部为整形数
2.可以得到浮点型结果,不能输入浮点数
3.加入乘方运算
4.加入小数点输入
5.加入连续运算

源程序见附件,下面是制作出来的实物图:


电路原理图:


单片机源程序如下:
  1. /*=================================================*/
  2. /*项目名称: 51单片机计算器
  3. /*代码作者: F H X
  4. /*修改时间: 2017/12/20
  5. /*=================================================*/
  6. #include "Config.h"

  7. uchar T0RH = 0;                                  //定时器0重载值
  8. uchar T0RL = 0;

  9. extern bit Buzz_flag;                            //蜂鸣器开关标志
  10. /*========================================================================*/
  11. /*函数名称:void main()
  12. /*函数功能:主函数
  13. /*输入参数:无
  14. /*输出参数:无
  15. /*========================================================================*/
  16. void main()
  17. {
  18.         EA=1;                                          //开启总中断
  19.         Timer0Init(2);                                 //定时器0初始化 定时2ms
  20.         InitLcd1602();                                 //LCD1602初始化
  21.         
  22.         while(1)
  23.         {        
  24.                 KeyDrive();                                  //矩阵键盘驱动
  25.                 KeyDrive2();                                 //独立键盘驱动
  26.         }
  27. }
  28. /*========================================================================*/
  29. /*函数名称:void KeyDown(uchar keycode)
  30. /*函数功能:执行按键动作
  31. /*输入参数:keycode
  32. /*输出参数:无
  33. /*========================================================================*/
  34. void KeyDown(uchar keycode)
  35. {
  36.         if((keycode <= 0x39)&&(keycode >= 0x30))           //数字键0~9
  37.         {
  38.                 BuzzerControl();
  39.                 NumAction(keycode - 0x30);
  40.         }
  41.         else if(keycode == 0x26)                           //"+"号
  42.         {
  43.                 BuzzerControl();
  44.                 OprAction(0);
  45.         }
  46.         else if(keycode == 0x25)                           //"-"号
  47.         {
  48.                 BuzzerControl();
  49.                 OprAction(1);
  50.         }
  51.         else if(keycode == 0x28)                           //"×"号
  52.         {
  53.                 BuzzerControl();
  54.                 OprAction(2);
  55.         }
  56.         else if(keycode == 0x27)                           //"÷"号
  57.         {
  58.                 BuzzerControl();
  59.                 OprAction(3);
  60.         }
  61.         else if(keycode == 0x0D)                           //"="号
  62.         {
  63.                 BuzzerControl();
  64.                 GetResult();
  65.         }
  66.         else if(keycode == 0x1B)                           //小数点 '.'
  67.         {
  68.                 BuzzerControl();
  69.                 DecimalAction();
  70.         }
  71.         else if(keycode == 0x01)                           //复位键
  72.         {
  73.                 BuzzerControl();
  74.                 Reset();
  75.         }
  76.         else if(keycode == 0x02)                           //乘方运算                  
  77.         {
  78.                 BuzzerControl();
  79.                 OprAction(4);        
  80.         }
  81.         else if(keycode == 0x03)                           //从24c02读取运算结果
  82.         {
  83.                 BuzzerControl();
  84.                 Read_Result();                              
  85.         }
  86.         else if(keycode == 0x04)                           //开关蜂鸣器声音
  87.         {
  88.                 Buzz_flag = ~Buzz_flag;
  89.         }
  90. }
  91. /*========================================================================*/
  92. /*函数名称:void Timer0Init(uint ms)
  93. /*函数功能:定时器0初始化
  94. /*输入参数:ms
  95. /*输出参数:无
  96. /*========================================================================*/
  97. void Timer0Init(uint ms)
  98. {
  99.         ulong tmp;                                //16位长整型变量tmp
  100.         tmp = MAIN_OSC/12;                        //用晶振频率除以12得到定时器计数频率
  101.         tmp = (tmp*ms)/1000;                      //计算出需要多少个机器周期
  102.         tmp = 65536 - tmp;                        //定时器的初始值
  103.         tmp = tmp + 18;                           //补偿中断延时响应造成的误差
  104.         T0RH = (uchar)(tmp>>8);                   //将tmp高8位右移8位 赋值给T0RH
  105.         T0RL = (uchar)tmp;                        //将tmp低8位赋值给T0RL
  106.         TMOD &= 0xF0;                             //TMOD高4位不变 低四位清零
  107.         TMOD |= 0x01;                             //TMOD低四位变成0001
  108.         TH0 = T0RH;                               //装载初值
  109.         TL0 = T0RL;
  110. ……………………

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

所有资料51hei提供下载:
课程设计(计算器) - 最终版.rar (119.56 KB, 下载次数: 32)

评分

参与人数 2黑币 +55 收起 理由
kuiiel + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:102293 发表于 2017-12-24 11:01 | 只看该作者
好资料,学习学习,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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