AT89C51单片机C实现简易计算器
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计一、引言在现代社会中,计数器是一种非常常见的电子设备,它可以对某一事件或物体进行计数,并对计数结果进行显示、记录或控制。
计数器广泛应用于工业控制、电子设备、仪器仪表等领域。
本文将基于AT89C51单片机设计一款简单的计数器,并通过实验来验证其功能。
二、AT89C51单片机简介AT89C51是一款由意法半导体公司(STMicroelectronics)生产的一款高性能、低功耗的单片机芯片。
它具有8位的CPU、4KB的Flash存储器、128B的RAM,以及32个通用I/O 端口。
AT89C51单片机集成了多种功能模块,包括定时器、串行通信接口、中断控制器等,适合于需要较高性能的嵌入式系统。
三、计数器设计1. 硬件设计在本设计中,我们将使用AT89C51单片机作为核心控制器,外接数码管进行计数结果的显示。
我们还将使用按键进行计数器的操作,包括计数、清零等功能。
硬件电路设计如下:- AT89C51单片机- 7段数码管(共阳极)- 74595移位寄存器- 按键- 电阻、电容等元件2. 软件设计在软件设计中,我们将使用C语言编程,并调用单片机的相关接口函数来实现计数器的功能。
主要包括以下几个方面的功能:- 初始化:对单片机的相关GPIO口进行初始化,包括数码管、按键等。
- 计数:通过按下计数按钮触发计数功能,将计数结果存储在单片机内部的变量中。
- 显示:将计数结果显示在数码管上,通过74595移位寄存器进行驱动。
- 清零:通过按下清零按钮触发清零功能,将计数结果清零。
四、实验验证为了验证上述设计的正确性,我们将进行一个实验。
我们将使用AT89C51单片机、数码管、按键等元件进行搭建,然后编写软件程序进行测试。
1. 硬件搭建我们需要按照硬件设计的原理图进行搭建。
将AT89C51单片机、数码管、按键等元件按照原理图连接好,并进行电源连接。
2. 软件编程接下来,我们需要编写C语言程序,将程序下载到单片机中。
基于AT89C51单片机C语言编写的计算器

