单片机51实现计算器详细代码能自己运行

1.实现功能:

实现单字节加减乘除四则运算
1、能通过键盘输入正确键值
2、能进行简单的四则运算
3、能以数码管正确显示数值
4、能重复操作

2.元器件清单

在这里插入图片描述

3.软件流程图

在这里插入图片描述
4.仿真图
在这里插入图片描述
如22+96
在这里插入图片描述
在这里插入图片描述

6.相关代码

#include "reg51.h"
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;
unsigned int a=0,b=0; //输入
unsigned char fuhao=0;//符号
unsigned int c=0;//结果
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
unsigned char disp[]={0,0,0,0,0,0,0,0};

void delay(unsigned int i)//延时
{
	while(i--);
}

unsigned char key_scan()//按键检测
{
unsigned char i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
 switch(P1)//检测行
 {
  case 0x0e:i=3;break;
  case 0x0d:i=2;break;
  case 0x0b:i=1;break;
  case 0x07:i=0;
 }
 P1=0xf0;
 switch(P1)//检测列
 {
  case 0xe0:j=13;break;
  case 0xd0:j=9;break;
  case 0xb0:j=5;break;
  case 0x70:j=1;
 }
 while(P1!=0xf0);//等待按键松开
}
return i+j;
}

void main()//主函数
{
	unsigned char i;
	unsigned int m=0;
	while(1)
	{
		//显示
		if(fuhao<5)
		{
		P0=smgduan[a%1000/100];smg1=0;delay(100);smg1=1;
		P0=smgduan[a%100/10];smg2=0;delay(100);smg2=1;
		P0=smgduan[a%10];smg3=0;delay(100);smg3=1;

		switch(fuhao)//符号
		{
			case 1:P0=0x01;break;
			case 2:P0=0x40;break;
			case 3:P0=0x08;break;
			case 4:P0=0x80;break;
			default:P0=0;
		}
		smg4=0;delay(100);smg4=1;

		P0=smgduan[b%1000/100];smg5=0;delay(100);smg5=1;
		P0=smgduan[b%100/10];smg6=0;delay(100);smg6=1;
		P0=smgduan[b%10];smg7=0;delay(100);smg7=1;
		}
		else//显示结果
		{
			P0=smgduan[c%1000/100];smg5=0;delay(100);smg5=1;
			P0=smgduan[c%100/10];smg6=0;delay(100);smg6=1;
			P0=smgduan[c%10];smg7=0;delay(100);smg7=1;
		}
		//==================================================
		i=key_scan();//检测
		if((i>0)&&(i<11))//输入数值
		{
			if(fuhao==0)//第1个输入
			{
				a=a*10+i-1;
				if(a>999)
					a=a%1000;				
			}
			else //第2个输入
			{
				b=b*10+i-1;
				if(b>999)
					b=b%1000;				
			}
		}
		if(i==13)//+
		{
			fuhao=1;
		}
		if(i==14)//-
		{
			fuhao=2;
		}
		if(i==15)//*
		{
			fuhao=3;
		}
		if(i==16)// /
		{
			fuhao=4;
		}
		if(i==11)//ok
		{						
			switch(fuhao)
			{
				case 1:c=a+b;break;
				case 2:c=a-b;break;
				case 3:c=a;c=c*b;break;
				case 4:c=a/b;
			}
			fuhao=5;						
		}
		if(i==12)//清除
		{			 
			 a=0;
			 b=0;
			 c=0;
			 fuhao=0;
		}
	}
}
  • 9
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
项目一:简单计算器 1.实验题目:用51单片机实现简单的计算器功能 2.实验截图: 1).实验运行前截图: 2).实验运行后截图: 3.实验代码: #include<reg52.h> #include<intrins.h> #include<math.h> #include<defined.H> #include<LCD1602.h> unsigned char table1[16]; //1602第一行显示字符 unsigned char table2[16]; //1602第二行显示字符 unsigned char code table_error[] = "error"; /* 键扫描函数 */ unsigned char keyscan() //扫描键盘函数 { unsigned char key_l,key_h,addres,num; P0=0x0f; key_l=P0; P0=0xf0; key_h=P0; addres=key_l " key_h; if(addres!=0xff) { Delayms(1); if(addres!=0xff) { P0=0x0f; key_l=P0; P0=0xf0; key_h=P0; addres=key_l " key_h; switch(addres) { case 0xee:num='1';break; case 0xde:num='2';break; case 0xbe:num='3';break; case 0xed:num='4';break; case 0xdd:num='5';break; case 0xbd:num='6';break; case 0xeb:num='7';break; case 0xdb:num='8';break; case 0xbb:num='9';break; case 0xd7:num='0';break;//按键0 case 0xe7:num='C';break;//按键* case 0xb7:num='=';break;//按键# case 0x7e:num='/';break;//按键A case 0x7d:num='*';break;//按键B case 0x7b:num='-';break;//按键C case 0x77:num='+';break;//按键D } while(addres!=0xff) { P0=0x0f; key_l=P0; P0=0xf0; key_h=P0; addres=key_l " key_h; } return num; } } return 0; } void clear_lcd(void) //清屏 { unsigned char j; for(j=0;j<16;j++) { table1[j]='\0'; table2[j]='\0'; } } void main() { unsigned char i=0,j; unsigned char key; unsigned char flag_operator = 0; //加减乘除标志位 unsigned char flag_equ = 0; //等于标志位 unsigned char flag_key = 0; //运算位标志 bit flag_MaxValue = 0; bit flag_minus = 0;//负数 long int value = 0; //最终运算结果 unsigned long int value_H =0; //第一个数据 unsigned long int value_L = 0; //第二个数据 unsigned long int temp[]={1, 10, 100,1000,10000,100000,1000000,10000000,100000000}; Initialize_LCD(); while(1) { key=keyscan(); if(key != 0) { if(key == 'C') //清除键C按下 { clear_lcd(); i=0; flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0; } else { for(j=0; j<i; j++) { table1[15-i+j] = table1[15-i+j+1]; } table1[15] = key; //table1[i] = key; i++; } if(key == '=') { for(j=0; j<16; j++) //确定运算符位置 { if(table1[j] == '='
这里提供一个简单的51单片机数码管计算器实现加减乘除的代码,供您参考。代码基于Keil C51编译器,使用4位共阳数码管和4个按键,实现了加减乘除四则运算。请注意,本代码仅供参考,具体实现方法可根据您自己的需求进行调整。 ``` #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit KEY_0 = P1^0; //数字键0 sbit KEY_1 = P1^1; //数字键1 sbit KEY_2 = P1^2; //数字键2 sbit KEY_3 = P1^3; //数字键3 sbit KEY_ADD = P1^4; //加号键 sbit KEY_SUB = P1^5; //减号键 sbit KEY_MUL = P1^6; //乘号键 sbit KEY_DIV = P1^7; //除号键 sbit KEY_EQ = P3^2; //等号键 sbit LED_COM = P2^7; //数码管共阴极控制位 uchar code LED_TAB[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码表 uint num1 = 0; //第一个数字 uint num2 = 0; //第二个数字 uint result = 0; //计算结果 uchar status = 0; //运算状态,0为未输入运算符,1为输入了运算符 void delay(uint xms) //延时函数 { uint i, j; for(i=xms; i>0; i--) for(j=110; j>0; j--); } void display(uint num) //数码管显示函数 { uchar i; for(i=0; i<4; i++) { LED_COM = 1 << i; //选择数码管位 P0 = LED_TAB[num % 10]; //显示个位数字 num /= 10; delay(5); //延时5ms P0 = 0x00; //关闭数码管 } } void input(uint *num) //数字键输入函数 { if(KEY_0 == 0) *num = *num * 10 + 0; else if(KEY_1 == 0) *num = *num * 10 + 1; else if(KEY_2 == 0) *num = *num * 10 + 2; else if(KEY_3 == 0) *num = *num * 10 + 3; } void calc(uchar op) //计算函数 { switch(op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if(num2 == 0) //除数为0,错误处理 { result = 0; break; } result = num1 / num2; break; } display(result); //显示计算结果 } void main() { uchar op = 0; //运算符 uint i = 0; //循环变量 while(1) { if(KEY_ADD == 0) //加号键按下 { op = '+'; status = 1; delay(10); } if(KEY_SUB == 0) //减号键按下 { op = '-'; status = 1; delay(10); } if(KEY_MUL == 0) //乘号键按下 { op = '*'; status = 1; delay(10); } if(KEY_DIV == 0) //除号键按下 { op = '/'; status = 1; delay(10); } if(KEY_EQ == 0) //等号键按下 { if(status == 0) //未输入运算符,错误处理 { result = 0; display(result); delay(500); continue; } calc(op); //进行计算 num1 = result; //保存计算结果 num2 = 0; op = 0; status = 0; delay(10); } input(&num2); //数字键输入 display(num2); //显示输入数字 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值