基于AT89C51单片机的计算器

合集下载

基于AT89C51单片机的计数器设计

基于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语言编写的计算器

基于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单片机的计数器设计
计数器是一种常见的电子设备,用于实现对输入信号的计数。

基于AT89C51单片机的计数器设计,可以实现对输入信号的计数,并且可以将计数结果显示出来。

我们需要准备以下器件和材料:
1. AT89C51单片机:这是一款8位微控制器,具有丰富的输入输出功能。

2. 数码管:用于显示计数结果。

3. 按钮开关:用于输入计数信号。

接下来,我们可以按照以下步骤进行计数器的设计。

1. 连接电路:将数码管和按钮开关分别与AT89C51单片机的IO口相连。

数码管的引脚与单片机的IO口相连,按钮开关一个端接地,另一个端接单片机的IO口。

2. 编写程序:使用汇编语言或C语言编写单片机的程序。

可以使用单片机的计时器中断来实现计数功能。

在程序中,首先需要初始化单片机,并将IO口设置为输入或输出。

3. 实现计数功能:在程序中,通过判断按钮开关的状态,来决定是否对计数器进行加一或减一操作。

当按钮开关按下时,将计数器加一或减一,并将计数结果显示在数码管上。

4. 程序调试:将程序下载到单片机上,并连接电源。

通过按下按钮开关,观察数码管上计数结果的变化,可以判断程序的正确性。

如果发现计数结果不正确,可以通过调试程序来解决问题。

5. 优化设计:根据实际需求,可以对计数器的功能进行优化。

可以增加清零按钮,用于将计数器清零;可以增加计数范围限制,当计数器达到上限或下限时,禁止继续计数。

基于AT89C51单片机的十进制计算器系统设计

基于AT89C51单片机的十进制计算器系统设计

基于AT89C51单片机的十进制计算器系统设计本设计是基于AT89C51 举行的十进制计算器系统设计,可以完成计算器的键盘输入,举行加、减、乘、除4 位无符号数字的容易四则运算,并在上相应的显示结果。

硬件方面从功能考虑,首先挑选内部存储资源丰盛的AT89C51 单片机,输入采纳4×4 矩阵键盘。

显示采纳4 位7 段共阳极LED 动态显示。

软件方面从分析计算器功能、流程图设计,再到程序的编写举行系统设计。

引言本系统采纳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单片机的计数器设计

基于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单片机的简易计算器设计