基于AT89C51单片机C语言编写的计算器#include<reg52.h>#define uint unsigned int#define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0}; uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void display(uchar aa);void main(){num=17;dula=1;P0=0;dula=0;wela=1;P0=0xc0;wela=0;while(1){display(keyscan());}}void display(uchar aa){dula=1;P0=table[aa-1];dula=0;}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0; while(temp!=0xf0) {delay(5);temp=P3;temp=temp&0xf0; while(temp!=0xf0) {temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0; while(temp!=0xf0) {delay(5);temp=P3;temp=temp&0xf0; while(temp!=0xf0) {temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0; while(temp!=0xf0) {temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}/***************89C51单片机【计算器】C语言程序******************//**************** P2位选P0段选时钟12MHZ *********************/#include<reg52.h> /*包含的头文件*/ #define uchar unsigned char /* 宏定义*/#define uint unsigned intuchar Led[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,0x6d, 0x7d, 0x07, 0x7f,0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,0x00}; /* 数码管段选*/long float Number[]={0,0,0,0}; /* 数码管显示位控制寄存器*/ucharA[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; long int D[] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器uchar code C[] = {0x0, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; /* 数码管位选*/ /* 列扫描控制LED 1位2位3位4位5位6位7位8位*/uchar k=16; /* 按键对外控制*/uchar b; /* 按键【+】【-】【*】【/】对外的控制*/long float Out_put; /* 定义变量【Out_put】作为结果*/uchar e=0; /* 数字的位存储递进的控制*/ uchar g=0; /* 运算方式的控制变量*/uchar L=0; /* 运算方式的控制变量*/uchar g1=0; /* 运算方式的控制变量*/uchar g2=0; /* 运算方式的控制变量*/uchar g3=0; /* 运算方式的控制变量*/uchar g4=0; /* 运算方式的控制变量*/char j=-1; /* 与Number[]数组连用*/uchar m=0; /* 按键【=】的控制变量*/uchar n=0; /* 按键【.】的控制变量*/uchar x=0; /* 小数点个数的记录变量*/ uchar xo=0; /* 控制开始计数小数点的变量*/long int result;void Delay(uint o) /* 延时函数delay() 的定义*/{uint i,j;for(i = 0; i < o; i++){for(j = 0; j < 121; j++) {;}}}void show(long float Out_put){ uchar r;uchar k;long int q,p;uchar s=0;uchar i;long int temp;temp=Out_put ;if( (Out_put-temp)!=0) {result=Out_put*10000;r=4;}else { result=Out_put; r=0; }p=result;if(m==1){if(result<0){ result=-result; p=result;q=result; for(i=1;i<=8;i++) { q=q/10; if(q==0) {k=i;i=9; } } P0=0x40; P2=C[8-k];Delay(1); } //负号的显示P0=0x80; P2=C[r]; Delay(1); P0=0x00;result=p;P0=Led[result%10]; P2=C[8]; result=result/10;Delay(1);if( (result%10==0)&&(result%100==0)&&(result %1000==0)&&(result%10000==0)&&(result%1000 00==0)&&(result%1000000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[7];result=result/10; Delay(1);}if( (result%10==0)&&(result%100==0)&&(result %1000==0)&&(result%10000==0)&&(result%100000==0) ) {P0=0x00;}else {P0=Led[result%10]; P2=C[6];result=result/10; Delay(1);}if( (result%10==0)&&(result%100==0)&&(result %1000==0)&&(result%10000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[5];result=result/10; Delay(1);}if( (result%10==0)&&(result%100==0)&&(result%1000==0) ) {P0=0x00;}else {P0=Led[result%10]; P2=C[4];result=result/10; Delay(1);}if( (result%10==0)&&(result%100==0) ) {P0=0x00;}else {P0=Led[result%10]; P2=C[3];result=result/10; Delay(1);}if( (result%10==0) ) {P0=0x00;}else {P0=Led[result%10]; P2=C[2];result=result/10; Delay(1);}if(result==0) {P0=0x00;}else {P0=Led[result%10]; P2=C[1];result=result/10; Delay(1);}}}void In_put() // 输入函数输入小数加小数点{uchar i;if(k>=0&&k<=9)switch(e){case 8: D[7]=D[6];A[7]=A[6]; //用来存放数值 case 7: D[6]=D[5];A[6]=A[5];case 6: D[5]=D[4];A[5]=A[4];case 5: D[4]=D[3];A[4]=A[3];case 4: D[3]=D[2];A[3]=A[2];case 3: D[2]=D[1];A[2]=A[1];case 2: D[1]=D[0];A[1]=A[0];case1: if(n==0) { D[0]=k; A[0]=Led[k]; if(xo==1) x++; }if(n==1) { A[0]=Led[k]|0x80; xo=1; n=0;}}if(k>=11&&k<=15&&b==1){ switch(k){case 11: g1++;g++;if(g2==1) L=1; if(g3==1) L=2;if(g4==1) L=3;break; // +case 12: g2++;g++;if(g1==1) L=4; if(g3==1) L=5; if(g4==1) L=6;break; // -case 13: g3++;g++;if(g1==1) L=7; if(g2==1) L=8; if(g4==1) L=9;break; // *case 14: g4++;g++;if(g1==1) L=10;if(g2==1)L=11;if(g3==1) L=12;break; // /}j++;Number[j]=10000000*D[7]+1000000*D[6]+10000 0*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];for(i=1;i<=x;i++){Number[j]=(float)Number[j]/10;}x=0;for(i=0;i<=7;i++) // 数据存储器清零D[i]=0;for(i=0;i<=8;i++) // 数据显示清零{A[i]=0x00;}b=0;e=0;xo=0;}}void Key_scan() // 键盘扫描函数Key_scan(){unsigned char X,Y,Z;P3 = 0xff;P3 = 0x0f; //先对P2置数行扫描if(P3!=0x0f) //判断是否有键按下{Delay(20); //延时10ms,软件去干扰if(P3!=0x0f) //确认按键按下;{X=P3; //保存行扫描时有键按下时状态P3=0xf0; //列扫描Y=P3; //保存列扫描时有键按下时状态Z=X|Y; //取出键值while(P3!=0xf0); // 按键防止抖动 switch ( Z ) //判断键值(那一个键按下){case 0xe7: k=0; e++; In_put(); break; //数字【0】case 0xd7: k=1; e++; In_put(); break; //数字【1】case 0xdb: k=2; e++; In_put(); break; //数字【2】case 0xdd: k=3; e++; In_put(); break; //数字【3】case 0xb7: k=4; e++; In_put(); break; //数字【4】case 0xbb: k=5; e++; In_put(); break; //数字【5】case 0xbd: k=6; e++; In_put(); break; //数字【6】case 0x77: k=7; e++; In_put(); break; //数字【7】case 0x7b: k=8; e++; In_put(); break; //数字【8】case 0x7d: k=9; e++; In_put(); break; //数字【9】case 0xeb: n=1; In_put(); break; //小数点【 .】case 0x7e: k=11;b=1; In_put(); break; //字符【B +】case 0xbe: k=12;b=1; In_put(); break; //字符【C -】case 0xde: k=13;b=1; In_put(); break; //字符【D *】case 0xee: k=14;b=1; In_put(); break; //字符【E /】case 0xed: k=15;m=1;b=1;In_put();break; //字符【F =】}}}}void Yun_suan(){if(g1==1&&g==1) Out_put=Number[0]+Number[1];if(g2==1&&g==1)Out_put=Number[0]-Number[1];if(g3==1&&g==1) Out_put=Number[0]*Number[1];if(g4==1&&g==1)Out_put=Number[0]/Number[1];if(g1==2&&g==2)Out_put=Number[0]+Number[1]+Number[2];if(g2==2&&g==2)Out_put=Number[0]-Number[1]-Number[2]; if(g3==2&&g==2) Out_put=Number[0]*Number[1]*Number[2];if(g4==2&&g==2)Out_put=Number[0]/Number[1]/Number[2];if(L==1) Out_put=Number[0]-Number[1]+Number[2];if(L==2) Out_put=Number[0]*Number[1]+Number[2];if(L==3) Out_put=Number[0]/Number[1]+Number[2];if(L==4) Out_put=Number[0]+Number[1]-Number[2];if(L==5) Out_put=Number[0]*Number[1]-Number[2];if(L==6) Out_put=Number[0]/Number[1]-Number[2];if(L==7) Out_put=Number[0]+Number[1]*Number[2];if(L==8) Out_put=Number[0]-Number[1]*Number[2];if(L==9) Out_put=Number[0]/Number[1]*Number[2];if(L==10)Out_put=Number[0]+Number[1]/Number[2];if(L==11)Out_put=Number[0]-Number[1]/Number[2];Out_put=Number[0]*Number[1]/Number[2];}void Xian_shi(){if(m!=1){Key_scan();/* 显示函数与A[i]有关*/P0=A[0]; P2=C[8];Delay(1);P0=A[1]; P2=C[7];Delay(1);P0=A[2]; P2=C[6];Delay(1);P0=A[3]; P2=C[5];Delay(1);P0=A[4]; P2=C[4];Delay(1);P0=A[5]; P2=C[3];Delay(1);P0=A[6]; P2=C[2];Delay(1);P0=A[7]; P2=C[1];Delay(1);}}void main(){{Xian_shi();Yun_suan();show( Out_put );}}。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计
计数器是一种常见的电子设备,用于实现对输入信号的计数。
基于AT89C51单片机的计数器设计,可以实现对输入信号的计数,并且可以将计数结果显示出来。
我们需要准备以下器件和材料:
1. AT89C51单片机:这是一款8位微控制器,具有丰富的输入输出功能。
2. 数码管:用于显示计数结果。
3. 按钮开关:用于输入计数信号。
接下来,我们可以按照以下步骤进行计数器的设计。
1. 连接电路:将数码管和按钮开关分别与AT89C51单片机的IO口相连。
数码管的引脚与单片机的IO口相连,按钮开关一个端接地,另一个端接单片机的IO口。
2. 编写程序:使用汇编语言或C语言编写单片机的程序。
可以使用单片机的计时器中断来实现计数功能。
在程序中,首先需要初始化单片机,并将IO口设置为输入或输出。
3. 实现计数功能:在程序中,通过判断按钮开关的状态,来决定是否对计数器进行加一或减一操作。
当按钮开关按下时,将计数器加一或减一,并将计数结果显示在数码管上。
4. 程序调试:将程序下载到单片机上,并连接电源。
通过按下按钮开关,观察数码管上计数结果的变化,可以判断程序的正确性。
如果发现计数结果不正确,可以通过调试程序来解决问题。
5. 优化设计:根据实际需求,可以对计数器的功能进行优化。
可以增加清零按钮,用于将计数器清零;可以增加计数范围限制,当计数器达到上限或下限时,禁止继续计数。
基于单片机的简单计算器设计与仿真

