如何用51单片机做计算器(要求用C语言编程) 由于是新手所以没积分 对不住各位了

如题所述

给你参考一下的,我最近做的:

我的实验板上的键不够,所以只能做加法运算,而且两数之和不能大于十。

嘿嘿,没错这个给某种人用的。

//********** myh.h ***********有两个文件,一个是头文件myh.h一个是js.c

#include <reg52.h>

typedef unsigned char uchar;

typedef unsigned int  uint;

typedef bit BOOL;

//**

sbit rs=P2^6;

sbit rw=P2^5;

sbit e=P2^7;

//**

uchar Key_Down(void);//返回0到12的键盘的编码

void delay(uchar);//延时

void Init(void);

void Write_Cmd(uchar);

void Write_Data(uchar);

BOOL If_Busy();

//**

uchar code Lcd_tab[]="0123456789+=";

uchar code Key_tab[]={0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};

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

uint Q0;

uint Q1;

uint Q2;

//*************js.c********

 

#include "myh.h"

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

void main()

{uchar m_key; 

uchar m_inc=0;

Init();

Write_Cmd(0x80);

while(1)

{  Q1=0;

   Q0=0;

   Q2=0;

   

 m_key=Key_Down();

 Write_Cmd(0x01);

 Write_Data(Lcd_tab[m_key]);

 Q0=m_key;

   

 m_key=Key_Down();

 Write_Data(Lcd_tab[m_key]);

       

 m_key=Key_Down();

 Write_Data(Lcd_tab[m_key]);

 Q1=m_key;

       

 m_key=Key_Down();

 Write_Data(Lcd_tab[m_key]);

 Q2=Q0+Q1;

 Write_Data(Lcd_tab[Q2]);

     

 

  

   

}

}

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

uchar Key_Down(void)

{uchar Key_number=0;

  uchar m_cx;

  uchar m_cy;

  uchar m_cxy;

  P3=0x0f;

  m_cx=P3;

  while(1)

  {if(m_cx!=0x0f)

    {delay(500);

     m_cx=P3;

     if(m_cx!=0x0f)

  break; }  

 else {P3=0x0f;m_cx=P3;}

  }

  P3=0x0f;

  m_cx=P3&0x0f;

  P3=0xf0;

  m_cy=P3&0xf0;

  m_cxy=m_cx|m_cy;

for(Key_number=0;Key_number<12;Key_number++)

{if(m_cxy==Key_tab[Key_number])

   break;

}

return Key_number;}

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

void delay(uchar time)

{uchar j;

for(;time>0;time--)

for(j=0;j<200;j++);

}

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

void init()

{ delay(10);

  Write_Cmd(0x38);

  delay(10);

  Write_Cmd(0x38);

  delay(10);

  Write_Cmd(0x38);

  delay(10);

  Write_Cmd(0x0c);

  delay(10);

  Write_Cmd(0x06);

  delay(10);

  Write_Cmd(0x01);

}

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

void Write_Cmd(uchar cmd)

{//while(If_Busy());

 e=0;

 rw=0;

 rs=0;

 delay(4);

 P0=cmd;

 delay(4);

 e=1;

 delay(10);

 e=0;

}

//***

void Write_Data(uchar dat)

{//while(If_Busy());

 e=0;

 rw=0;

 rs=1;

 delay(4);

 P0=dat;

 delay(4);

 e=1;

 delay(10);

 e=0;

}

//**

BOOL If_Busy()

{

  BOOL result;

  rw=1;

  rs=0;

  e=1;

  delay(4);

  result=(BOOL)(P2&0x80);

  e=0;

  return result;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-14
关键还是要先有硬件方案,也就是方框图,之后是详细电路图,最后才能谈到写程序。关键点有如下几点:一、要设计单片机最小系统,包括复位、晶振、EA接高电平(不许外扩存储器)。二、要有键盘,对应软件为判键程序。推荐用4×4行列式键盘。三、要有显示单元,新手推荐你用数码管(用164串转并做),或是用1602液晶做显示(更容易些)。对应软件部分是显示函数。以上三点是硬件方案,最后数学计算可以用C写,不复杂。总体来说,判键是难点。因为你首先要输入数据进入单片机;输入的数据进行相应的数学运算;再把结果显示到液晶中去。
第2个回答  2010-12-14
首先准备一块最小系统版 就是板子都做好了了 件都焊上了的那种
再准备一个伟福仿真器 使用配套的C语言 就可以了
最小系统版一般会配套示例程序给你 分为C语言 和汇编2个版本
你参考下C语言版本 只关注下键盘扫描(那个键盘)和显示(一般是8段管)2部分的程序就可以了
C语言中实现计算不难。
程序就不给你了 因为硬件系统不一样 地址都不同 给你也作用不大
第3个回答  2010-12-14
需要的功能有:键盘扫描,以及显示。
主要是配合硬件。51自带有数学运算符,可直接调用,如果没有时,可自己定义一些函数实现此功能。本回答被网友采纳
相似回答