找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5102|回复: 3
收起左侧

单片机计算器仿真+程序 带键盘和数码管 含ppt

[复制链接]
ID:115520 发表于 2016-7-7 20:49 | 显示全部楼层 |阅读模式
只要用键盘和数码管就能制作出一个简易的51单片机计算器
捕获.PNG
计算器的仿真原理图

0.png
单片机计算器的ppt文档

硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。

刘杰_51简单计算器.003.jpg
主程序流程图


程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图。


51单片机计算器源程序:

#include <reg51.h>
#
include <intrins.h>
#
include <ctype.h>            /*   isdigit()函数   */
#
include <stdlib.h>            /*    atoi()函数     */

#
define uchar unsigned char
#
define uint unsigned int

uchar operand1[
9], operand2[9];  /*   操作数   */
uchar
operator;                     /*   操作符   */

void delay(uint);
uchar keyscan();
void disp(void);
void buf(uintvalue);
uint compute(uint va1,uint va2,uchar optor);

uchar code table[]
= {0xc0,0xf9,0xa4,0xb0,0x99,
                0x92,0x82,0xf8,0x80,0x90,0xff};     
/*   字符码表   */

uchar dbuf[
8] = {10,10,10,10,10,10,10,10};            /*   显示缓存   */

/*   延时函数   */        
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
   
for(y=110;y>0;y--);
}

/*******************************************
              
键盘扫描程序
       将按键转化为字符并作为输出
    '$','#'分别表示清零键和没有键按下
*******************************************/

uchar keyscan()
{
    uchar skey;                     
/*   按键值标记变量   */
   
/***********************
     
扫描键盘第1行   
************************/

    P1
= 0xfe;
   
while((P1 & 0xf0) != 0xf0)        /*      有按键按下    */
    {
        delay(
3);                    /*      去抖动延时    */

        
while((P1 & 0xf0) != 0xf0)    /*     仍有键按下     */
        {
            
switch(P1)                /*    识别按键并赋值  */
            {
               
case 0xee: skey = '7'; break;
               
case 0xde: skey = '8'; break;
               
case 0xbe: skey = '9'; break;
               
case 0x7e: skey = '/'; break;
                    
               
default:   skey = '#';
            }

            
while((P1 & 0xf0) != 0xf0) /*   等待按键松开   */
                ;
        }
    }

/***********************
     
扫描键盘第2行   
************************/

    P1
= 0xfd;   
   
while((P1 & 0xf0) != 0xf0)
    {
        delay(
3);

        
while((P1 & 0xf0) != 0xf0)
        {
            
switch(P1)
            {
               
case 0xed: skey = '4'; break;
               
case 0xdd: skey = '5'; break;
               
case 0xbd: skey = '6'; break;
               
case 0x7d: skey = '*'; break;
                    
               
default:   skey = '#';
            }

            
while((P1 & 0xf0) != 0xf0)
                ;
        }
    }


/***********************
     
扫描键盘第3行   
************************/

   P1
= 0xfb;
   
while((P1 & 0xf0) != 0xf0)
    {
        delay(
3);
        
        
while((P1 & 0xf0) != 0xf0)
        {
            
switch(P1)
            {
               
case 0xeb: skey = '1'; break;
               
case 0xdb: skey = '2'; break;
               
case 0xbb: skey = '3'; break;
               
case 0x7b: skey = '-'; break;
                    
               
default: skey = '#';
            }

            
while((P1 & 0xf0) != 0xf0)
                ;
        }
    }


/***********************
     
扫描键盘第4行   
************************/

    P1
= 0xf7;
   
while((P1 & 0xf0) != 0xf0)
    {
        delay(
3);

        
while((P1 & 0xf0) != 0xf0)
        {
            
switch(P1)
            {
               
case 0xe7: skey = '$'; break;
               
case 0xd7: skey = '0'; break;
               
case 0xb7: skey = '='; break;
               
case 0x77: skey = '+'; break;
                    
               
default:   skey = '#';
            }

            
while((P1 & 0xf0) != 0xf0)
                ;
        }
    }

   
return skey;
}

