资源描述
Error! No text of specified style in document.毕业设计论文课题:基于STM32科学计算器的设计姓 名: 刘 斐 系 别: 电子与电气工程系 专 业: 应用电子技术 班 级: 应电1002班 时 间:2012年10月-2013年4月指导老师: 卢 岲 电子与电气工程系2012年10月28日摘 要单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活中的各个领域,电子、科技、通信、汽车、工业等。我们这次设计的科学计算器就是利用STM32单片机制作而成。计算器(calculator)一般是指“电子计算器”,该名词由日文传入中国。计算器是能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操作简单、价格低廉,因而广泛运用于商业交易中,也是必备的办公用品之一。为了进行大量浮点数的运算,并且能很好的支持彩屏的显示,我们选用了计算能力较强的基于Cortex-M3系列的STM32单片机作为微控制器。STM32系列是32位单片机,运算能力远比其他单片机强,基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。时钟频率高达72MHz,远远高于51、AVR等单片机。从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。关键词:STM32、单片机、触摸屏、计算器AbstractMonolithic integrated circuit occurs is a product of the rapid development of computer technology, it is the core of the embedded control system, today, it has been widely applied to all areas of our daily life, electronics, technology, telecommunications, automotive, industrial, etc. Our scientific calculator of this design is to use the STM32 microcontroller produced by.Calculator (Calculator) generally refers to the Calculator, the noun by the Japanese came to China. Calculators are handheld machine that can do the math, with integrated circuit chips, simple structure, less functional, but because of its ease of use, simple operation and low cost, which are widely used in commercial transactions, is one of the essential office supplies.Key words: STM32,microcontroller, touch, calculator目 录摘 要2Abstract3目 录4第一章引言6第二章总体方案设计72.1任务与要求72.1.1任务72.1.2要求72.2方案论证72.2.1单片机系统的选型72.2.2显示屏的选型82.2.3外部存储器的选型82.3系统总体设计8第三章系统硬件设计93.1微控制器简介93.2触摸屏模块简介103.2.1显示部分简介103.2.2触摸部分简介123.3AT24C02简介133.4整体系统硬件设计153.4.1单片机系统设计163.4.2电源部分设计163.4.3单片机和PC机通信设计173.4.4单片机和触摸屏接口设计17第四章系统软件设计204.1系统各个模块初始化204.2显示模块程序设计214.3触摸模块程序设计254.4实现运算表达式的程序设计27第五章总 结32致 谢34参考文献35附 录36第一章 引言最早的计算工具诞生在中国。 中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多用竹子制成,也有用木头、兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。 直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展。英国数学家纳皮尔发明了“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具为现代计算器的发展奠定了良好的基础。 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器。在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,到了20世纪50年代末,电子计算器问世。本文设计的是一种基于STM32科学计算器的设计,通过触摸屏进行人机交互,按键直接显示在触摸屏上,不需要传统的机械按键,并且可以在需要键盘的时候才调出来。传统的机械按键需要占用单片机大量的I/O口,而触摸屏只需要通过SPI接口和单片机通信。第二章 总体方案设计2.1 任务与要求2.1.1 任务完成数学表达式的计算,包括括号、三角函数、log、ln等一些常用的数学函数,并将表达式和结果实时显示出来。2.1.2 要求1. 基本功能实现基本的四则运算,并在触摸屏上显示表达式和结果。当输入错误的表达式时,能显示出相对应的错误,提示用户纠正。2. 扩展功能实现小数、负数的运算。实现平方、n次方、平方根、n次方根的运算。实现三角函数、log、ln等一些常用的数学函数的运算。3.技术指标精确到小数点后6位。计算的范围为-3.410-383.41038。实时显示计算表达式和结果。2.2 方案论证2.2.1 单片机系统的选型单片机系统选用意法半导体基于Cortex-M3的STM32F103ZET6,意法半导体的单片机具有良好的性价比、低功耗、易开发等特点,而且其体系和架构资料丰富,用它能够快速的开发出整个系统。2.2.2 显示屏的选型现有的液晶显示屏的种类很多,我们选用的是2.8寸带触摸的彩屏,320240的分辨率,支持16位色,16位数据接口,这个就足够我们使用了。有了触摸的控制,就可以省掉传统的机械按键,直接在屏幕上显示按键。2.2.3 外部存储器的选型外部存储器我们选用Atmel公司的AT24C02,是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。2.3 系统总体设计根据设计要求和模块选型系统总体方案设计如图1。本系统主要是在触摸屏上显示各种信息文本,所以硬件电路比较简洁,不需要很多硬件。PC机通过RS232串行接口和STM32进行数据通信,STM32和显示屏通过16位并行接口通信,和触摸板通过SPI接口进行通信。STM32最小系统PC机触摸屏24C02图1第三章 系统硬件设计3.1 微控制器简介为了进行大量浮点数的运算,并且能很好的支持彩屏的显示,我们选用了计算能力较强的基于Cortex-M3系列的STM32F103ZET6作为微控制器。Cortex-M3是ARM公司研发的一个系列,针对于微控制开发领域,采用ARMv7-M架构,它包括所有的16位Thumb指令集和基本的32位Thumb-2指令集架构。Thumb-2在Thumb指令集架构(ISA)上进行了大量的改进,它与Thumb相比,具有更高的代码密度并提供16/32位指令的更高性能。ARM的Cortex-M3处理器是最新一代的嵌入式ARM处理器,它为实现MCU的需要提供了低成本的平台、缩减的引脚数目、降低的系统功耗,同时提供卓越的计算性能和先进的中断系统响应。ARM的Cortex-M3是32位的RISC处理器,提供额外的代码效率,在通常8和16位系统的存储空间上发挥了ARM内核的高性能。我们采用的意法半导体公司生产的STM32F103ZET6就是基于ARM Cortex-M3内核的,具有高性能、低成本、低功耗等特点,最高主频可达72MHz,高达512K字节的闪存和64K字节的SRAM,112个GPIO端口,4个通用定时器,2个高级控制定时器,2个基本定时器,还包含标准和先进的通信接口:多达2个I2C接口、3个SPI接口、2个I2S接口、1个SDIO接口、5个USART接口、一个USB接口和一个CAN接口。这些丰富的外设配置,使得STM32F103大容量增强型系列微控制器适合于多种应用场合:电机驱动和应用控制医疗和手持设备PC游戏外设和GPS平台工业应用:可编程控制器(PLC)、变频器、打印机和扫描仪警报系统、视频对讲、和暖气通风空调系统等3.2 触摸屏模块简介3.2.1 显示部分简介TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。TFT液晶显示屏的特点是亮度好、对比度高、层次感强、颜色鲜艳,但也存在着比较耗电和成本过高的不足。TFT型的液晶显示器主要的构成包括:萤光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料、薄模式晶体管等等。我们这里使用的一种TFTLCD模块有如下特点:1.显示屏2.8寸的大小。2.320240的分辨率。3.16位真彩显示。4.自带触摸屏,可以用来作为控制输入。5.通用的接口,显示部分为16位并行接口,触摸控制部分为SPI接口。该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320。TFTLCD模块采用80并口方式与外部连接,采用16位数据线该模块的80并口有如下一些信号线:CS:TFTLCD片选信号。WR:向TFTLCD写入数据。RD:从TFTLCD读取数据。D15:0:16位双向数据线。RST:硬复位TFTLCD。RS:命令/数据标志(0,读写命令;1,读写数据)。TFTLCD模块的RST信号线直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。模块的控制器为ILI9320,该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。模块的16位数据线与显寸的对应关系为565方式,如下图所示:在计算机中,常见的颜色有 8位、16位、24位、32位色,其中24位及以上称为真彩,我们这里使用的是16位,最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。我们这里使用的是RGB模式,RGB色彩就是常说的三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。之所以称为三原色,是因为在自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。RGB模式又称RGB色空间。它是一种色光表色模式,它广泛用于我们的生活中,如电视机、计算机显示屏、幻灯片等都是利用光来呈色。比如我们要显示红色,就用F800H来表示,绿色就是07E0H,蓝色001FH,三种混合起来就是白色,也就是FFFFH。3.2.2 触摸部分简介我们一般液晶所用的触摸屏,最多的就是电阻式触摸屏了(多点触摸属于电容式触摸屏,比如M8,IPhone等支持多点触摸的手机所用的屏就是电容式的触摸屏),TFTLCD自带的触摸屏属于电阻式触摸屏,下面简单介绍下电阻式触摸屏的原理。电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。电阻屏的特点有:1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。3)电阻触摸屏的精度只取决于A/D转换的精度,因此都能轻松达到4096*4096。从以上介绍可知,触摸屏都需要一个AD转换器, 一般来说是需要一个控制器的。TFTLCD模块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、TSC2046、XPT2046和AK4182等。这几款芯片的驱动基本上是一样的,也就是你只要写出了ADS7843的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全pin to pin。所以在替换起来,很方便。TFTLCD模块自带的触摸屏控制芯片为XPT2046。XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。XPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)和VFBGA48。工作温度范围为-40+85。3.3 AT24C02简介AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。AT24C02具有以下特性:1.数据线上的看门狗定时器 2.可编程复位门栏电平 3.高数据传送速率为400KHz和1C总线兼容 4.2.7V至7V的工作电压 5.低功耗CMOS工艺 6.16字节页写缓冲区 7.片内防误擦除写保护 8.高低电平复位信号输出 9.100万次擦写周期 10.数据保存可达100年 11.商业级、工业级和汽车温度范围引脚描述引脚名称功能A0、A1、A2器件地址选择SDA串行数据/地址SCL串行时钟WP写保护VCC+1.8V6.0V 工作电压VSS地SCL 串行时钟 AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。 SDA 串行数据/地址 AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。 A0、A1、A2 器件地址输入端 这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。 WP 写保护 如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作。AT24C02的存储容量为2Kb,内容分成32页,每页8B,共256B,操作时有两种寻址方式:芯片寻址和片内子地址寻址。 (1)芯片寻址:AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/W为芯片读写控制位,该位为0,表示芯片进行写操作。 (2)片内子地址寻址:芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00FF,共256个寻址单位。3.4 整体系统硬件设计3.4.1 单片机系统设计这是STM32F103ZET6的最小系统原理图,复位引脚NRST接一个10K电阻到VCC,接一个104的电容到地,即可构成上电复位的电路。OSC_IN和OSC_OUT之间并联一个8MHz晶振,再在晶振两端分别接20pF的电容到地,即可构成单片机的外部振荡电路。3.4.2 电源部分设计整个系统由电脑的USB接口供电,再由系统中的AMS1117-3.3稳压芯片降压到3.3V,供给单片机和触摸屏使用。电路如图所示。3.4.3 单片机和PC机通信设计由于现在很多电脑都没有串口了,所以我们选用了PL-2303将USB接口转为串口再和单片机通信。电路如图所示。其中PL2303_D+和PL2303_D-分别接到USB的D+和D-端,RXD和TXD分别接到单片机的PA9和PA10脚。这样电脑就可以通过USB接口和单片机通信了。3.4.4 单片机和触摸屏接口设计如图所示为系统的触摸屏接口,各引脚定义如下:LCD_CS:TFTLCD片选信号。LCD_WR:向TFTLCD写入数据。LCD_RD:从TFTLCD读取数据。LCD_D15:0:16位双向数据线。RESET:硬复位TFTLCD。LCED_RS:命令/数据标志(0,读写命令;1,读写数据)。LCD_BL:触摸屏背光源的控制引脚。T_MISO:触摸屏串行数据输出端。T_MOSI:触摸屏串行数据输入端。T_SCK:触摸屏时钟信号端。T_CS:触摸屏片选端。T_PEN:触摸屏中断输出端。第四章 系统软件设计4.1 系统各个模块初始化开始系统时钟初始化延时初始化LCD初始化按键初始化触摸屏初始化禁用JTAG、SWD显示计算器的输入界面系统上电或复位后,首先进行各个模块的初始化,其流程图如图所示。4.2 显示模块程序设计显示模块程序由LCD初始化程序和定时器中断程序,首先由LCD初始化程序将屏幕上需要显示的按键显示,再由定时器中断程序定时刷新屏幕显示表达式的区域,将输入的表达式实时显示出来。LCD初始化流程图如下:开始使能GPIOB、GPIOC时钟开启辅助时钟设置GPIOB、GPIOC为推挽输出向LCD写初始化指令开启背光源LCD初始化程序设计:/* * 函数名称:void LCD_Init(void) * 函数功能:初始化LCD * 输入参数:无 * 输出参数:无*/void LCD_Init(void) RCC-APB2ENR|=1APB2ENR|=1APB2ENR|=1CRH&=0XFFFFF000;GPIOC-CRH|=0X00000333; GPIOC-CRL&=0X00FFFFFF;GPIOC-CRL|=0X33000000; GPIOC-ODR|=0X07C0; /PORTB 推挽输出 GPIOB-CRH=0X33333333;GPIOB-CRL=0X33333333; GPIOB-ODR=0XFFFF;delay_ms(50); / delay 50 ms LCD_WriteReg(0x0000,0x0001);delay_ms(50); / delay 50 ms LCD_WriteReg(0X00,0X0001); delay_ms(10); LCD_WriteReg(0X10,0X1628); LCD_WriteReg(0X12,0X000e);/0x0006 LCD_WriteReg(0X13,0X0A39); delay_ms(10); LCD_WriteReg(0X11,0X0040); LCD_WriteReg(0X15,0X0050); delay_ms(10); LCD_WriteReg(0X12,0X001e);/16 delay_ms(10); LCD_WriteReg(0X10,0X1620); LCD_WriteReg(0X13,0X2A39); delay_ms(10); LCD_WriteReg(0X01,0X0100); LCD_WriteReg(0X02,0X0300); LCD_WriteReg(0X03,0X1030);/改变方向的 LCD_WriteReg(0X08,0X0202); LCD_WriteReg(0X0A,0X0008); LCD_WriteReg(0X30,0X0000); LCD_WriteReg(0X31,0X0402); LCD_WriteReg(0X32,0X0106); LCD_WriteReg(0X33,0X0503); LCD_WriteReg(0X34,0X0104); LCD_WriteReg(0X35,0X0301); LCD_WriteReg(0X36,0X0707); LCD_WriteReg(0X37,0X0305); LCD_WriteReg(0X38,0X0208); LCD_WriteReg(0X39,0X0F0B); LCD_WriteReg(0X41,0X0002); LCD_WriteReg(0X60,0X2700); LCD_WriteReg(0X61,0X0001); LCD_WriteReg(0X90,0X0210); LCD_WriteReg(0X92,0X010A); LCD_WriteReg(0X93,0X0004); LCD_WriteReg(0XA0,0X0100); LCD_WriteReg(0X07,0X0001); LCD_WriteReg(0X07,0X0021); LCD_WriteReg(0X07,0X0023); LCD_WriteReg(0X07,0X0033); LCD_WriteReg(0X07,0X0133); LCD_WriteReg(0XA0,0X0000); LCD_LED=1;/点亮背光 LCD_Clear(white);显示符号开始屏幕左方是否有未显示的字符屏幕右方是否有未显示的字符显示符号显示光标所在位置清除中断标志是否否是定时器中断流程图: 定时器中断程序设计:/* * 函数名称:void TIM3_IRQHandler(void) * 函数功能:定时器3中断程序 * 输入参数:无 * 输出参数:无*/ void TIM3_IRQHandler(void) static u8 flash=0,counter=0; if(TIM3-SR&0x0001)/溢出中断Show_String(&stringstart);if(start!=0)Show_Char(4,60,);elseShow_Char(224,60, );if(flash=0)/显示光标Point_Color=black;elsePoint_Color=white;LCD_DrawLine(cursor,33,cursor,53);LCD_DrawLine(cursor+1,33,cursor+1,53);Point_Color=black;counter+;if(counter=100)counter=0;flash=flash; TIM3-SR&=(1APB2ENR|=1APB2ENR|=1CRL&=0XFFFF0000;/PC03GPIOC-CRL|=0X00003883; GPIOC-CRH&=0XFF0FFFFF;/PC13GPIOC-CRH|=0X00300000;/PC13推挽输出 GPIOC-ODR|=0X200f; /PC03 13 全部上拉 Read_ADS(&Pen_Point.X,&Pen_Point.Y);/第一次读取初始化 MY_NVIC_Init(2,0,EXTI1_IRQChannel,2); Ex_NVIC_Config(GPIO_C,1,FTIR);/将line1映射到PC.1,下降沿触发.#ifdef ADJ_SAVE_ENABLE AT24CXX_Init();/初始化24CXXif(Get_Adjdata()return;/已经校准else /未校准? LCD_Clear(white);/清屏 Touch_Adjust(); /屏幕校准 Save_Adjdata(); Get_Adjdata();#elseLCD_Clear(white);/清屏 Touch_Adjust(); /屏幕校准,带自动保存 #endif 当触屏上某一点被按下时,触摸屏就会向单片机申请中断,单片机响应中断后,就会去执行相应的程序,将得到的数据转化为显示屏上实际的坐标,再返回相对应的键值,流程图如下所示:开始得到的数据是否有效将数据转为LCD上实际坐标返回根据坐标获得相应键值延时20ms再次读取数据两次读取数据是否在误差范围内返回键值否否是是4.4 实现运算表达式的程序设计当我们把表达式输入完,单片机就要对表达式进行求解,这个过程就叫做解析表达式。我们这里采用一个叫做递归下降的算法进行解析表达式。首先有单片机判断表达式是否有错误,有错误的话返回相应的错误,并显示出来,提示用户输入了错误的表达式。首先建立两个堆栈,分别叫做数值栈和符号栈。我们规定一个记号,来表示栈底。下面我们就来看看如何计算一个简单的表达式:3567823 (82指的是82)这里运算有三种优先级“”“”“”,如何实现优先级运算呢?递归下降算法的核心就是一下几点:开始:1.如果当前输入串中得到的是数字,则直接压入值栈,然后转到开始。2.如果当前输入串中得到的是符号,那么对符号进行判断: 1)如果是第一个符号,则直接压入符号栈; 2)如果符号比上一个符号的优先级高,则压入符号栈; 3)如果符号比上一个符号的优先级低或者相等,则弹出栈进行运算,直到比上一个符号的优先级高; 5)如果符号是(,则直接压入符号栈; 4)如果符号是),则依照符号栈的顺序弹出符号,计算栈中数值,把结果压入值栈,直到符号栈顶是(,最后再弹出(。最后转到开始。3.如果当前输入串得到的是EOF(字符串结束符号),则计算栈中数值,直到符号栈没有符号。对于上面的表达式就这样计算:1. 将3、+、5压入堆栈;2. 现在遇到+号,和上一个运算符+比较,相等,则计算“3+5”,表达式变为867823;3. 6压入数值栈,比高,压入符号栈;4. 再将7压入数值栈,和上一个符号相同,就计算“67”,表达式变为842823;5. 8压入符号栈,比上一个符号高,压栈;6. 2压入符号栈,和上一个相同,计算“82”,表达式变为842643;7. 继续,842262144;8. 继续,81.101107;9. 最后得出结果,1.101107。可以看出,如果利用操作数堆栈和运算符堆栈的话,只要: 1步进扫描表达式。 2遇到操作数就压入操作数堆栈中,遇到运算符就将它的优先级与运算符堆栈栈顶运算符的优先级比较,如果它的优先级更大,就将它压入堆栈,否则就将栈顶运算符弹出来进行运算。只要这样就可以实现优先级的运算。对于一个合法的简单数学表达式,肯定是一个操作数跟着一个运算符,第一个和最后一个都是操作数。因此最简单的程序编写方法就是写一个取操作数的程序Get_Num(),再写一个取运算符的程序Get_Operator(),然后循环执行。1.取操作数Get_Num():(1)取操作数时首先遇到的不一定就是操作数本身,而可能是“(”、“sin(”、“cos(”、“tan(”、“tg(”、“lg(”、“ln(”或自反运算符“-”或无意义的“”号,首先将它们压入运算符栈中。(2)然后检查是不是“x”、“y”、“z”等变量或“PI”等常量,有的话将它们的值压到操作数栈中。(3)如果不是变量或常量,则检查数的合法性,如果不是合法数,就退出全部运算。2取运算符Get_Operator():(1)取运算符时首先遇到的不一定就是运算符,而可能是“)”,先要对它进行处理。(2)然后检查是不是扫描到了最后,如果是就清栈输出结果。(3)取出新运算符并给它对应的优先级。(4)如果运算符堆栈不为空,从中弹出一个运算符,比较优先级,如果新的运算符优先级小于等于弹出运算符优先级,就把弹出运算符重新压回去,否则对弹出运算符进行运算。(5)将新运算符压入堆栈中。程序的流程图如下:开始当前字符是数字?当前运算符是第一个?当前运算符比前一个优先级高?弹出栈进行运算,直到比前一个优先级高表达式是否已结束?返回表达式的计算结果是是是是否否否否压入数值栈压入符号栈压入符号栈但是这还只是一种算法,和我们的系统无关,所以需要将这个移植到我们的系统来使用,移植后的具体程序见附件。第五章 总 结经过了一个多月的毕业设计,完成了从理论到实践的突破,整个系统在收集了很多资料以后,完成了系统硬件的调试和程序的编写。从最开始还不知道什么是单片机到现在,也有一年多的时间了,能在这么短的时间在这个方面取得这么大的成就,自己也感到很欣慰,获得不小的成绩。随着电子技术的飞速发展,高科技产品也越来越多,生活条件也大大的改善,而单片机只是这些中的一小部分,还有很多需要我们去学习。很早之前就听说过ARM这个名词,但是还不了解,后来经过慢慢的学习,对这个ARM也越来越熟悉了,既是一个公司的名字,也是对ARM处理器的总称,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。但是ARM公司自己不生产芯片,只研究ARM内核技术,将知识产权交易给其他半导体公司生产,这一点很佩服ARM公司。全球 95% 以上的手机以及超过四分之一的电子设备都在使用 ARM 技术。ARM处理器也分为很多种,有ARM7、ARM9、ARM11、Cortex-M、Cortex-R和Cortex-A。其中Cortex-M就是针对于微控制领域,之前对这个很感兴趣,但是一直没机会学习,正好有毕业设计这个机会,就借用这个机会来进一步学习。和老师一说,就很支持我使用ARM处理器,选用了一个基于Cortex-M3的STM32F103ZET6微控制器,当时还对这个芯片还不了解,查了大量的资料,经过一个多月的摸索,慢慢熟悉了。制作这个项目最大的问题就在于硬件的制作,在硬件上卢岲老师给了我很大的帮助。由于这个微控制器的封装比较小,引脚间很密,引脚也很短,所以必须要制作印制电路板,电路板的设计都是自己完成的,但联系厂家制作印制电路板是卢岲老师帮忙完成的。第一次看到把自己设计的印制电路板做成实物出来,还是有点小成就感的。但是这个电路板在很多地方设计的有缺陷,在设计印制电路板这方面,也有很多东西要注意的,在以后的学习中继续研究。在制作完电路板后,元件的焊接又成了一大问题,自己对付一些插件、电阻、电容还是没问题的,但是那个单片机就需要一定的技术才能焊好,这个也是卢岲老师帮忙完成的。但是焊接后还是存在一些小问题。对于人机交互的界面显示也是一个重要的问题,美观的界面让人心情舒畅,但由于受自己的水平有限,界面只是几个简单的字符,都没有把彩屏的特点发挥出来,这一点需要在以后的项目中加强学习。毕业设计结束了,通过设计,我深刻领会到基础的重要性,毕业设计不仅仅能帮助学生检验大学三年的学习成果,更多的是毕业设计可以帮助我们更加清楚的认识自我,磨练学生的意志与耐性,这会为学生日后的工作和生活带来很大的帮助。致 谢对于项目的完成卢贶老师在硬件上给了我很大的帮助,特别是贴片元件的焊接,这个没有一定的技术是焊不好的。在项目开始的过程中卢贶老师为我制作了印制电路板,在整个毕业设计的过程中,卢贶老师对我的要求严格,以至于我不敢放松每个周的工作进程,使我顺利的完成了毕业设计,在此表示感谢。毕业设计,帮助我们总结大学三年收获、认清自我。同时,还帮助我们改变一些处理事情时懒散的习惯。从最开始时的搜集资料,整理资料,到方案比选,确定方案,再到着手开始进行路基工程、路面工程和路线排水的设计,每一步都是环环相扣,衔接紧密,其中任何一个步骤产生遗漏或者疏忽,就会对以后的设计带来很多的不便。同时在这个项目的完成过程中,网络上的很多资料给了我很大的帮助,特别是递归下降算法的原理,在不知道这个算法之前,我不知道如何去计算表达式的结果。我参照了很多网友的编写的源代码,和他们的程序设计经验。使我能够在顺利的完成此次毕业设计,在此也表示感谢。最后要感谢学院为我们提供良好的软硬件设施,从硬件设施方面,首先是实训中心,能够给我制作印制电路板,让我方便了很多,大大的加快了我的项目进程。从软件设施方面,要感谢学院三年来对我的教育和培养,我现在能够顺利的完成这次毕业设计,离不开各位老师平时对我们的严格要求,认真负责的工作态度以及诲人不倦的敬业精神。参考文献1 李法春主编.单片机原理及接口技术案例教程M.北京:机械工业出版社,2006.2 刘军.例说STM32M.北京:北京航空航天大学出版社,2011.3 蒙博宇. STM32自学笔记M. 北京:北京航空航天大学出版社,2012.4 彭刚. 基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践M.北京:电子工业出版社.2011.5 Joseph Yiu. ARM Cortex-M3权威指南M. 北京:北京航空航天大学出版社,2009.6 喻金钱. STM32F系列ARM Cortex-M3核微控制器开发与应用M.北京: 清华大学出版社,2011.7 刘波文. ARM Cortex-M3应用开发实例详解M. 北京:电子工业出版社.2011.附 录主程序:#include#includesys.h#includetimer.h#includeusart.h#includedelay.h#includeLCD.h#includekey.h#includetouch.h#include24cxx.h#includegui.h#includecalculate.h u8 cursor=2;u8 start=0;u8 string30;/* * 函数名称:void TIM3_IRQHandler(void) * 函数功能:定时器3中断程序 * 输入参数:无 * 输出参数:无*/ void TIM3_IRQHandler(void) static u8 flash=0,counter=0; if(TIM3-SR&0x0001)/溢出中断Show_String(&stringstart);if(start!=0)Show_Char(4,45,);elseShow_Char(224,45, );if(flash=0)Point_Color=black;elsePoint_Color=white;LCD_DrawLine(cursor,18,cursor,38);LCD_DrawLine(cursor+1,18,cursor+1,38);Point_Color=black;counter+;if(counter=100)counter=0;flash=flash; TIM3-SR&=(10);/清除中断标志位 /* * 函数名称:int main(void) * 函数功能:主程序 * 输入参数:无 * 输出参数:无*/int main(void)u8 key,t,i;s8 error_type;float result=0;Stm32_Clock_Init(9);/系统时钟初始化,9倍频Delay_Init(72);/延时初始化,72MHzLCD_Init();/LCD初始化KEY_Init();/按键初始化Touch_Init();/触摸屏初始化JTAG_Set(JTAG_SWD_DISABLE);/禁用JTAG、SWDfor(i=0;i30;i+)stringi= ;key=KEY_Scan();if(key=2)Touch_Adju
展开阅读全文