基于单片机的简单计算器设计与仿真摘要:本文提出了一种基于单片机的简单计算器设计方案,并进行了仿真分析。
本设计采用AT89C51单片机作为控制核心,通过按键、液晶显示屏和蜂鸣器等外围电路,实现对基本四则运算的支持。
在仿真过程中,对电路进行了功能测试和性能分析,结果表明本设计方案具有较好的实用性和稳定性。
关键词:单片机;计算器;AT89C51;仿真1.引言计算器作为一种常见的电子设备,在日常生活中具有广泛的应用。
随着科技的进步,基于单片机的计算器在设计中得到了广泛应用。
本文旨在设计一种基于单片机的简单计算器,并通过仿真分析其性能。
2.设计方案2.1控制核心本设计采用AT89C51单片机作为控制核心。
AT89C51是一种常用的8位单片机,具有强大的功能和稳定的性能,在计算器的设计中具有良好的适用性。
2.2外围电路本设计的外围电路主要包括按键、液晶显示屏和蜂鸣器。
2.2.1按键本设计采用4个按键,分别是“0”、“1”、“2”和“+”。
按下按钮时,单片机通过外部中断方式检测到按键动作,并进行相应的操作。
2.2.2液晶显示屏本设计使用16x2液晶显示屏,用于显示计算结果和输入的数字。
单片机通过串行通信方式与液晶显示屏进行数据交互。
2.2.3蜂鸣器本设计的蜂鸣器用于发出计算结果。
当计算结束后,单片机通过IO 口控制蜂鸣器,发出相应的声音。
3.仿真与结果分析在完成电路设计后,我们使用Proteus软件进行仿真分析。
仿真过程主要包括功能测试和性能分析。
3.1功能测试在仿真过程中,我们进行了基本的四则运算测试,包括加法、减法、乘法和除法。
结果表明,计算器在输入正确的操作符和数字后,能够正确计算并显示结果。
3.2性能分析在性能分析中,我们主要关注计算器的稳定性和响应速度。
经过多次测试,计算器的稳定性较好,能够稳定运行并显示正确的结果。
响应速度方面,计算器在按下按键后能够迅速进行计算并显示结果。
4.结论本文设计了一种基于单片机的简单计算器,并通过仿真分析验证了其功能和性能。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出功能的芯片,广泛应用于嵌入式系统中。
AT89C51单片机是英特尔公司生产的一款典型的8位微控制器,其具有强大的功能和灵活的设计特性,被广泛应用于工业控制、汽车电子、消费类电子产品等领域。
在众多应用中,计数器是一种常见的电子器件,被广泛应用于各种领域,比如工业控制、实验测量、智能家居等。
基于AT89C51单片机的计数器设计,可以实现对信号的计数和显示,具有较高的稳定性和可靠性。
本文将介绍基于AT89C51单片机的计数器设计。
首先介绍AT89C51单片机的基本特性和引脚布局,然后讨论计数器的原理和设计思路,最后给出具体的设计方案和实现步骤。
一、AT89C51单片机的基本特性和引脚布局AT89C51是一款高性能、低功耗的8位CMOS微控制器,其主要特性包括:1. 内置4KB闪存程序存储器,用于存储用户程序;2. 128字节RAM,用于存储临时数据和寄存器;3. 32个通用I/O引脚,用于连接外部器件和传感器;4. 完整的串行通信接口(UART),用于与外部设备进行通信;5. 定时器/计数器和PWM输出,用于实现各种定时和计数功能;6. 多种工作模式选择,包括被动低功耗模式和中断工作模式。
AT89C51单片机的引脚布局如下图所示:(图片)P0、P1、P2和P3是AT89C51单片机的四个通用I/O端口,分别具有8个引脚,用于连接外部设备和传感器。
X1和X2是晶体振荡器的输入和输出端,用于提供时钟信号。
RESET 是复位端,用于复位单片机。
EA和PSEN是扩展ROM控制端和程序存储器的读取端,用于外接ROM和实现程序存储。
ALE/PROG是地址锁存器的输入,用于地址总线的多路选择。
RXD 和TXD是串行通信接口的接收和发送端口,用于与外部设备进行通信。
二、计数器的原理和设计思路计数器是一种常用的数字电路,用于对输入信号进行计数和显示。
AT89C51单片机简易计算器的设计