void main()
{   
    uint value1, value2, value;           
/*    数值1,数值2,结果    */
    uchar ckey, cut1
= 0, cut2 = 0;    /*   ckey键盘输入字符    */
    uchar
operator;                       /*         运算符        */
   uchar i,
bool = 0;

init
:                                   /*    goto语句定位标签   */

    buf(
0);                            /*         初始化        */
    disp();
    value
= 0;
    cut1
= cut2 = 0;
   
bool = 0;
   
for(i = 0;i < 9;i++)
    {
        operand1[ i]
= '\0';
        operand2[ i]
= '\0';
    }                                 
/*         初始化        */

   
while(1)
    {
        ckey
=keyscan();             /*         读取键盘       */
        
if(ckey != '#')
        {
/*  isdigit函数,字符是阿拉伯数字返回非0值,否则返回0  */
            
if(isdigit(ckey))         
            {
               
switch(bool)   
                {
                    
case 0:
                           operand1[cut1]
= ckey;
                            operand1[cut1
+1] = '\0';
                            value1
=atoi(operand1);  /*  atoi函数,将字符串转化为,int整数  */
                            cut1
++;
                            buf(value1);
                            disp();
                           
break;
                    
case 1:
                            operand2[cut2]
= ckey;
                            operand2[cut2
+1] = '\0';
                            value2
=atoi(operand2);
                            cut2
++;
                            buf(value2);
                            disp();
                           
break;
                           
                    
default: break;
                }
            }
            
else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
            {
               
bool = 1;   
               
operator = ckey;
                buf(
0);
                dbuf[
7] = 10;
                disp();
            }
            
else if(ckey == '=')
            {
                value
=compute(value1,value2,operator);
                buf(value);
                disp();
               
while(1)                     /*   计算结束等待清零键按下  */
                {
                    ckey
= keyscan();
                    
if(ckey == '$')          /* 如果有清零键按下跳转到开始 */
                        
goto init;
                    
else
                        {
                            buf(value);
                            disp();
                        }
                }
            }
            
else if(ckey == '$')
            {   
goto init;}
        }
        disp();
    }

}

/******************************************
                 
运算函数

输入:操作数和操作符
输出:计算结果
*******************************************/

uint compute(uint va1,uint va2,uchar optor)
{
    uint value;

   
switch(optor)
    {
        
case '+' : value = va1+va2;    break;
        
case '-' : value = va1-va2;    break;
        
case '*' : value = va1*va2;    break;
        
case '/' : value = va1/va2;    break;
        
        
default :  break;
    }
   
return value;
}

/*******************************************
              
更新显示缓存
输入:无符号整数
输出:将输入送入显示缓存
*******************************************/

void buf(uint val)
{
    uchar i;
   
if(val == 0)
    {
        dbuf[
7] = 0;
        i
= 6;
    }
   
   
else
        
for(i = 7; val > 0; i--)
        {
            dbuf[ i]
= val % 10;
            val
/= 10;
        }
   
   
for( ; i > 0; i--)
        dbuf[ i]
= 10;
}

/*******************************************
               
显示函数      
*******************************************/

void disp(void)
{
    uchar bsel, n;
   
    bsel
=0x01;
   
for(n=0;n<8;n++)
    {
        P2
=bsel;
        P0
=table[dbuf[n]];
        bsel
=_crol_(bsel,1);
        delay(
3);
        P0
=0xff;
    }
}



0.png
单片机计算器制作的全部资料下载: C51简单计算器.zip (1.24 MB, 下载次数: 93)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:366346 发表于 2018-7-6 15:24 | 显示全部楼层
有人下载了吗
可以吗
回复

使用道具 举报

ID:414974 发表于 2018-11-19 11:48 | 显示全部楼层
有没有程序
回复

使用道具 举报

ID:453205 发表于 2018-12-24 16:18 | 显示全部楼层
小璐 发表于 2018-7-6 15:24
有人下载了吗
可以吗

用不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表