教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

科学计算器设计报告(51单片机)

来源:网络收集 时间:2026-04-27
导读: 单片机课程设计报告(多功能计算器) 班 级: 姓 名: 学 号: 指导老师: 一、内容摘要 利用89c51作为主控器设计一个四则运算的计算器。 首先通过在图书馆和网上查找有关设计计算器的资料,大概了解设计计算器需要哪几个模块,熟悉Keil和Proteus两个软件的

单片机课程设计报告(多功能计算器)

班 级: 姓 名: 学 号: 指导老师:

一、内容摘要

利用89c51作为主控器设计一个四则运算的计算器。 首先通过在图书馆和网上查找有关设计计算器的资料,大概了解设计计算器需要哪几个模块,熟悉Keil和Proteus两个软件的用法,以及它们的联调,完成计算器的程序设计和仿真,然后就是进实验室进行计算器电路板的焊接,最后就是将程序下载到单片机芯片中,系统联调,直到得出结果。 二、设计内容及要求

用单片机设计计算器,要求可以进行加、减、乘、除运算。 三、系统方案设计,画出系统框图

系统原理框图

四、画出完整的电路图,并说明电路的工作原理

电路图说明:

(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;

(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;

(3)发光二极管电路用来说明电路是否上电; (4)晶振电路为单片机提供时钟频率; (5)复位电路为单片机提供复位信号。 计算器的功能实现:

(1)此计算器适应于不大于八位整数的四则混合运算,若单个数大于八位或者结果大于八位(溢出)则显示“Chu cuo”。

(2)如果在还没有按数字之前按了一个符号键或者等号则显示“Chu cuo”。 (3)若接连按了几个运算符键,实际上进行的运算是最后一次按的运算键。 (4)可以显示负数、小数。

(5)此计算器不可实现连乘、连加、连减、连除。 四、软件仿真,根据系统硬件图编写系统程序并调试

#include <reg52.h>

#include <intrins.h>//循环左右移要用该头文件(-cror-(),-crol-()) #define uchar unsigned char #define ulong unsigned long

uchar array[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}; uchar array1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}; uchar a;

ulong num1=0,num2=0; sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3;

sbit F1=PSW^1;//定义一个标志位,F0在头文件里已定义 void displayljy(void);//声明"显示"子函数

void inkeylove(void);//声明"判断按下的是什么键"子函数 void iskeyyou(void);//声明"判断是否有键按下"子函数

void bian1(void);//声明"将uchar型变量转化为ulong型变量"子函数 void bian2(void);//声明"将ulong型变量转化为uchar型变量"子函数 void jia(void);//声明"加运算"子函数 void jian(void);//声明"减运算"子函数 void cheng(void);//声明"乘运算"子函数 void chu(void);//声明"除运算"子函数 void error(void);//声明"出错显示"子函数 void main() {uchar r7=0x00,i; while(1) {displayljy(); inkeylove();

if(a!=0xff)//如果有键输入,继续往下执行,否则从新开始

{if(a==0x0f) //如果输入的是"清除"键,将显示器清屏,同时清存放运算符号的单元 {r7=0x00; for(i=0;i<8;i++) {array[i]=0x10; array1[i]=0x10; }

}

else if(a==0x0e)//如果输入的是"=",继续往下执行,否则从新开始 {if(r7==0x0d)//如果r7中存放的是"+",则执行加运算 {bian1(); jia(); bian2();

}

else if(r7==0x0c)//如果r7中存放的是"-",则执行减运算 {bian1(); jian(); }

else if(r7==0x0b)//如果r7中存放的是"*",则执行乘运算

{bian1(); cheng(); bian2(); }

else if(r7==0x0a)//如果r7中存放的是"÷",则执行除运算

{bian1(); chu(); } else

error();//如果r7没有存进运算符,则转出错处理

}

else

{if(r7!=0x00)//如果已按过运算键,往下执行,否则转else {if(a>0x09&&a<0x0e)//如果还按下运算键,则后按的取代前面按的 r7=a;

else if(array1[0]==0x10)//判断是不是输入加数(减数...)的第一个数 {for(i=0;i<8;i++)//是的话,将被加数(被减数...)存入array1中 array1[i]=array[i]; for(i=0;i<8;i++) array[i]=0x10;

for(i=7;i>0;i--)//array中存入加数(减数...)

array[i]=array[i-1];

array[0]=a; } else

//不是输入加数(减数...)的第一个数

{if(array[7]!=0x10)//如果加数(减数...)已是八位整数,则转出错处理 error(); else

{for(i=7;i>0;i--)//否则将加数左移 array[i]=array[i-1]; array[0]=a; }

}

}

else//之前还没有运算键按下 {if(a>0x09)//有运算键按下

{if(array[0]==0x10)//但是在运算键按下之前没有输入被加数,则转出错 error();

else

r7=a;//否则将运算键输入r7中保存 }

else if(array[7]!=0x10)//如果被加数已是八位整数,则转出错 error(); else

//否则将被加数左移

{for(i=7;i>0;i--) array[i]=array[i-1]; array[0]=a; } } } } }

}

void bian1(void)//"将uchar型变量转化为ulong型变量"子函数 {uchar i; for(i=7;i>0;i--)

{if(array[i]==0x10) array[i]=0x00; if(array1[i]==0x10) array1[i]=0x00; }

num1=(ulong)array1[7]*10000000; num1+=(ulong)array1[6]*1000000; num1+=(ulong)array1[5]*100000; num1+=(ulong)array1[4]*10000; num1+=(ulong)array1[3]*1000; num1+=(ulong)array1[2]*100; num1+=(ulong)array1[1]*10; num1+=(ulong)array1[0]; num2=(ulong)array[7]*10000000; num2+=(ulong)array[6]*1000000; num2+=(ulong)array[5]*100000; num2+=(ulong)array[4]*10000; num2+=(ulong)array[3]*1000; num2+=(ulong)array[2]*100; num2+=(ulong)array[1]*10; num2+=(ulong)array[0]; }

void bian2(void)//声明"将ulong型变量转化为uchar型变量"子函数{uchar i=7,F0=1; if(num1>99999999) error(); else

{array[7]=(uchar)(num1/10000000); array[6]=(uchar)(num1%10000000/1000000); array[5]=(uchar)(num1%1000000/100000); array[4]=(uchar)(num1%100000/10000); array[3]=(uchar)(num1%10000/1000); array[2]=(uchar)(num1%1000/100); array[1]=(uchar)(num1%100/10);

array[0]=(uchar)(num1%10); while(i>0&&F0) {if(array[i]==0x00) {array[i]=0x10; i--;

}

else F0=0; } } }

void jia(void)//"加运算"子函数 {num1+=num2; }

void jian(void)//"减运算"子函数{uchar i; if(num1>num2) {num1-=num2; bian2(); }

else if(num1==num2) {for(i=1;i<8;i++) array[i]=0x10; array[0]=0x00;

}

else

{num1=num2-num1; bian2(); …… 此处隐藏:5065字,全部文档内容请下载后查看。喜欢就下载吧 ……

科学计算器设计报告(51单片机).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1111075.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)