AT89C51单片机简易计算器的设计单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。
设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。
显示采用字符LCD静态显示。
软件方面使用C语言编程,并用PROTUES仿真。
一、总体设计根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。
》(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。
系统模块图:二、硬件设计(一)、总体硬件设计/本设计选用AT89C51单片机为主控单元。
显示部分:采用LCD 静态显示。
按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。
总体设计效果如下图:(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
毕业设计(论文)-基于AT89C51单片机的简易计算器设计

计算器(Calculator)是微型电子计算机的一种特殊类型。
它与一般通用计算机的主要区别在于程序输入方式的不同。
计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。
现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。
目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。
等调试成功后,其它运算子程序的问题将迎刃而解。
引言 (1)目录 (2)1.简易计算器的设计方案 (3)1.1硬件部分设计方案 (3)1.2软件部分设计 (3)1.3 硬件设计原理图 (4)2. 简易计算器部分电路设计 (5)2.1 AT89C51常用指令 (5)2.2 显示及显示接口 (11)2.3 键盘、液晶显示的组合接口 (15)2.4 算术逻辑运算处理 (18)3.总设计电路及调试 (19)致谢 (21)参考文献 (22)1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计AT89C51单片机是一种常用的8位单片机,具有计数器功能。
本文将介绍基于AT89C51单片机的计数器设计。
计数器是一种常用的电子设备,用于统计某个事件发生的次数。
在数字电子技术中,计数器可以通过使用触发器和逻辑门来实现。
在AT89C51单片机中,可以通过编程控制来实现计数器功能。
我们需要通过编程配置AT89C51单片机的IO口,使其能够作为计数器的输入和输出端口。
我们可以使用P1口作为计数器的输入端口,通过外部信号来触发计数器的计数动作。
我们可以使用P2口作为计数器的输出端口,将计数结果显示出来。
接下来,我们需要编写程序来实现计数器的功能。
程序的基本思路是通过中断来实现计数器的自动计数。
当接收到外部信号时,中断服务程序会自动执行,对计数器的计数值进行更新,并将结果输出到P2口。
我们可以通过按键来控制计数器的启动和暂停。
具体编程步骤如下:1. 配置P1口和P2口为输入和输出模式,分别作为计数器的输入和输出端口。
2. 初始化计数器的计数值为0。
3. 配置中断,并编写中断服务程序。
中断服务程序在接收到外部信号时,会自动执行,对计数器的计数值进行更新,并将结果输出到P2口。
4. 编写按键处理程序。
按键处理程序会检测按键的状态,如果按下则启动计数器,再次按下则暂停计数器。
5. 主程序中,循环检测按键状态,并根据按键状态调用相应的处理程序。
通过以上步骤,我们可以实现基于AT89C51单片机的计数器设计。
这个设计可以广泛应用于各种计数需求的场合,如物料计数、人员计数等。
基于AT89C51单片机的计数器设计具有成本低、可靠性高等优点,适合在工业控制和自动化领域进行应用。
基于AT89C51单片机的计数器设计是一项有趣且实用的工程,通过合理的硬件配置和编程设计,可以实现各种计数需求的应用。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计AT89C51是一种8位单片机,它具有中央处理器、存储器和输入/输出功能,适用于各种应用。
在本设计中,我们将基于AT89C51单片机来设计一个计数器。
我们需要连接AT89C51单片机和外部硬件电路。
计数器通常需要一个外部计时源来提供脉冲输入,并且需要一个数码管显示结果。
我们需要连接一个计时源(例如晶体振荡器)到单片机的外部时钟引脚,并连接一个共阳数码管到单片机的输出引脚。
我们还需要连接一些按钮到单片机的输入引脚,用于开始、暂停和复位计数器。
接下来,我们需要编写单片机的程序代码。
程序代码将实现计数器的功能,包括计数、显示和控制操作。
我们需要定义一些变量来记录计数器的状态。
我们可以定义一个变量来存储当前计数的值,一个变量来存储计数是否正在进行中的标志,以及一个变量来存储计数方向(递增或递减)的标志。
然后,我们可以在主程序循环中开始实现计数器的功能。
主程序循环可以使用一个无限循环来保持计数器一直运行,并且可以通过检测按钮的状态来控制计数器的操作。
如果开始按钮按下,则设置计数进行中的标志,并且根据计数方向的标志进行递增或递减操作。
如果暂停按钮按下,则清除计数进行中的标志,停止计数操作。
如果复位按钮按下,则将计数器的值重置为初始值,并且清除计数进行中的标志。
在每次计数操作后,我们需要将计数器的值显示在数码管上。
可以使用数码管的显示函数来将计数器的值转换为对应的数字,并将其输出到数码管的引脚上,从而实现数字的显示。
为了保证计数器的精确性,我们需要添加一些延时函数来控制计数的速度。
可以使用单片机的定时/计数器功能来实现延时功能。
定时/计数器可以设置为特定的计时频率,并且可以通过定时器中断来控制延时的时间。
基于AT89C51单片机的计数器设计需要连接外部硬件电路,并编写相应的程序代码来实现计数、显示和控制操作。
通过合理的硬件连接和程序设计,可以实现一个功能完善的计数器。
基于AT89C51的十进制计算器设计

基于AT89C51的十进制计算器设计
引言
本系统采用AT89C51 单片机作为控制器,用来实现实现四位数的+,-,*,/ 运算,运算结果通过数码管显示,并具有有清零功能。
AT89C51 具有如下特点:40 个引脚,4k BytesFlash 片内程序存储器,128 bytes 的随机存取数据存储器(RAM),32 个外部双向输入/ 输出(I/O)口,5 个中断优先级2 层中断嵌套中断,2 个16 位可编程定时计数器,2 个全双工串行通信口,看门狗(WDT) 电路,片内时钟振荡器。
1 总体设计方案
1.1 系统组成与工作原理
本系统以51 单片机为主控核心,与矩阵键盘、晶振、LED 显示管模块一起组合而成。
其工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,得出按键值,单片机则对数据进行储存与相应的处理转换,之
后送入数码管动态显示。
将运算结果送入数码管动态显示。
本设计只能进行结
果不超过四位数的运算,其功能如下:
(1)数字键0 到9 用数码管显示。
(2)加法运算:加数与被加数均不能超过9999,加法最终结果不能超过9999。
(3)减法运算:减法运算正常逻辑为大的数值减去小的数值,本计算器
亦如此,只能进行正常逻辑的运算,如为小的数值减去大的数值,则将得到的
负数与535 相加,得到相应的结果,即如果想进行小数减大数的运算,则把得到的结果减去535 即得到负数的正确结果。
(4)乘法运算:与上述方法一样,计算结果不能超出9999,如溢出则显示。
制作AT89C51制作的简单计数器

制作AT89C51制作的简单计数器时间:2013-01-13 18:25来源:网络作者:网络整理点击: 132 次免费提供各种电子制作文章、资料、图纸图中可以看到本制作的首要焦点电路是用AT89C51构成的按键取值电路,S3S4别离节制计数值的加减。
数码管行使的是共阳极通过3906节制。
这个计数器首要用于对键的按键次数计数,用于鼠标中的微按钮或其余按钮做QC测试用。
以是在软件顶用了取两次按时刻断的键值做较量以到达简朴防发抖和取健值的目标。
读者伴侣可以自行修改措施以得当本身的电路。
本计数器的计数范畴为0-999999,最大的频率为50Hz,虽然这些参数都可以按照必要调解。
措施行使的是汇编延时措施,可以改用C写,没有任何关系只是我偷懒从旧的措施中拷过来用。
道理图:实物图:措施如下:#include <AT89X51.H>#define Key_UP P3_6 //上调#define Key_DOWN P3_7 //下调#define LED P0#define LED1 P2_2 //LED节制#define LED2 P2_3 //LED节制#define LED3 P2_4 //LED节制#define LED4 P2_5 //LED节制#define LED5 P2_6 //LED节制#define LED6 P2_7 //LED节制unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳0-9的LED笔划static unsigned char bdata Key; //可位寻址的状态寄存器sbit NewKeyUP = Key ^ 0;sbit NewKeyDOWN = Key ^ 1;sbit OldKeyUP = Key ^ 2;sbit OldKeyDOWN = Key ^ 3;static unsigned long data Count;static unsigned char LEDN[6];void main(void){void Delay_510(void);Count = 0; //初始化变量Key = 0;EA = 1; //应承CPU间断ET0 = 1; //按时器0间断打开TMOD = 0x1; //设按时器0为模式1,16位模式TH0=0xB1;TL0=0xDF; //设按时值为20000us(20ms)TR0 = 1; //开始按时while(1);}//按时器0间断外理中键扫描和表现void KeyAndDis_Time0(void) interrupt 1 using 2{TH0=0xB1;TL0=0xDF; //设按时值为20000us(20ms)NewKeyUP = Key_UP; //取新的键值NewKeyDOWN = Key_DOWN;if (!OldKeyUP && NewKeyUP) //键铺开时,这里的间断为20ms阁下(按时值非自动装载以是多于20ms)Count++;if (!OldKeyDOWN && NewKeyDOWN)Count--; //这里Conut为int 没有做负数等处理赏罚,有必要自行加上if (Count>999999)Count = 999999;LEDN[5]=Count/100000;LEDN[4] = (Count-100000*(long)LEDN[5])/10000;LEDN[3] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4])/1000;LEDN[2] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3])/100;LEDN[1] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2])/10;LEDN[0] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2]-10*(long)LEDN[1]);LED=LEDDis[LEDN[5]];LED6 = 0;Delay_510();LED6 = 1;LED=LEDDis[LEDN[4]];LED5 = 0;Delay_510();LED5 = 1;LED=LEDDis[LEDN[3]];LED4 = 0;Delay_510();LED4 = 1;LED=LEDDis[LEDN[2]];LED3 = 0;Delay_510();LED3 = 1;LED=LEDDis[LEDN[1]];LED2 = 0;Delay_510();LED2 = 1;LED=LEDDis[LEDN[0]];LED1 = 0;Delay_510();LED1 = 1;OldKeyUP = NewKeyUP; OldKeyDOWN = NewKeyDOWN; }void Delay_510(void) //延时510微秒{#pragma asmMOV R0,#7DHMOV R1,#02HTSR1:DJNZ R0,TSR1MOV R0,#7DHDJNZ R1,TSR1#pragma endasm}(责任编辑:admin)。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计一、引言计数器是数字电路中常见的一种组合逻辑电路,用于对输入脉冲信号进行计数和累加操作,常用于计数、测频、分频等场合。
AT89C51单片机是一种常用的8位微控制器,具有丰富的外设和功能,能够灵活应用于各种数字电路设计中。
本文将基于AT89C51单片机,设计一个简单的计数器,并介绍其原理和实现方法。
二、设计原理AT89C51单片机具有丰富的外设资源,包括多种定时器、计数器和串行通信接口等,适合用于计数器设计。
在本设计中,我们将使用AT89C51的定时器/计数器功能,通过编程控制实现一个简单的计数器。
具体设计原理如下:1. 硬件设计:基于AT89C51单片机的计数器由单片机、数码管、脉冲输入端和其他外围电路组成。
其中脉冲输入端接收外部脉冲信号作为计数输入,数码管用于显示计数结果。
2. 软件设计:利用AT89C51的定时器/计数器功能,编程设计实现计数器的逻辑功能。
通过中断控制和计数器清零等操作,实现对脉冲输入信号的计数和累加,并将结果通过数码管显示出来。
三、设计实现1. 硬件连接:首先进行硬件连接,将AT89C51单片机与数码管、外部脉冲信号输入端等进行连接。
通常可以通过引脚连接或者扩展模块等方式进行连接。
2. 软件编程:接下来进行软件编程,通过C语言或汇编语言等进行编程设计。
其中需要实现对定时器/计数器的初始化、中断服务函数的编写、脉冲输入的捕获和计数功能的实现等操作。
3. 调试验证:编程完成后,进行调试验证,对设计的计数器进行功能测试和性能评估。
通过输入不同的脉冲信号进行测试,验证计数器的计数和显示功能是否正常。
四、设计优化在设计过程中,可以对基于AT89C51单片机的计数器进行优化,以提高其性能和稳定性。
具体优化方法如下:1. 硬件优化:在硬件设计中,可以采用更稳定和精密的外部时钟源、优化数码管驱动电路、加入防抖电路等,以提高计数器的稳定性和抗干扰能力。
2. 程序优化:在软件编程中,可以优化计数算法和显示方式,减少计数误差和提高显示效果。
基于51单片机的简易教学计算器设计

基于51单片机的简易教学计算器设计设计目的:本设计旨在基于51单片机实现一个简易的教学计算器,可以进行基本的四则运算,并具备一些辅助功能,帮助学生进行数学计算和学习。
设计要求:1.显示器:使用液晶显示器(LCD)来显示操作数和计算结果。
2.键盘输入:设计一个按键矩阵作为输入设备,用于输入数字和操作符。
3.四则运算:实现加法、减法、乘法和除法四种基本运算。
4.辅助功能:提供开平方、取倒数等辅助功能。
5.界面友好:界面清晰、操作简单。
硬件设计:1.51单片机(AT89C52):作为计算器的核心芯片,控制程序运行和与外围设备的交互。
2.液晶显示器(LCD):用于显示操作数和计算结果。
3.按键矩阵:用于输入数字和操作符。
4.运算模块:用于进行四则运算和辅助功能计算。
软件设计:1.系统初始化:初始化51单片机和LCD屏幕,设置键盘矩阵的引脚。
2.输入处理:通过按键矩阵检测用户输入,并将输入的字符存储在缓冲区中。
3.表达式计算:根据用户输入的表达式,通过逆波兰表达式算法将其转换为后缀表达式,并进行计算得到结果。
4.显示结果:将计算结果显示在LCD屏幕上。
5.辅助功能:根据用户选择的辅助功能,进行相应的计算,并显示结果。
6.重置功能:提供清零功能,将计算器的状态和显示结果重置。
操作流程:1.系统初始化:开机时,系统进行初始化,屏幕显示“计算器”字样。
2.输入操作数和操作符:用户通过按键矩阵输入操作数和操作符。
3.计算结果:用户输入“=”符号后,计算器根据输入的表达式进行计算,并将结果显示在LCD屏幕上。
4.辅助功能:在计算结果显示完成后,用户可选择进行辅助功能,如开平方、取倒数等操作。
5.重置功能:用户可通过按下“C”键进行重置,将计算器状态和显示结果清零。
总结:本设计基于51单片机实现了一个简易的教学计算器,具备基本的四则运算功能和一些辅助功能。
其使用液晶显示器作为显示设备,利用按键矩阵进行输入操作,通过逆波兰表达式算法进行计算,并将结果显示在屏幕上。
AT89C51单片机C实现简易计算器

AT89C51单片机简易计算器的设计一、总体设计根据功能和指标要求,本系统选用MCS-5系列单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD显示数据和结果。
(2)另外键盘包括数字键(0〜9)、符号键(+、、x、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCDt输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCDt显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCDt提示溢出;当除数为0时,计算器会在LCD 上提示错误。
系统模块图:二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。
显示部分:采用LCD静态显示。
按键部分:采用 4*4键盘;利用MM74C92为4*4的键盘扫描IC ,读取输入的键值。
总体设计效果如下图:禺弱蚯>9上bdJlBtJII卜0bk圏】系喘方案图3- -Od 右□ P -C3 1X1 ih- -F I !i ■ ■ ■ B. SK I :就 疔*AJH31 TT3S ■ Nt PI 1Ph J Pl ;PIT PI f.Pll ; 和 ILdfl fD l.-U Fp7j<T r :心ny^ui PFL * ■、工世 鬥沁I *1 ell H ir*j : ■J.tmi =7 muBn ,二 pj ..nir P3⑷ p i*/n 叩.033. ft::r^jub.a:■ . H 1 -E L " H 也 cjzj HBCn “心《.一一「丁 g -...宁"hfL;i 【巒 1— ■ ..2M_ 0 31(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计一、引言AT89C51是一款功能强大的8位单片机,具有丰富的外设和广泛的应用领域。
计数器是单片机应用中常见的功能模块,可以用于测量时间、统计事件次数等。
本文将介绍基于AT89C51单片机的计数器设计,通过软件和硬件相结合的方式,实现一个简单的计数器功能。
二、AT89C51单片机概述AT89C51是Atmel公司生产的一款典型的8位单片机,具有4KB的内部Flash存储器、128字节的RAM、32个I/O引脚以及定时器、串口等丰富的外设。
它采用的是CISC架构,指令集丰富,易于学习和应用。
AT89C51单片机广泛应用于各种嵌入式系统中,包括工业控制、仪器仪表、家电等领域。
三、计数器设计思路在AT89C51单片机中,可以利用其内部的定时器和外部的计数输入引脚,来实现一个简单的计数器功能。
通过配置定时器和外部中断,可以实现对外部信号的计数。
四、软件设计1. 定时器配置我们需要配置定时器作为计数器的计时基准。
AT89C51单片机具有两个定时器,分别为定时器0和定时器1。
在本设计中,我们选择使用定时器0作为计数器的计时基准。
定时器0是一个16位的定时器,可以通过预置初值和计数溢出中断来实现定时功能。
2. 外部中断配置我们需要配置外部中断来实现对外部信号的计数。
AT89C51单片机具有两个外部中断引脚,分别为INT0和INT1。
在本设计中,我们选择使用INT0引脚来接收外部信号,并实现计数功能。
通过配置外部中断0,当外部引脚的信号发生边沿变化时,可以触发外部中断,从而实现对外部信号的计数。
3. 主程序设计在主程序中,我们需要编写相应的中断服务程序来处理定时器0的溢出中断和外部中断0的触发。
在定时器0的溢出中断服务程序中,可以进行计数器的计数逻辑,而在外部中断0的触发中断服务程序中,可以实现计数器的清零和其他操作。
五、硬件设计1. 外部信号输入我们需要设计一个外部信号的输入电路,用于接收外部信号并输入到AT89C51单片机的INT0引脚。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计一、引言计数器是数字电路中常用的一种电子仪器,用于计算和记录某一事件的频率、周期和脉冲等。
在数字系统中,计数器可以用来实现频率测量、计时器、分频器和脉冲发生器等功能。
本文将基于AT89C51单片机设计一款简单的计数器,用于演示单片机的基本应用和原理。
二、AT89C51单片机简介AT89C51是由Atmel公司生产的一款8位单片机,采用CMOS工艺制造,具有4KB Flash 存储器、128B RAM和32个I/O端口。
其主要特点包括:8位CPU,时钟经过12个时钟脉冲产生1个机器周期,最大工作频率为24MHz,具有2个16位定时/计数器。
三、设计方案基于AT89C51单片机的计数器设计,我们选用其中的一个16位定时/计数器,并通过编程实现计数功能。
设计方案如下:1.使用定时/计数器模块,设置计数器的初始值为0;2.定时/计数器开始计数,每经过一个时钟周期,计数值加1;3.设计好显示模块,将计数器的值通过数码管或LCD显示出来。
四、硬件设计1.单片机选用AT89C51;2.外部晶振选用11.0592MHz,供单片机工作使用;3.数码管模块,用于显示计数器的值;4.按键模块,用于控制计数器的启停及清零操作。
1.初始化程序,设置好定时/计数器和I/O口的工作状态;2.编写中断服务程序,用于定时/计数器溢出时的处理;3.编写计数器启动、停止及清零的控制程序;4.编写主循环程序,实现计数器的实时显示。
六、程序框图七、程序设计八、实验结果经过硬件和软件的设计与开发,成功实现了基于AT89C51单片机的计数器。
在实验中,通过外部晶振驱动单片机,定时/计数器得到了准确的计数值,并通过数码管显示模块实时显示出来。
按键模块可以实现计数器的启停及清零操作。
实验结果符合设计要求,可以满足基本的计数功能。
九、总结本文基于AT89C51单片机设计了一款简单的计数器,通过硬件和软件的设计和开发,实现了对定时/计数器的使用及控制。
基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计引言单片机作为嵌入式系统的核心部件,在各种领域中得到了广泛的应用。
而计数器作为数字电路中的基本组成部分,也是单片机设计中常见的功能之一,它可以在很多场合中发挥重要作用。
本文将介绍基于AT89C51单片机的计数器设计,通过这一设计可以更好地理解单片机的工作原理和应用。
一、AT89C51单片机简介AT89C51是一款由Atmel公司生产的8位微控制器,它是一种高性能、低功耗的单片机产品。
AT89C51采用CMOS技术制造,具有很高的集成度和稳定性,可以广泛应用于工业控制、仪器仪表、家用电器等领域。
AT89C51单片机具有4KB的闪存程序存储器、128B的RAM、32个输入/输出管脚、定时器、串行通信接口等丰富的外设功能。
它采用了经典的的8051内核架构,具有强大的数据处理和控制能力。
二、计数器的设计原理计数器是一种能够对输入脉冲信号进行计数的电子装置,通常用于测量时间、频率、脉冲数量等。
在单片机中,通过利用定时器/计数器模块可以实现对脉冲信号的计数功能。
AT89C51单片机内部集成了定时器/计数器模块,可以方便地实现计数器的设计。
在AT89C51单片机中,定时器/计数器模块包括定时/计数控制寄存器TCON、定时/计数器模式寄存器TMOD、定时器/计数器0寄存器TH0和TL0、定时器/计数器1寄存器TH1和TL1、定时器/计数器中断寄存器IE等。
通过设置这些寄存器的值和操作方式,可以实现不同类型的计数器功能。
三、基于AT89C51的计数器设计下面以一个简单的脉冲计数器为例,介绍基于AT89C51的计数器设计过程。
该设计将利用单片机的定时器/计数器模块来实现对外部脉冲信号的计数。
1. 硬件设计需要准备AT89C51单片机开发板、LED灯、电阻、脉冲信号输入端口等硬件元件。
将AT89C51单片机与LED灯、电阻连接,将脉冲信号引入单片机的外部中断端口,以便单片机可以接收外部的脉冲信号。
基于AT89C51单片机简易计算器的设计说明

现实生活中人们熟知的计算器,其功能主要如下:
1、键盘输入;
2、数值显示;
3、加、减、乘、除四则运算;
针对上述功能,计算器软件程序要完成以下程序的设计:
1、键盘输入检测程序
2、LED显示程序
3、算术运算程序
1、程序流程图
系统总流程图
算术运算程序流程图
2、程序清单
#include<reg52.h>
二、总体设计及功能介绍
根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下:
(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。
{
uint j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
void display()//显示函数声明
{
uchar w1,w2,w3,w4,w5,w6,f=0;
long y;
if(x>=0) //显示六位计时数
{
if(x>=1e6)
{
P0=0xff;
wela=1;
P0=0xf7;
HC573引脚功能:
引脚号符号 名称及功能
1OE3态输出使能输入(低电平)
2-9D0 - D7数据输入
12-19Q0 - Q73态锁存输出
11LE锁存使能输入
10GND接地(0V)
20VCC电源电压
(四)运算模块(51单片机控制)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AT89C51单片机简易计算器的设计一、总体设计根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。
系统模块图:二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。
显示部分:采用LCD 静态显示。
按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。
总体设计效果如下图:(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
矩阵键盘的工作原理:计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
图 2 矩阵键盘布局图矩阵键盘内部电路图如图3所示:为了进一步节省单片机I/O口资源,我们在设计中使用了MM74C922芯片。
MM74C922是一款4*4键盘扫描IC,它可检测到与之相连的4*4键盘的按键输入,并通过数据输出口将按键相应的编码输出。
其引脚图如图4所示:图4 MM94C22硬件图MM74C922引脚说明:(1) Y1~Y4(脚1~脚4):44键盘第一列至第四。
(2) X1~X4(脚11、10、8、7):44键盘第一行至第四行。
(3) DOA~ DOD(Dataout A~D,脚14~17):按键之BCD码输出,其中DOA为LSB,DOD为MSB。
(4) VCC(脚18):电源脚,+3V~+15V。
ab126计算公式大全(5) GND(脚9):接地管脚。
新艺图库(6) OSC(Oscillator,脚5):键盘扫描电路之频率所需外加电容的连引脚。
(7) KBM(Keyboard Mask,脚6):内部消除开关弹跳电路所外加电容的引脚。
(8) OE(Output Enable,脚13):芯片致能脚,接低电位可使芯片致能。
(9) DA(Data Available,脚12):数据有效输出脚。
任一按键按下时,此脚位会输出高电位,按键释放后此脚又会恢复为低电位。
MM74C922对各按键的响应如下表所示:如下图5所示,在本设计中,计算器输入键盘的4条行线、列线分别连接到MM74C922的X1-X4、Y1-Y4引脚,MM74C922的数据输出口与单片机的P2口相连,MM74C922的DA引脚经过一个非门连接到单片机的/INT0脚,当MM74C922检测到键盘输入时,DA产生高电平,与之相连的/INT0检测到低电平,给单片机一个中断,单片机从P2口的低四位读入键盘上按下的键的值。
图5 键盘接口电路图(三)、LCD显示模块本设计采用LCD液晶显示器来显示输出数据。
通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。
图6 LCD 模块(四)运算模块(单片机控制)MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。
三、软件设计现实生活中人们熟知的计算器,其功能主要如下:1、键盘输入;2、数值显示;3、加、减、乘、除四则运算;4、对错误的控制及提示;针对上述功能,计算器软件程序要完成以下模块的设计:1、键盘输入检测模块2、LCD显示模块;3、算术运算模块4、错误处理及提示模块。
系统总流程图分块程序设计1、键盘输入检测程序设计有键按下时,单片机响应外部中断0,转入外部中断0中断处理函数,在中断处理函数中完成对按键的判断,以进行下一步的程序处理。
/***********外部中断0处理函数*************/void INT_0(void) interrupt 0 using 0{key=translate(P2&0x0f);if(key<='9'&&key>='0') //判断按下的键是否为数值{num=num*10+(key-'0');if (operators>0){y=num;iny=1;}elsex=num;if(num<134217728&&num>-134217728) //当前数值是否超出限定范围{display(num);}elsedataoverflow();}else{switch(key){case'c':x=0;y=0;num=0;iny=0;operators=0;display(num);break;case'=':arithmetic();iny=0;operators=0;num=0;break;case'+':if (operators)arithmetic();operators=1;num=0;break;case'-':if (operators)arithmetic();operators=2;num=0;break;case'*':if (operators)arithmetic();operators=3;num=0;break;case'/':if (operators)arithmetic();operators=4;num=0;break;}}}2、LCD显示程序设计利用LCD静态显示,通过程序向LCD写指令字或数据使LCD完成不同功能或显示相应数据。
/**************LCD初始化函数*************/void init_LCM(){write_com(0x30);write_com(0x30);write_com(0x30);write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0e);}/***********LCD写数据函数*************/ void write_data(char ddata){RS=1;/*写指令*/R_W=0;EN=1;/*使能信号开*/P1=ddata;/*将数据送入p1口*/EN=0;/*使能信号关*/check_BF();}/***********LCD写指令函数*************/ void write_com(char command){RS=0;/*写指令*/R_W=0;EN=1;/*使能信号开*/P1=command;/*将数据送入p1口*/EN=0;/*使能信号关*/check_BF();}/************LCD检查忙碌函数***********/ void check_BF(){char i,x=0x80;P1=0xff;while(x&0x80){RS=0;R_W=1;EN=1;x=P1;EN=0;for (i=0;i<10;i++);}EN=0;/*关闭使能信号*/}/**********LCD清屏函数**********/ void clearLCD(){write_com(0x01);}/**********LCD显示函数**********/ void display(long a){long temp,b,c=-1;int lenth=1,i,j;clearLCD();if(a<0){a=a*c;write_data('-');}temp=a;while((temp=temp/10)!=0){lenth++;}for(i=lenth;i>0;i--){b=1;for(j=0;j<i-1;j++){b=b*10;}write_data(0x30+a/b);a=a%b;}}3、算术运算程序设计4、错误处理及提示程序设计/**********除数为处理函数**********/void dealerror(){int i=0;clearLCD();for(i=0;i<5;i++)write_data(error[i]);}/*********数值溢出处理函数**********/void dataoverflow(){int i=0;clearLCD();for(i=0;i<8;i++)write_data(overflow[i]);}四、联机调试在联机调试的过程中,一开始没有做数值溢出方面的控制,导致LCD显示的输入数据或计算结果与实际不相符。
后来经过计算得到有符号长整型的表示范围为-2147483648—2147483647,遂取2的30次方1073741824为本计算器的最大表示范围,以此来控制数值溢出,修改后,LCD显示正确。