基于51单片机的简易计算器课程设计(完整代码+完整设计报告)

本文详细介绍了作者使用AT89C52单片机进行的计算器项目,包括整数、小数、负数四则运算、错误检测、按键输入及清除功能。代码中包含了完整的功能实现和按键扫描逻辑,适合初学者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

这学期进行了单片机的课程学习,由于有课程设计要做,但本人C语言编程基础很差,借鉴几篇博客的代码和原理,拼凑成了这份报告,参考文献会引用于末尾,虽然水平不高,但报告较完整,还是分享给大家,希望有所帮助。代码冗余,希望理解,功能也有一些缺陷,我写在了报告总结上。

使用的芯片是AT89C52,可以进行连续的四则运算,使结果在LCD屏显示,主要实现以下六个功能:

(1) 可以进行连续的整数、小数、负数之间的四则运算;

(2) 除数为0时报错;

(3) 可以删除输错的数字或符号;

(4) 按下按键时伴随提示音,且有控制开关;

(5) 可以清零操作;

(6) 小数保留两位且要求四舍五入。

按键设计如下:

二、代码

这里我直接放完整代码,在开头进行了引脚定义。报告文件中和代码后面都做了解释,这里就不多说了。

#include "reg52.h" 
typedef unsigned int u16;
typedef unsigned char u8; 

#define KEY_PORT P1 //矩阵按键


sbit rw=P2^5;            
sbit rs=P2^6;            
sbit e=P2^7; 

sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;


code u8 ERROR[]="     ERROR!";//除数为0时,显示 
code u8 wel[]="    Welcome!";
u8 negative1,negative2,fuhao,jjcc,jjcc,key_value,decimal1,decimal2,j1,x,symbol0,beep=200,be=0,be2,key=1;
//第一负号标志、第二负号标志、有无运算符标志、运算符标志、按键值、第一小数标志、第二小数标志、错误显示循环变量、欢迎显示循环变量、连续计算标志、蜂鸣器循环次数、蜂鸣器开关标志、独立按键松开标志
float number1,number2,result,resulted; //第一组合数、第二组合数、结果、连续计算上次结果
u16 dec1,dec2,mul1,mul2;//第一小数、第二小数、第一小数位数还原标记、第二小数位数还原标记
long num1,num2;//第一整数、第二整数

void write_comm(u16 c);//写命令
void write_data(u16 dat);//写数据
void lcdinit(void);//lcd、变量初始化
void resultShow(float value);//结果显示
void getFuhao(key_value);//获取运算符
void getNum(key_value);//获取数字
void calculate(void);//计算
void delect(void);//删除
void numShow(u16 zhengshu);//整数显示
void getNeg(key_value);//负号、减号判断
void buzzer(beep);//蜂鸣器


//延时
void delay(u16 ten_us)
{
	while(ten_us--);
}

void buzzer(beep)
{	
	while(beep--)//循环 200 次
	{
		rw=!rw;//产生一定频率的脉冲信号
		delay(100);
	}
	rw=0;//关闭蜂鸣器
}

//按键
void key_scan(void)
{	
	key_value=0;
	KEY_PORT=0xf7;//给第一列赋值 0,其余全为 1
	if(KEY_PORT!=0xf7)//判断第一列按键是否按下
	{
		delay(1000);//消抖
		switch(KEY_PORT)//保存第一列按键按下后的键值
		{
			case 0x77: key_value=1;buzzer(beep);getNum(key_value);break;
			case 0xb7: key_value=4;buzzer(beep);getNum(key_value);break;
			case 0xd7: key_value=7;buzzer(beep);getNum(key_value);break;
			case 0xe7: 
				buzzer(beep);
				key_value=10;//
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值