计算器(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单片机的计数器设计AT89C51单片机是一种常用的8位单片机,具有计数器功能。

本文将介绍基于AT89C51单片机的计数器设计。

计数器是一种常用的电子设备,用于统计某个事件发生的次数。

在数字电子技术中,计数器可以通过使用触发器和逻辑门来实现。

在AT89C51单片机中,可以通过编程控制来实现计数器功能。

我们需要通过编程配置AT89C51单片机的IO口,使其能够作为计数器的输入和输出端口。

我们可以使用P1口作为计数器的输入端口,通过外部信号来触发计数器的计数动作。

我们可以使用P2口作为计数器的输出端口,将计数结果显示出来。

接下来,我们需要编写程序来实现计数器的功能。

程序的基本思路是通过中断来实现计数器的自动计数。

当接收到外部信号时,中断服务程序会自动执行,对计数器的计数值进行更新,并将结果输出到P2口。

我们可以通过按键来控制计数器的启动和暂停。

具体编程步骤如下:1. 配置P1口和P2口为输入和输出模式,分别作为计数器的输入和输出端口。

2. 初始化计数器的计数值为0。

3. 配置中断,并编写中断服务程序。

中断服务程序在接收到外部信号时,会自动执行,对计数器的计数值进行更新,并将结果输出到P2口。

4. 编写按键处理程序。

按键处理程序会检测按键的状态,如果按下则启动计数器,再次按下则暂停计数器。

5. 主程序中,循环检测按键状态,并根据按键状态调用相应的处理程序。

通过以上步骤,我们可以实现基于AT89C51单片机的计数器设计。

这个设计可以广泛应用于各种计数需求的场合,如物料计数、人员计数等。

基于AT89C51单片机的计数器设计具有成本低、可靠性高等优点,适合在工业控制和自动化领域进行应用。

基于AT89C51单片机的计数器设计是一项有趣且实用的工程,通过合理的硬件配置和编程设计,可以实现各种计数需求的应用。

基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计

基于AT89C51单片机的计数器设计AT89C51是一种8位单片机,它具有中央处理器、存储器和输入/输出功能,适用于各种应用。

在本设计中,我们将基于AT89C51单片机来设计一个计数器。

我们需要连接AT89C51单片机和外部硬件电路。

计数器通常需要一个外部计时源来提供脉冲输入,并且需要一个数码管显示结果。

我们需要连接一个计时源(例如晶体振荡器)到单片机的外部时钟引脚,并连接一个共阳数码管到单片机的输出引脚。

我们还需要连接一些按钮到单片机的输入引脚,用于开始、暂停和复位计数器。

接下来,我们需要编写单片机的程序代码。

程序代码将实现计数器的功能,包括计数、显示和控制操作。

我们需要定义一些变量来记录计数器的状态。

我们可以定义一个变量来存储当前计数的值,一个变量来存储计数是否正在进行中的标志,以及一个变量来存储计数方向(递增或递减)的标志。

然后,我们可以在主程序循环中开始实现计数器的功能。

主程序循环可以使用一个无限循环来保持计数器一直运行,并且可以通过检测按钮的状态来控制计数器的操作。

如果开始按钮按下,则设置计数进行中的标志,并且根据计数方向的标志进行递增或递减操作。

如果暂停按钮按下,则清除计数进行中的标志,停止计数操作。

如果复位按钮按下,则将计数器的值重置为初始值,并且清除计数进行中的标志。

在每次计数操作后,我们需要将计数器的值显示在数码管上。

可以使用数码管的显示函数来将计数器的值转换为对应的数字,并将其输出到数码管的引脚上,从而实现数字的显示。

为了保证计数器的精确性,我们需要添加一些延时函数来控制计数的速度。

可以使用单片机的定时/计数器功能来实现延时功能。

定时/计数器可以设置为特定的计时频率,并且可以通过定时器中断来控制延时的时间。

基于AT89C51单片机的计数器设计需要连接外部硬件电路,并编写相应的程序代码来实现计数、显示和控制操作。

通过合理的硬件连接和程序设计,可以实现一个功能完善的计数器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2 运算模块:单片机控制
MCS-51 单片机是在一块芯片中集成了 CPU、RAM、ROM、定时器/计数器和多功能 I/O
-2-
中国科技论文在线

等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理 器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行 I/O 口、串行口、 定时器/计数器、中断系统及特殊功能寄存器(SFR)。[3][5]
4.软件设计
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中 心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独 设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但 各个模块之间的连接有一定的难度。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再 编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比 较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。程序流程图如下:
设计的关键所在,必须非常熟悉单片机的原理与结构,同时还要对整个设计流程有很好 的把握,将单片机和其他模块完整的衔接。
参考文献
[1]单片机原理实用教程:基于 Proteus 虚拟仿真/徐爱钧编著——北京:电子工业出版社,2009.1 [2]单片机原理及其应用(第 2 版)/陈立周,陈宇编——北京:机械工业出版社,2008.5 [3]51 系列单片机系统设计与应用技巧/李刚等编著——北京:北京航空航天大学出版社,2004.1 [4]MCS-51 单片机原理与应用/康维新主编——北京:中国轻工业出版社,2009.1 [5]单片机原理与应用系统设计/李云钢等编著——北京:中国水利水电出版社,2008.8
通常的数码显示器是由 7 段条形的 LED 组成(如图 4 所示),点亮适当的字段,就可 显示出不同的数字。我们采用 8 段数码管,其中位于显示器右下角的本次设计采用共阴极接法(如图 5 所示)。
eg f
a
bc d
a fb
g
ec d
图 4、7 段数码显示器内部段的排列
图 5、共阴极连接
3. 硬件电路设计
(1)主要器件:单片机采用 80S51 单片机,它能够满足数据的采集、控制和数据处理 的需求。显示用 8 段 LED 数码管,输入采用按键方式。Protues 仿真图如下:
-3-
中国科技论文在线

1
2
3
4
5
6
7
8
9
0
+
-
*
/
=
C
图 2、矩阵键盘布局图
图 3、矩阵键盘内部电路图
由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13 与 P14~P17 之间开路。 当有键闭合时,与闭合键相连的两条 I/O 口线之间短路。判断有无按键按下的方法是:第一 步,置列线 P14~P17 为输入状态,从行线 P10~P13 输出低电平,读入列线数据,若某一列 线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线 P14~P17 读入 数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编 号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作, 否则按一次键,有可能会连续多次进行同样的键操作。
-5-
中国科技论文在线

图 9 程序流程图
5. 总结
本设计采用 80S51 芯片,实现了利用单片机进行了一个简单计算器设计。允许对输入数 据进行加减乘除运算及 LED 显示。如果设计对象是更为复杂的计算器系统,其实际原理与 方法与本设计基本相同。
另外,实例所设计的计算器是用 LED 数码管显示的,当然也可以用其他的器件显示, 如 LCD 液晶显示屏,这样就可以显示出更多的字符,在此基础上,还可以编写更加完善的 程序来实现更多的计算功能。
图 6:protues 仿真图
(2)功能和操作:加减乘除运算和显示。 ①上电后,屏幕初始化。 ②计算。按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下
数字键,屏幕显示要运算的第二个数字,最后 按下“﹦”号键,屏幕上显示出计算结果。 ③如果要再次计算,可以按下“CLC”键清零,或者按下单片机的复位键,重新初始
中国科技论文在线

基于 AT89S51 单片机的计算器设计
周琛晖,张振南,王志峰
中国矿业大学计算机学院,江苏 徐州(221008) 摘 要:随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术 的发展,犹如雨后春笋般的变化。单片机的应用已经越来越贴近生活,用单片机来实现一些 电子设计也变得容易起来。计算器在人们的日常中是比较的常见的电子产品之一。可是它还 在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机 来设计的计算器。该设计系统是以 AT89C51 为单片机, P0 口作为输入端,外接 4X4 的键 盘,通过键盘扫描来对输入数的控制,在 P1 口,P2 口接了驱动电路。用来保证 LED 的工 作正常。计算器将完成的功能有加,减,乘,除等功能。 关键词:计算器;电子设计;LED;单片机
时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。 ④电源故障:若样机有电源故障,则加电后很容易造成器件损坏。电源故障包括电压值
不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。 调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,
直至检查出原因并且排除。 (4)技术要点: ①单片机的复位与时钟: 8051 单片机与其他处理器一样,在启动时都需要复位,使 CPU 和系统的各个部件都处
于一种确定的初始状态。复位信号从单片机的 RST 引脚输入,高电平有效,其有效电平应
-4-
中国科技论文在线

维持至少 2 个机器周期。复位操作有上电自动复位和按键手动复位两种方式,我们采用的是 按键手动复位方式。
时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。 MCS-51 单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输 入端为芯片引脚 XTAL1,输出端为引脚 XTAL2。这两个引脚跨接石英晶体振荡器和微调电 容,就构成一个稳定的自激振荡器。
图 7 单片机复位电路
图 8 单片机时序电路
②电源电路设计: 电源电路包括变压器、桥式整流器、电容和稳压器。通过变压器变压,使得 220V 电压 变为 5 V,在通过桥式整流,电容的滤波作用,稳压器的稳压作用,可输出 5V 的稳定电压 ③可靠性设计:单片机应用系统在实际运行中,可能会受到各种外部和内部的干扰,使 系统工作产生错误或故障。为了提高系统的抗干扰能力,常用的措施有: (1)提高元器件的可靠性。在系统硬件设计和加工时,应注意选用质量好的电子器件、 接插件,要进行严格的测试、筛选和老化,同时设计的技术参数应留有余量。 (2)提高印刷电路板和组装的质量。设计电路板时布线及接地方法要符合要求,强弱 电信号线要分开。 (3)对供电电源采取抗干扰措施。例如用带屏蔽层的电源变压器、加电源低通滤波器、 电源变压器的容量应留有余量等。

组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为 4×4 个。这种行列式键盘结构能有效地提高单片机系统中 I/O 口的利用率。[1][2][4]
矩阵键盘的工作原理: 计算器的键盘布局如图 2 所示:一般有 16 个键组成,在单片机中正好可以用一个 P 口 实现 16 个按键功能,这种形式在单片机系统中也最常用。
2.1 输入模块:键盘扫描
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这 种情况下,编程会很简单,但是会占用大量的 I/O 口资源,因此在很多情况下都不采用这种 方式。为此,我们引入了矩阵键盘的应用,采用四条 I/O 线作为行线,四条 I/O 线作为列线
-1-
中国科技论文在线
①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故 我们采用可以进行四位数字的运算,选用 8 个 LED 数码管显示数据和结果。
②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要 16 个按键即可。
系统模块图:
单片机
输入模块
运算模块
显示模块
图 1 系统方案图
1.设计目标和实现方法
为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示, 我们采用基于单片机设计计算器,并用 LED 数码管显示数据,4*4 的矩阵键盘实现数据输 入。设计仿真和调试要用到 Protues 、Keil 和 Protel DXP 等软件。
2.方案论证与设计
根据功能和指标要求,本系统选用 MCS 51 单片机为主控机。通过扩展必要的外围接口 电路,实现对计算器的设计。具体设计考虑如下:
-6-
中国科技论文在线

Based on AT89S51 monolithic integrated circuit's calculator design
ZhouChenhui,ZhangZhennan,WangZhifeng
Chinese Mining Industry University Computer College,XuZhou(221008)
单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊 的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性! 因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。
2.3 显示模块:LED 显示
发光二极管 LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主 要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反 映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它 的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统 中获得了广泛的应用。[2][4]
相关文档
最新文档