硬件综合实习

您所在的位置:网站首页 电子计算器中不能进行有括号的运算 硬件综合实习

硬件综合实习

2024-07-16 20:56| 来源: 网络整理| 查看: 265

 

 

中国石油大学(北京)

 

课程设计报告

 

 

 

课程名:  硬件综合实践

 

 

姓    名   许恺              

 

学    号   2014011329      

 

班    级   计算机14-1班    

 

设计时间   2018年1月5日 

 

 

 

 

一、 设计内容

在51单片机上编写烧录十进制四则运算计算机程序,使之具有计算、纠错、显示、括号运算(甚至浮点数运算)的功能。

 

二、 设计思路

根据实习设计要求,经过分析可得整个实验可以分为两个部分,软件和硬件,要明白硬件结合软件的方式以及LCD液晶屏的工作方式和51芯片的编码方式以及按钮的电路连接方式;软件要明白多位数四则运算的代码算法和C的语法。

设计思路可以分为三部分。第一,键盘按钮的扫描;第二,芯片内部的运算;第三,LCD液晶的显示;其中第二部分最为复杂重要。

 

三、 设计解释 3.1、设计环境介绍

51单片机,keil uv3开发软件,烧写软件PZISP自动下载软件.exe,SMC1602A LCM液晶显示屏。

3.2、程序解释(可含硬件部分)

连线:JP8连JP4  JP9连JP5  J8断开  J2断开  JP165断开  把1602液晶插入

 

代码:

/*

                 计算器硬件综合实验

*/

#include          //此文件中定义了51的一些特殊功能寄存器

#include

#define uchar unsigned char

sbit EN=P2^7;  //LCD的使能引脚

sbit RS=P2^6;  //LCD数据命令选择端

sbit RW=P2^5;  //LCD的读写选择端

sbit K1=P3^0;      //*号

sbit K2=P3^1;      // /号

sbit K3=P3^2;   //(号

sbit K4=P3^3;      // )号

sbit K5=P3^4;      // =号

//这里连接了线并且将每位都对应上

code uchar KEY_CODE[]={ 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77,    //3X4矩阵键盘键值表

                                               0x7f,0xbf,0xdf,0xef,0xf7};        //2*4键盘键值表

//定义字符键值表,均为字符对应的ASCII码的十六进制

code uchar CHAR_TABLE[]={0x30,0x31,0x32,0x33,//这四个会在液晶显示器中显示0 1 2 3

                                0x34,0x35,0x36,0x37,//这四个会显示4 5 6 7

                                         0x38,0x39,0x2b,0x2d,//这个四个会显示8 9 + -

                                               0x2a,0x2f,0x28,0x29,//这四个会显示 * / ( )

                                               0x3d};         //这个会显示 =

 

//定义优先级矩阵,分为四种情况,当前的比上一个

0优先级高、2优先级低、1左括号遇到右括号、3发生错误

code uchar yxj[6][7]={

                   //  + - * / (  ) =

                      2,2,0,0,0,2,2, // +

                      2,2,0,0,0,2,2, // -

                      2,2,2,2,0,2,2, // *

                      2,2,2,2,0,2,2, // /   

                      0,0,0,0,0,1,3, // (

                      2,2,2,2,3,2,2, // )

};

uchar str[40];//定义一个队列,用来放整个运算式

void scan(uchar *var);//从矩阵键盘中获取值

void print(int i,int j,uchar *outStr);//打印字符串

void delay5MS();//短延时函数

void delay100MS();//较长延时函数

void writeCMD(uchar com);//写命令子程序

void showOneChar(uchar dat);//写数据子程序

void init();//初始化子程序,初始化液晶显示屏

void clear();//清除显示屏上的显示

int calculate(uchar *arr);//计算函数,输入运算式,返回最终得数

int Precede(char a,char b);//优先级比较函数,输入两个符号,返回0123哪种情况

int Operate(int num1,uchar theta,int num2);//计算函数,输入两个数一个符号,返回运算结果

 

void main()

{

         uchar new=0xff; //new是用来放当前扫描到的字符

         int i=0,j=0,flag=0;//flag用来确认括号是否匹配,遇到左括号++,右括号--

         int finvalue;//存放最后的得数

         uchar text[16];

         uchar text1[16]; //在最后用作字符串逆序

         delay100MS();

//这是必要的,根据1602显示屏的说明书,使用前必须进行初始化

         init();

         //使用前清屏

         clear();

         while(1)

         {

                   flag=0;

                   while(1)

                   {

                            scan(&new);

                         clear();

                            //加入出错判断机制,整个出错判断机制主要是选出所有正确的,不正确的根本不会被加到运算式的字符串中,在显示屏上就是按了不显示。如果有浮点数的话就加上小数点的情况

                            if(new=='='&&flag==0)  //如果new输入=且括号没有问题

                            {

                                     str[i++]=new;

                                     str[i]='\0';

                            }

                            else if(new'9')   //若现在输入是符号

                            {

                                     if(i==0&&new=='(')       //如果第一个要输入(

                                     {

                                               flag++;

                                               str[i++]=new;

                                     }

                                     else if(i!=0&&(str[i-1]=='+'||str[i-1]=='-'||str[i-1]=='*'||str[i-1]=='/'||str[i-1]=='(')&&new=='(')      //前一个是符号时对现在的进行限制

                                     {       

                                               flag++;

                                               str[i++]=new;

                                     }

                                     else if(i!=0&&str[i-1]==')') //前一个符号是)的时候

                                     {

                                               if(new!='('&&new!=')') //现在的不是()的时候可以加进去

                                                        str[i++]=new;

                                               else

                                               if(new==')'&&flag>0) //需要)的时候)后面可以是)

                                               {

                                                        flag--;

                                                        str[i++]=new;

                                               }

                                     }

                                     if(i!=0&&(str[i-1]>='0'&&str[i-1]0) //如果需要)数字后面可以加)

                                               {

                                                        flag--;

                                                        str[i++]=new;

                                               }

                                               if(new!=')') //否则数字后面加什么都行

                                                        str[i++]=new;

                                     }

                            }

                            else    //若现在输入是数字

                            {

                                     if(i==0) //第一位可以是数字

                                               str[i++]=new;

                                     else

                                     {

                                               if(str[i-1]!=')') //只要前一位不是),就可以接数字

                                               {

                                                        if(str[i-1]!='/'||new!='0') //排除/后面接0的可能

                                                                 str[i++]=new;

                                               }

                                     }

                            }

                            //出错判断机制结束,下面把内容显示到显示屏上

                            print(0,0,&str);

                            if(new=='='&&flag==0) //如果现在的符号是=且括号对应正确就直接跳出去进行下一次计算,不过前面出错判断机制规定如果括号不对根本就输不出来=,所以不会括号不对应

                            {

                                     break;

                            }

                   }

                   finvalue=calculate(&str); //根据运算式计算得出最终得数

                   if(finvalue



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3