切换到宽版
  • 6320阅读
  • 12回复

[C51]继超NB跑马灯后又一新作,单片机计算器,附程序,仿真程序有视频演示【参赛】 [复制链接]

上一主题 下一主题
离线974315793
 

发帖
378
M币
109
专家
7
粉丝
44
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2011-06-12
单片机做的计算器,用可以用八位数码管显示,我只有六个就装了六个,矩阵键盘输入,把复位键装到左下角就可以归零了




元件清单
stc89c52   1片
插座一个
12M晶振一个
33pf电容两个
10uf电容一个
10K电阻一个
1n4007二极管两个
c1815三极管六个
三位数码管两个
按钮开关16个。
导线若干。








综合演示
flash: http://www.tudou.com/v/WOLpkQJ2Ifo/&rpid=78698299/v.swf
键盘按键

flash: http://www.tudou.com/v/FPZotmUxyEQ/&rpid=78698299/v.swf






加法运算演示
flash: http://www.tudou.com/v/yD5dVoGPiKo/&rpid=78698299/v.swf


乘法运算演示

flash: http://www.tudou.com/v/5rmgiRrxT6g/&rpid=78698299/v.swf

除法运算演示
flash: http://www.tudou.com/v/WBhr_qn64GU/&rpid=78698299/v.swf




仿真程序如下

程序如下

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
uchar num,ca,count;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xff,0x0c,0x89,0x7f,0xbf};
uchar zero[8]={0,0,0,0,0,0,0,0};
uchar table1[8],table2[8];
void delay(uint z) //* zhongduan  *//    
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void sta()
{  num=16;
  P1=0xf0;
  EA=1;
  EX0=1;
  IT0=0;
   P0=0xc0;
   P2=0x80;
}
void exchange(uchar w[],uchar m[])
{
uchar k;
for(k=0;k<8;k++)
w[k]=m[k];
}
uchar keyscan()  //*  jianpansaomiao  *//
{
   P1=0xfe;
   temp=P1;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P1;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P1;
     switch(temp)
      {
       case 0xee:num=7;
        break;
       case 0xde:num=8;
        break;
       case 0xbe:num=9;
        break;
       case 0x7e:num='/';
        break;
      }
     while(temp!=0xf0)
      {
       temp=P1;
       temp=temp&0xf0;
      }
     }
    }
   P1=0xfd;
   temp=P1;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P1;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P1;
     switch(temp)
      {
       case 0xed:num=4;
        break;
       case 0xdd:num=5;
        break;
       case 0xbd:num=6;
        break;
       case 0x7d:num='*';
        break;
      }
     while(temp!=0xf0)
      {
       temp=P1;
       temp=temp&0xf0;
      }
     }
    }

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

   P1=0xf7;
   temp=P1;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P1;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P1;
     switch(temp)
      {
       case 0xe7:num='r';
        break;
       case 0xd7:num=0;
        break;
       case 0xb7:num='=';
        break;
       case 0x77:num='+';
        break;
      }
     while(temp!=0xf0)
      {
       temp=P1;
       temp=temp&0xf0;
      }
     }
    }
return num;
}
int0_pr() interrupt 0
{
   EA=0;
   num=keyscan();
   P1=0xf0;
   EA=1;
}
void move(uchar *a)
{ uchar k;
for(k=7;k>0;k--)
a[k]=a[k-1];
}

uchar cnt()
{

  if(num<10)
  {
   move(table1);
   table1[0]=num;
   count++;
  }
  num=16;
  return count;
}
void display()   //*  xianshi  *//
{
exchange(table1,zero);
while(1)
{
  uchar k,n=0x80;
   count=cnt();
  for ( k=0;k<count;k++)
    {
    P2=n;
       P0=table[table1[k]];
    delay(4);

       n=n>>1;

    }
  if(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='r')
  {count=0; break;  }
}

}
void dp(uchar *a,uint z)
{
while(1)
{
  uchar k,n=0x80;

  for ( k=0;k<z;k++)
    {
    P2=n;
       P0=table[a[k]];
    delay(4);

    n=n>>1;

    }
  if(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='r') break;
}


  }

long cale(uchar ca)
{
long A,B,C;

B=table2[7]*10000000+table2[6]*1000000+table2[5]*100000+table2[4]*10000+table1[3]*1000+table1[2]*100+table2[1]*10+table2[0];
A=table1[7]*10000000+table1[6]*1000000+table1[5]*100000+table1[4]*10000+table1[3]*1000+table1[2]*100+table1[1]*10+table1[0];
if(ca=='+')
{
   C=A+B;
  }
else  if(ca=='-')
{
   C=B-A;
  }
  return C;
}

void main ()
{
long C;uchar k;
sta();
display();
while(1)
{
  if(num<10)
{
  exchange( table2,table1);
  display();
}
else if( num=='+'||num=='-'||num=='*'||num=='/')
{ P0=0xc0;
   P2=0x80;
   switch(num)
  { case '+' : ca='+';break;
    case '-' : ca='-';break;  }
}
else if(num=='=')
{
  num=16;
  C= cale(ca);
  table1[7]=C/10000000;
  table1[6]=C%10000000/1000000;
  table1[5]=C%1000000/100000;
  table1[4]=C%100000/10000;
  table1[3]=C%10000/1000;
  table1[2]=C%1000/100;
  table1[1]=C%100/10;
  table1[0]=C%10;
  for(k=7;k>0;k--)
  {
   if(table1[k])break;
  }
   dp(table1,k+1);
  }
  }
}












[ 此帖被974315793在2011-06-13 22:20重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共7条打赏 ,M币+35
离线hearttolin

发帖
4269
M币
291
专家
18
粉丝
200
只看该作者 1楼 发表于: 2011-06-13
Re:继超NB跑马灯后又一新作,单片机计算器,附程序,仿真图,仿真程序有视频演示《 ..
请登录后查看
离线hackerjdm

发帖
442
M币
5
专家
-2
粉丝
19
只看该作者 2楼 发表于: 2011-06-13
请登录后查看

发帖
119
M币
41
专家
0
粉丝
15
只看该作者 3楼 发表于: 2011-06-13
请登录后查看
离线xinqi99

发帖
3170
M币
26
专家
23
粉丝
188
只看该作者 4楼 发表于: 2011-06-13
请登录后查看

发帖
76
M币
48
专家
1
粉丝
7
只看该作者 5楼 发表于: 2011-06-19
请登录后查看
离线love香

发帖
2565
M币
4940
专家
9
粉丝
27677
只看该作者 6楼 发表于: 2011-06-19
请登录后查看
离线love香

发帖
2565
M币
4940
专家
9
粉丝
27677
只看该作者 7楼 发表于: 2011-06-19
请登录后查看
离线muye414

发帖
41
M币
460
专家
2
粉丝
8
只看该作者 8楼 发表于: 2011-09-20
请登录后查看
离线曾志巍

发帖
1201
M币
2855
专家
3
粉丝
48
只看该作者 9楼 发表于: 2011-10-01
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个