您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页单片机计算器

单片机计算器

来源:步遥情感网
二、计算器的设计

一、设计目的

利用STCC52进行程序的设计,实现简易计算器功能。

二、功能描述

1、设计一个计算器,可以进行四则运算,利用4位数码管显示运算的两数及其运算结果

2、键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键。通过不同的按键执行运算过程。

3、开机显示零,等待键入数值,当键入数字,通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

三、硬件系统设计

1、所需设备:单片机实验板,USB 转 RS-232串口线,电脑 2、接线设计:

1)串口线与单片机实验板的连接对应 单片机 + R T G

实验板电路图为:

串口线 VCC TXD RXD GND

四、 软件系统设计

1、软件功能模块设计及流程图

开机显示零; 等待键入数值;

当键入数字,通过数码管显示出来;

当键入+、-、*、/运算符,计算器在内部执行数值转换和存储; 并等待再次键入数值,当再键入数值后将显示键入的数值; 按等号就会在数码管上输出运算结果。

工作流程图:

开始 开定时器中断 初值0000 数码管显示 按键? Y 数字键0-9? 清零键12? 功能键 ? 11 15 10 14 12 输入数值 状态清零 根据上次功能键和输入的数据进行计算 数据送入 显示缓冲 此次的功能键是? =? 12 其他? 计算结果 保存结果和功能键 数值输出

完整程序及程序模块注释如下:

/******************************************************************** * 文件名 :单片机实现计算器功能

* 功能描述: 1、设计一个计算器,利用4位数码管显示两数及其加减乘除的结果

2、设置初始值0,通过不同的按键来表示两数的运算关系 3、通过按键实现清零作用 * 程序员 :0938003 游瑞蓉 * 日期 :2012.06.01

*********************************************************************/

#include #include

#define uint unsigned int #define uchar unsigned char bit keydown;

uchar flag=0,scancode=0x0ff,temp=0,t=0; uint data count[4];

uchar data dis_buf[4]={0,0,0,0}; uchar

code

dis_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/******************************************************************** * 名称 : init_t0() * 功能 : 定时器

***********************************************************************/

void init_t0() {

TMOD=0xf1; ET0=1; EA=1;

TH0=0x06; TL0=0x06; TR0=1; }

/******************************************************************** * 名称 : display()

* 功能 : 显示,利用4位数码管显示数值,为0的高位不显示 * 输出 : 仅最少的位数显示计算得到的数值

***********************************************************************/

void display(void) {

dis_buf[0]=t/1000; dis_buf[1]=t%1000/100; dis_buf[2]=t%100/10; dis_buf[3]=t%10; }

/******************************************************************** * 名称 : display1()

* 功能 : 清零显示,利用4位数码管显示数值,仅最低位显示0

***********************************************************************/

void display1(void) {

dis_buf[0]=dis_buf[1]=dis_buf[2]=dis_buf[3]=0; count[0]=count[1]= count[2]= count[3]=0; flag=0; temp=0; t=0; }

/******************************************************************** * 名称 : Convert_Scancode()

* 功能 : 实现按键的读取。下面这个子程序是按处理矩阵键盘的基本方法处理的。

* 输出 : 按键值

***********************************************************************/

uchar Convert_Scancode(uchar s) {

uchar c;

switch(s&0x0f) {

case 1: c=0; break; case 2: c=1; break; case 4: c=2; break; case 8: c=3; break; default: c=0xff; return c; }

switch(s&0x0f0) {

case 0x10: c+=0; break; case 0x20: c+=4; break; case 0x40: c+=8; break; case 0x80: c+=12; break; default: c=0xff; return c; }

return c;

}

/******************************************************************** * 名称 : t0()

* 功能 : 定时器中进行数据位选

***********************************************************************/

void int_t0(void) interrupt 1 using 2 {

uchar key;

static bit down=0;

static uchar data index=0;

TH0=0xf8;

key=P2;

if((key&0x0f)!=0x0f){ down=1;

scancode=(~key); }

P0=0xff;

switch(index) {

case 0: P2=~0x10; break; case 1: P2=~0x20; break; case 2: P2=~0x40; break; default: P2=~0x80; }

P0=~dis_code[dis_buf[index]&0x0f];

index++;

if(index==4) {

index=0;

keydown=down; down=0; } }

/******************************************************************** * 名称 : Main()

* 功能 : 主函数,读取键值;设置键值功能,如加减乘除 进行显示的数值处理,调用显示函数 * 输出 : 计算结果

***********************************************************************/ main() {

init_t0(); while(1) { while(!keydown); while(keydown);

temp=Convert_Scancode(scancode); if(temp==12) display1();

if(flag==0&&temp>9) {flag=1;t=0;} if(flag==2&&temp>9) {flag=3;t=0;} switch(flag) {

case 0: {

t=t*10+temp; display(); count[0]=t; break;

}

case 1: {

switch(temp) {

case 11:{count[1]=1;break;} case 15:{count[1]=2;break;} case 10:{count[1]=3;break;} case 14:{count[1]=4;break;} default: ; } flag=2;

t=0; break; }

case 2: {

t=t*10+temp; display(); count[2]=t; break; }

case 3:

{ switch(count[1]) {

case 1:{count[3]=count[0]+count[2];break;} case 2:{count[3]=count[0]-count[2];break;} case 3:{count[3]=count[0]*count[2];break;} case 4:{count[3]=count[0]/count[2];break;} default: ; }

t=count[3]; count[0]=t; display(); flag=1; break; }

case 4: flag=0; break; default: ; } } }

五、 实验总结

将程序下载到单片机实验板上,可以完整的实现功能。

1、可以进行四则运算,利用4位数码管显示运算的两数及其运算结果 2、键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键。通过不同的按键执行运算过程。

3、开机显示零,等待键入数值,当键入数字,通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务