基于单片机的计算器相关设计.docx_第1页
基于单片机的计算器相关设计.docx_第2页
基于单片机的计算器相关设计.docx_第3页
基于单片机的计算器相关设计.docx_第4页
基于单片机的计算器相关设计.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的计算器设计基于单片机的远程运算器设计 摘 要 计算器(calculator;counter)一般是指“电子计算器”,该名词由日文传入中国。计算器是能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操作简单、价格低廉,因而广泛运用于商业交易中,也是必备的办公用品之一。本文提出一种基于单片机的远程运算器设计,系统包含三个功能模块: (1)红外遥控模块:通过红外遥控器输入想要计算的表达式; (2)主机模块:主机负责红外接收和解码,然后将解码后所得数值通过串口通信发送给从机,同时主机还要进行计算,并且将表达式及计算结果都显示在液晶屏上; (3)从机模块(模拟远程运算):从机负责从串口读取数据,然后进行计算,并把表达式及计算结果显示在液晶屏上; 系统结构如下图所示: 通过远程运算器的设计,不仅加深了对单片机串行通信、液晶屏显示、红外解码等知识的理解和掌握,而且对实际电路设计的步骤有了较为深入的理解。基于单片机的远程运算器的设计,是对单片机课程设计的探索和实践,有一定指导意义。 关键词:远程运算器,单片机,串行通信 I - - 基于单片机的远程运算器设计 目 录 摘 要 . I 引 言.1 1 远程运算器概述.2 1.1 远程运算器结构2 1.2 工作原理2 1.3 功能应用3 2 远程运算器组成.3 2.1 红外遥控器3 2.2 液晶屏显示部分4 2.3 串行通信部分4 3 程序设计流程图.4 3.1 主机程序设计流程图4 3.1.1 主程序流程图.4 3.1.2 红外中断程序流程图.5 3.2 从机程序设计流程图6 3.2.1 主程序流程图.6 3.2.2 串口中断程序流程图.6 结 论. 7 参 考 文 献. 8 附录A 程序清单.9 1、主机程序.9 2、从机程序.14 3、演示图片.17 II - - 引 言 最早的计算工具诞生在中国。 中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多用竹子制成,也有用木头、兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。 直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展。英国数学家纳皮尔发明了“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具为现代计算器的发展奠定了良好的基础。 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器。在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,到了20世纪50年代末,电子计算器问世。 随着科学技术的不断发展及计算器应用的普及,人们发现在工业控制中,有很多时候需要在恶劣的环境中进行各种数据的采集、运算和控制。远程运算器正好可以解决这一难题,人们从主机输入数据或其他控制信息,主机通过串行通信将数据发送给恶劣环境中的从机,从机根据接收到的信息进行各种运算或控制。 本文设计了一个基于单片机的远程运算器,它具有三个模块:红外遥控模块、主机模块、从机模块。红外遥控器采用WD6122芯片,显示部分采用1602液晶屏显示,直观明了。 - 1 - 1 远程运算器概述 远程运算器模拟了工业控制中很常见的远程控制的情况,具有很好的现实意义。 本文设计了一个基于单片机的远程运算器,它具有三个模块:(1)红外遥控模块:通过红外遥控器输入想要计算的表达式;(2)主机模块:主机负责红外接收和解码,然后将解码后所得数值通过串口通信发送给从机,同时主机还要进行计算,并且将表达式及计算结果都显示在液晶屏上;(3)从机模块(模拟远程运算):从机负责从串口读取数据,然后进行计算,并把表达式及计算结果显示在液晶屏上; 1.1 远程运算器结构 本文设计的远程运算器包括三大模块,分别是红外遥控模块、主机模块、从机模块,系统框图如图1.1所示。 图1.1 系统框图 Fig. 1.1 System Structure 1.2 工作原理 通过红外遥控器输入想要计算的表达式,主机进行红外接收和解码,然后将解码后所得数值通过串口通信发送给从机,同时主机进行计算,并且将表达式及计算结果显示在液晶屏上,从机通过串口读取数据,然后进行计算,并把表达式及计算结果显示在液晶屏上。 - 2 - 红外遥控器采用WD6122芯片,该芯片采用CMOS工艺制造,是通用的红外遥控发射集成电路。显示部分采用1602液晶屏,电路简单,显示简洁。 1.3 功能应用 本系统可以完成无符号整形数据(065535)的加、减、乘、除四则运算,两操作数及计算结果都不可超出无符号整形数据的范围。主机和从机通过串行通信实现数据共享,可以分别进行运算和显示。 2 远程运算器组成 下面就远程运算器所涉及的各个部分分别进行阐述。 2.1 红外遥控器 红外遥控器采用WD6122芯片。WD6122芯片是通用红外遥控发射集成电路,采用CMOS工艺制造,最多可外接64个按键,并有三组双重按键。其结构框图如图2.1所示: 图2.1 红外遥控器 - 3 - 2.2 液晶屏显示部分 显示部分采用1602液晶屏,电路简单,显示简洁。 1602有16个引脚,能够显示数字、字母和符号,显示容量为16*2行。1602与单片机的连接图如图2.2所示: 图2.2液晶屏与单片机连接图 2.3 串行通信部分 通过对SM0和SM1进行不同设置可实现四种通信方式,对应关系如下表所示: 本系统采用了方式一。 3 程序设计流程图 3.1 主机程序设计流程图 3.1.1 主程序流程图如下: - 4 - 初始化红配置串口初始化等待红外中断开始while(1)外模块寄存器液晶屏 图3.1.1 流程图如下: 3.1.2 红外中断程序EX1=0延时(确认IR信号出现)检测键值val,如果是运算符,则将该值赋给op串口发送该键值Y数字键,Yf=0?NNy=y*10+valx=x*10+valY运算符,f=1N液晶屏显示该运算符Y等号,f=0液晶屏显示”=”N根据运算符op进行相应运算,结果存入z显示z值Yclear键,清屏Nx=0,y=0EX1=1退出中断 图3.1.2 - 5 - 3.2 从机程序设计流程图 3.2.1 主程序流程图如下: 初始化液配置串口等待串口中断开始while(1)晶屏寄存器 图3.2.1 3.2.2 串口中断程序流程图如下: RI=0读BUF的值存入valY数字键,Yf=0?NNy=y*10+valx=x*10+valY运算符,op=val,f=1N液晶屏显示该运算符Y等号,f=0液晶屏显示”=”N根据运算符op进行相应运算,结果存入z显示z值Yclear键,清屏Nx=0,y=0退出中断 图3.2.2 - 6 - 结 论 随着科学技术的不断发展,在工业控制中,有很多时候需要在恶劣的环境中进行各种数据的采集、运算和控制。远程运算器正好可以解决这一难题,人们从主机输入数据或其他控制信息,主机通过传信通信将数据发送给恶劣环境中的从机,从机根据接收到的信息进行各种运算或控制。因此,远程运算器的设计有着很好的实际应用价值。 此外,通过远程运算器的设计,不仅加深了对单片机串行通信、液晶屏显示、红外解码等知识的理解和掌握,而且对实际电路设计的步骤有了较为深入的理解。设计的基于单片机的远程运算器,是对单片机课程设计的探索和实践,有一定指导意义。 - 7 - 参 考 文 献 1 马斌,韩忠华,王长涛,夏兴华.单片机原理及应用.北京:人民邮电出版社,2009. 2 谭浩强. C程序设计. 北京: 清华大学出版社, 2005. 3 阎石.数字电子技术基础.北京:高等教育出版社,2006. 4 邱关源.电路.北京:高等教育出版社,2006. 5 傅丰林,陈健.低频电子线路.北京:高等教育出版社,2008. - 8 - 附录A 程序清单 1 主机程序: #include #include #define uchar unsigned char #define uint unsigned int uchar IRCOM7; uint x=0,y=0,z=0; uchar op,f,val,pos=1,res5=0,0,0,0,0; sbit IRIN = P33; /红外接收器数据线 sbit E=P27; /1602使能引脚 sbit RW=P26; /1602读写引脚 sbit RS=P25; /1602数据/命令选择引脚 /* * 名称 : void send(unsigned char a) * 功能 : 通信 */ void send(unsigned char a) SBUF=a; while(TI=0); TI=0; void delay(unsigned char x) /x*0.14MS unsigned char i; while(x-) for (i = 0; i13; i+) /*/ void delay1(int ms) unsigned char y; while(ms-) for(y = 0; y250; y+) _nop_(); _nop_(); _nop_(); _nop_(); - 9 - /* * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 */ void Delay2() int i,j; for(i=0; i=10; i+) for(j=0; j=2; j+) ; /* * 名称 : enable(uchar del) * 功能 : 1602命令函数 */ void enable(uchar del) P0 = del; RS = 0; RW = 0; E = 0; Delay2(); E = 1; Delay2(); /* * 名称 : write(uchar del) * 功能 : 1602写数据函数 */ void write(uchar del) P0 = del; RS = 1; RW = 0; E = 0; Delay2(); E = 1; Delay2(); /* * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 */ void L1602_init(void) enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); - 10 - /* * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值 */ void L1602_char(uchar hang,uchar lie,char sign) uchar a; if(hang = 1) a = 0x80; if(hang = 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); /*/ main() IE = 0x84; /允许总中断中断,使能 INT1 外部中断 IT1 = 0; /触发方式为脉冲负边沿触发 IRIN=1; /I/O口初始化 TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; ES=1; SM0=0; SM1=1; delay1(10); /延时 L1602_init(); /初始化LCD while(1) ; /end main /*/ void IR_IN() interrupt 2 using 0 unsigned char j,k,N=0,i; EX1 = 0; delay(15); if (IRIN=1) EX1 =1; return; /确认IR信号出现 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平信号。 delay(1); for (j=0;j4;j+) /收集四组数据 for (k=0;k=30) EX1=1; return; /0.14ms计数过长自动离开。 /高电平计数完毕 IRCOMj=IRCOMj 1; /数据最高位补“0” if (N=8) IRCOMj = IRCOMj | 0x80; /数据最高位补“1” N=0; /end for k /end for j if (IRCOM2!=IRCOM3) EX1=1; return; IRCOM5=IRCOM2 & 0x0F; /取键码的低四位 IRCOM6=IRCOM2 4; /右移4次,高四位变为低四位 if(IRCOM6=0)&(IRCOM5=13) val=0; else if(IRCOM6=0)&(IRCOM5=12) val=1; else if(IRCOM6=1)&(IRCOM5=8) val=2; else if(IRCOM6=5)&(IRCOM5=14) val=3; else if(IRCOM6=0)&(IRCOM5=8) val=4; else if(IRCOM6=1)&(IRCOM5=12) val=5; else if(IRCOM6=5)&(IRCOM5=10) val=6; else if(IRCOM6=4)&(IRCOM5=2) val=7; else if(IRCOM6=5)&(IRCOM5=2) val=8; else if(IRCOM6=4)&(IRCOM5=10) val=9; else if(IRCOM6=4)&(IRCOM5=0) val=10;op=10; else if(IRCOM6=4)&(IRCOM5=4) val=11;op=11; else if(IRCOM6=1)&(IRCOM5=5) val=12;op=12; else if(IRCOM6=0)&(IRCOM5=7) val=14;op=14; else if(IRCOM6=4)&(IRCOM5=3) val=13; else if(IRCOM6=0)&(IRCOM5=9) val=15; send(val); if(val=15) L1602_init(); - 12 - pos=1; x=0; y=0; else if(val=13) L1602_char(1,pos,=); pos+; f=0; if(op=10) z=x+y; if(op=11) z=x-y; if(op=12) z=x*y; if(op=14) z=x/y; res4=z%10+0x30; res3=z%100/10+0x30; res2=z%1000/100+0x30; res1=z%10000/1000+0x30; res0=z/10000+0x30; for(i=0;i9) f=1; if(val=10) L1602_char(1,pos,+); if(val=11) L1602_char(1,pos,-); if(val=12) L1602_char(1,pos,*); if(val=14) L1602_char(1,pos,/); pos+; else if(f=0) x=x*10+val; else y=y*10+val; val+=0x30; L1602_char(1,pos,val); pos+; EX1 = 1; - 13 - 2 从机程序: #include #define uchar unsigned char #define uint unsigned int sbit E=P27; /1602使能引脚 sbit RW=P26; /1602读写引脚 sbit RS=P25; /1602数据/命令选择引脚 uint x=0,y=0,z=0; uchar op,f,val,pos=1,res5=0,0,0,0,0,i; /* * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 */ void delay() int i,j; for(i=0; i=100; i+) for(j=0; j=20; j+) ; /* * 名称 : enable(uchar del) * 功能 : 1602命令函数 */ void enable(uchar del) P0 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); /* * 名称 : write(uchar del) * 功能 : 1602写数据函数 */ void write(uchar del) P0 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); - 14 - /* * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 */ void L1602_init(void) enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); /* * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值 */ void L1602_char(uchar hang,uchar l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论