久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5511|回復: 3
打印 上一主題 下一主題
收起左側

單片機計算器仿真+程序 帶鍵盤和數碼管 含ppt

[復制鏈接]
跳轉到指定樓層
樓主
只要用鍵盤和數碼管就能制作出一個簡易的51單片機計算器

計算器的仿真原理圖


單片機計算器的ppt文檔

硬件部分比較簡單,當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。


主程序流程圖


程序的主要思想是:將按鍵抽象為字符,然后就是對字符的處理。將操作數分別轉化為字符串存儲,操作符存儲為字符形式。然后調用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;
    }
}




單片機計算器制作的全部資料下載: C51簡單計算器.zip (1.24 MB, 下載次數: 94)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区在线免费 | 成人一级视频在线观看 | 国产精品污www一区二区三区 | 蜜桃精品视频在线 | 欧美日韩亚洲一区 | 中文字幕视频在线观看免费 | 国产精品精品久久久 | 毛片一区二区 | 日本成人毛片 | 中文字幕国产 | 亚洲日本成人 | 电影91久久久 | 福利av在线| 亚洲欧美日韩国产 | 一级黄色裸片 | 精品久久香蕉国产线看观看亚洲 | 宅男伊人 | 日韩一区二区三区在线观看 | www亚洲免费国内精品 | 九九视频在线观看 | 精品色| 日韩免费毛片视频 | 成人免费淫片aa视频免费 | 精品无码三级在线观看视频 | 国产精品久久久久久久久久三级 | 91偷拍精品一区二区三区 | 久久国产精品免费一区二区三区 | 一本一道久久a久久精品综合蜜臀 | 国产精品美女久久久久久久网站 | 欧美一区二区三区视频 | 91精品国产99 | 伊人免费观看视频 | 激情婷婷| 日韩二三区 | 二区在线视频 | 国产伦精品一区二区三区在线 | 日韩一区二区三区av | 日韩手机在线看片 | 久久久久久天堂 | 国产福利资源 | 精品日本久久久久久久久久 |