资源描述
无线环境监测模拟装置
摘要: 本文介绍了一种用于对环境信息进行实时监测的无线环境监测模拟装置的设计方法,系统运用了传感器技术、通信技术和单片机技术, 实现了对环境温度、光照度等数据的准确测量,温度分辨率达0.0625℃,能够实时地与单片机进行无线通信并可靠传输, 产品成本低廉,监测灵敏度高,满足对环境参数实时监测的要求,经试验,该装置探测时延不大于5s的条件下,使探测距离D+D1超过50cm,体现了传感器系统数字化、智能化、无线化的优点。
关键词:环境参数采集、无线传感器系统、温度、光照
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名: 日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名: 日期: 年 月 日
导师签名: 日期: 年 月 日
1 方案比较与设计
1.1 控制电路方案比较与选择:
方案1:采用通用的51单片机作为主控器,完成数据处理,键盘扫描,显示部分的控制等。但51单片机没有AD转换,需外接AD芯片来转换采集到的电压信号,使电路的硬件、软件变得复杂。
方案2:采用STC89C51RC单片机,该单片机在本设计方案中具有以下优点:
1、只需提供3.8~2V的电压;
2、工作频率范围:0~40MHz,相当于普通8051的0~80Hz,实际工作频率
可达48MHz;
3、用户应用程序空间4K/8K/13K/16K/20K/32K/64K字节;
4、低功耗,宽电压范围,抗干扰能力强;
5、共有3个16位定时器/计数器,其中定时器0还可以当做2个8位定时
器使用;
比较上述2种方案,方案2电路简单、软件简洁、功能强,本课题中我们采用方案2。
1.2 显示电路方案比较与选择:
方案1:采用数码管显示,成本低、亮度高、醒目。但在显示较多的项目时,硬件电路复杂,功耗大。
方案2:采用1602LCD液晶屏显示,显示内容较多,方便组合,可视面积大,画面效果好,抗干扰能力强,调用方便简单,而且可以节省了软件中断资源。
课题中需要同时显示温度,光照等信息等,要求显示内容丰富。比较上述2种方案,方案2电路简单、显示信息量大、能很好的满足题目要求,我们采用方案2。
1.3无线收发模块的选择
无线数据传输被广泛应用在车辆监控、遥控、遥测、小型无线网络、无线数据通信、机器人控制、数字音频、数字图像的传输等领域中。
方案1:采用用DF无线数据收发模块。DF无线发射模块通讯方式为调频AM,工作频率为315MHz,为ISM频段,发射频率<500mW。DF超再生式接收模块通讯方式为调频AM,接收灵敏度高,用示波器观察输出波形干净,抗干扰能力强。系统中为保证稳定,采用芯片PT2262,PT2272M4进行数据编解码,由于数据传输量较小,而且传输频率达315MHz,与题目要求不符合,因此我们放弃了此方案。
方案2:TX-2/ RX-2B是一对专用的发射接收大规模集成电路,工作电压为1.5~5.0V,CMOS结构保证了极低的功耗,外围元件少,发射接收能力强,适用于低频电路应用,符合本课题低功耗的要求,因此我们选择此方案。
1.4时钟模块的选择
方案1:采用MCU的定时器进行软件编程实现。考虑到MCU的资源很紧缺,而且大量的中断必然会影响定时的准确性,编程难到加大,因此放弃此方案。
方案2:采用专用时钟芯片DS1302。DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力,长时间保证时钟正常,因此采用此方案。
1.5温度模块
方案1:采用AD590。AD590是美国模拟器件公司生产的单片集成两端感温电流源,精度很高,但需要辅助的AD转换电路以及进行软件的校正,增加了线路的复杂程度,此方案不可行。
方案2:采用DS18B20作为测温电路的温度传感器。DS18B20的数字温度输出通过1-Wire总线,又称为“ 一线 ”总线( 1-Wire是一种独特的数字信号总线协议,它将独特的电源线和信号线复合在一起,仅使用一条口线;每个芯片唯一编码,支持联网寻址、零功耗等待等,是所需硬件连线最少的一种总线),这种独特的方式,可以使多个 DS18B20方便地组建成传感器网络,为整个测量系统的建立和组合提供了更大可能性。它在测温精度、转换时间、传输距离、分辨率等方面比其他温度传感器有了很大的进步,给用户带来了更方便的使用和更令人满意的效果。DS18B20直接输出数字温度值,不需要校正,因此选择此方案。
1.6方案设计与论证
1.6.1整体电路组成
电路部分主要有:温度检测电路,光检测电路,控制电路,显示电路,无线传输检测电路,创新部分电路等模块组成。
1.6.2总体电路组成框图
图1 总体电路组成框图
2 电路设计、理论分析与计算
2.1 主要电路模块的分析计算与设计
根据要求设计制作无线传输载波频率低于30MHz,调制方式自定。监测终端和探测节点不使用除规定天线外的其他耦合方式。无线收发电路需自制,不得采用无线收、发成品模块。光照有无的变化,采用遮挡光电传感器的方法实现。
2.1.1无线发射接收电路
这部分电路是整个电路的核心部分,主要由发射电路,接收电路组成,经计算接发收频率为27MHz,具体设计电路如图2、图3所示。
图2 发射电路原理图
图3 接收电路原理图
采用TX一2/RX一2系配套专用遥控集成芯片作为编解码芯片。它能组成具有五路红外遥控或无线电遥控等功能的独立控制电路,可对遥控玩具汽车进行遥控。小车驱动结构采用H桥电路驱动电机控制方式。TX-5B/RX-5是专用的CMOS专用集成电路,有五根数据线。
特点:有较宽的工作电压范围,较低的待机电流,外围元件少,内置3.6V稳压管。
2.1.2 温度检测电路
温度检测主要采用DS18B20组成,DS18B20是一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
2.1.3光照测量模块
光照测量模块主要由光敏电阻和电压比较器LM324组成。
1)光敏电阻及其原理
光敏电阻器又叫光感电阻,是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。
通常,光敏电阻器都制成薄片结构,以便吸收更多的光能。当它受到光的照射时,半导体片(光敏层)内就激发出电子—空穴对,参与导电,使电路中电流增强。一般光敏电阻器的结构如图6所示,光照二极管照度—电阻特性,如图7所示。
图7 光照二极管照度—电阻特性 图8 电压比较器LM324内部结构
2)电压比较器LM324
LM324是四运放集成电路,它采用14脚双列直插塑料封装,它的内部结构及引脚排列如图8所示,内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。每一组运算放大器可如图8所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与 该输入端的相位相同。由于LM324四运放电路具有电源电压范围宽,静态功耗小,可单电源使用,价格低廉等优点,因此被广泛应用在各种电路中。
本实验中,通过单片机和光敏电阻的结合实现对光线强弱的检测和判断,并把检测结果用数码管显示。
图9
在光的照射下,光敏电阻阻值变小,输入比较器同相端得电压变小,输入电压与比较器参考电压比较,如果输入电压比参考电压大,则输出高电平,如果输入电压比参考电压小,则输入低电平,单片机通过高低电平来确定光照的有无,电路如图9所示。
2.1.4液晶显示电路
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,1602采用标准的16脚接口,如图10所示。
图10 1602液晶模块接口
2.1.5电源供电模块
监测终端单片机采用5V稳压电源供电,每个探测点均采用3V(2节干电池)供电。
2.1.6最小应用系统设计
STC89C51RC是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单、可靠。用AT单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
1)时钟电路
AT89S51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。AT89S52单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。
本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,CX1、CX2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。所以本设计中,振荡晶体选择6MHZ,电容选择65pF。
2)复位电路
复位电路通常有上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R取1KΩ。
除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。按键手动复位电路见图11。时钟频率选用6MHZ时,C取22uF,Rs取200Ω,RK取1KΩ。
图11 AT89S52最小系统 图12 主机流程图
图13 从机A流程图 图14 从机B流程图
2.2 软件设计
2.2.1程序流程图,如图12、图13、图14所示。
2.2.2主要程序清单(见附录2)
按键
控制电路
温度检测电路
显示电路
光照检测电路
无线发射接收电路
3 测试数据与结果分析
本题目制作完成后,对整体电路的主要指标进行了实际测试。实现了对环境温度、光照度等数据的准确测量,温度分辨率达0.0625℃。该装置探测时延不大于5s的条件下,使探测距离D+D1超过50cm,体现了传感器系统数字化、智能化、无线化的优点。
3.1题目要求的测试
根据题目基本要求和发挥部分的要求,我们按要求条件反复作了多次测试,记录了测试结果,并对测试结果做了分析、对比。
3.1.1温度的测试
温度分辨率达0.0625℃
3.1.2光照的测试
能有效的检测到了光照的有无
3.1.3无线通信测试
探测节点有编号预置功能,编码预置范围为00000001B~11111111B。探测节点能够探测其环境温度和光照信息。温度测量范围为0℃~100℃,绝对误差小于2℃;光照信息也有效的检测到了光的有无。
3.2创新部分测试
探测节点B的探测信息,能自动通过探测节点A转发,以增加监测终端与节点B之间的探测距离D+D1。在监测终端电源供给功率≤1W,无线环境监测模拟装置探测时延不大于5s的条件下,使探测距离D+D1达到50cm。
3.3结果分析
总 结
在本次设计的过程中,我们遇到了各种困难和许多没有预想到情况,但通过团队的协作和努力,我们终于克服了困难、解决了问题。系统运用了传感器技术、通信技术和单片机技术, 实现了对环境温度、光照度等数据的准确测量,温度分辨率达0.0625℃,能够实时地与单片机进行无线通信并可靠传输, 产品成本低廉,监测灵敏度高,满足对环境参数实时监测的要求,经试验,该装置探测时延不大于5s的条件下,使探测距离D+D1超过50cm,体现了传感器系统数字化、智能化、无线化的优点。但毕竟我们自身水平有限和时间紧张等因素,本作品在设计上还存在许多值得改进的地方。经过此次电子设计竞赛,我们在电路的设计、调试方面得到了很好锻炼,能力也有了很大的提高,同时也深刻的体会到:实践是理论运用的最好检验,懂得了共同协作和团队精神的重要性,提高了我们分析问题、解决问题的能力。
参考资料:
[1] 刘守义.单片机应用技术.西安:西安电子科技大学出版社,2002
[2] 王福瑞.单片微机测控系统设计大全.北京:北京航空航天大学出版社,
1998
[3] 李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社,
1994
[4] 全国大学生电子设计竞赛组委会. 全国大学生电子设计竞赛获奖作品汇 编:第一届~第五届. 北京:北京理工大学出版社,2004.8
附录A:
附录B(无线发射程序)
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
unsigned char code str1[]={"wendu0:"};
unsigned char code str2[]={"wendu1:"};
unsigned char temp;
unsigned char data flag1;
unsigned int snum=0;
unsigned int key,time1,span1;
unsigned char send1[6],send2[16];
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^7;//ds18b20 端口
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit busy=P2^7;
sbit v1=P1^1; //传送数据口
sbit v2=P1^2;
sbit v3=P1^3;
sbit v4=P1^4;
sbit p33=P3^3;
#define D_port P2 //显示的数据口是P2
/***********************************************************************/
void delay1(uchar MS);
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/************************************************************************/
void delay1ms(unsigned int t)//延时
{unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<50;j++);
}
Checkbusy() //液晶检测忙信号
{
// //P0全部置1,可以查询判断P0口状态,读取液晶的命令
RS=0;
RW=1;
EN=1;
_nop_(); //读液晶命令时各控制位的状态几时序
while(1) //判断最高位状态,最高位是液晶忙的状态位
{
{
P2=0xff;
EN=1; // +++ 要不停地检测 +++
_nop_ ();
_nop_ ();
_nop_ ();
if (!busy) // LCD 空闲则退出
{
EN=0;
break;
}
EN=0;
}
} //如果液晶忙,则循环查询
}
void wr_com(unsigned char com)//写指令//
{ delay1ms(1);
Checkbusy();
RS=0;
RW=0;
EN=0;
P2=com;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
EN=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{ delay1ms(1);
Checkbusy();
RS=1;
RW=0;
EN=0;
D_port=dat;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
EN=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
EN=0;
}
void lcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x3C);delay1ms(5); //8位数据,两行字符,5*10点阵字符体
wr_com(0x0F);delay1ms(5); //开显示,开光标,光标闪烁
}
void display(unsigned char *p)//显示字符串//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
setpos(uchar posx,uchar posy) //显示位置
{
// posx=posx&0xf; //将显示在第几位置转为二十六进制,每行总共16个位置
// posy=posy&0x1; //设置显示在第几行
wr_com(posx+posy*0x40+0x80); //设置位置命令最高位必须为一,所以要加0x80 ,显示的位置
//wr_com(posx);
}
/***************显示一个字符子程序**********************/
displaychar(uchar x,uchar y,uchar a) //显示字符
{
//Checkbusy(); //检查忙标志位
setpos(x,y); //设置显示位置
wr_dat(a); //将要显示的数据写到液晶
}
displaystring(uchar x,uchar y,unsigned char *string) //显示字符串
{
setpos(x,y);
while(*string) //字符串是以'\0'结束的,因此只要每结束就显示下一字符
{
wr_dat(*string); //显示一个字符子程序
string++;
// length++;//液晶显示的位置+1
}
}
unsigned char read_dat()//dushuju//读数据字节
{
unsigned char g1;
delay1ms(1);
Checkbusy();
RS=1;
RW=1;
EN=0;
delay1ms(1);
EN=1;
delay1ms(1);
g1=D_port;
return(g1);
}
unsigned char readchar(uchar x,uchar y) //读字符
{ unsigned char g2;
//Checkbusy(); //检查忙标志位
setpos(x,y); //设置显示位置
g2=read_dat(); //将要显示的数据写到液晶
}
/***********************************************************************/
wendu()
{
delay(100);
temp=ReadTemperature();
}
/***************温度程序**********************/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/*************************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char s=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
s=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
// float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
//tt=t*0.0625;
// t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
code1(int m1,int m2,int m3,int m4,int m5) //代码,用来设置数字、字母、符号等
{
time1=span1; //延时时间
switch(m1)
{case 1:
v1=0; //数据口1为高电平
delay1ms(time1);
v1=1; //数据口为低电平
delay1ms(time1);
break;
case 2:
v2=0;
delay1ms(time1);
v2=1;
delay1ms(time1);
break;
case 3:
v3=0;
delay1ms(time1);
v3=1;
delay1ms(time1);
break;
case 4:
v4=0;
delay1ms(time1);
v4=1;
delay1ms(time1);
break;
}
switch(m2)
{case 1:
v1=0;
delay1ms(time1);
v1=1;
delay1ms(time1);
break;
case 2:
v2=0;
delay1ms(time1);
v2=1;
delay1ms(time1);
break;
case 3:
v3=0;
delay1ms(time1);
v3=1;
delay1ms(time1);
break;
case 4:
v4=0;
delay1ms(time1);
v4=1;
delay1ms(time1);
break;
}
switch(m3)
{case 1:
v1=0;
delay1ms(time1);
v1=1;
delay1ms(time1);
break;
case 2:
v2=0;
delay1ms(time1);
v2=1;
delay1ms(time1);
break;
case 3:
v3=0;
delay1ms(time1);
v3=1;
delay1ms(time1);
break;
case 4:
v4=0;
delay1ms(time1);
v4=1;
delay1ms(time1);
break;
}
switch(m4)
{case 1:
v1=0;
delay1ms(time1);
v1=1;
delay1ms(time1);
break;
case 2:
v2=0;
delay1ms(time1);
v2=1;
delay1ms(time1);
break;
case 3:
v3=0;
delay1ms(time1);
v3=1;
delay1ms(time1);
break;
case 4:
v4=0;
delay1ms(time1);
v4=1;
delay1ms(time1);
break;
}
switch(m5)
{case 1:
v1=0;
delay1ms(time1);
v1=1;
delay1ms(time1);
break;
case 2:
v2=0;
delay1ms(time1);
v2=1;
delay1ms(time1);
break;
case 3:
v3=0;
delay1ms(time1);
v3=1;
delay1ms(time1);
break;
case 4:
v4=0;
delay1ms(time1);
v4=1;
delay1ms(time1);
break;
}
}
first_code(uchar mm)
{
switch(mm)
{
case 'A':
code1(1,1,1,1,4);break;
case 'B':
code1(1,1,1,2,4);break;
case 'C':
code1(1,1,1,3,4);break;
case 'D':
code1(1,1,2,1,4);break;
case 'E':
code1(1,1,2,2,4);break;
case 'F':
code1(1,1,2,3,4);break;
case 'G':
code1(1,1,3,1,4);break;
case 'H':
code1(1,1,3,2,4);break;
case 'I':
code1(1,1,3,3,4);break;
case 'J':
code1(1,2,1,1,4);break;
case 'K':
code1(1,2,1,2,4);break;
case 'L':
code1(1,2,1,3,4);break;
case 'M':
code1(1,2,2,1,4);break;
case 'N':
code1(1,2,2,2,4);break;
case 'O':
code1(1,2,2,3,4);break;
case 'P':
code1(1,2,3,1,4);break;
case 'Q':
code1(1,2,3,2,4);break;
case 'R':
code1(1,2,3,3,4);break;
case 'S':
code1(1,3,1,1,4);break;
case 'T':
code1(1,3,1,2,4);break;
case 'U':
code1(1,3,1,3,4);break;
case 'V':
code1(1,3,2,1,4);break;
case 'W':
code1(1,3,2,2,4);break;
case 'X':
code1(1,3,2,3,4);break;
case 'Y':
code1(1,3,3,1,4);break;
case 'Z':
code1(1,3,3,2,4);break;
case ' ':
code1(1,3,3,3,4);break;
case '!':
code1(2,1,1,1,4);break;
case '"':
code1(2,1,1,2,4);break;
case '#':
code1(2,1,1,3,4);break;
case '$':
code1(2,1,2,1,4);break;
case '%':
code1(2,1,2,2,4);break;
case '&':
code1(2,1,2,3,4);break;
case 27:
code1(2,1,3,1,4);break;
case '(':
code1(2,1,3,2,4);break;
case ')':
code1(2,1,3,3,4);break;
case '*':
code1(2,2,1,1,4);break;
case '+':
code1(2,2,1,2,4);break;
case ',':
code1(2,2,1,3,4);break;
case '-':
code1(2,2,2,1,4);break;
case '.':
code1(2,2,2,2,4);break;
case '/':
code1(2,2,2,3,4);break;
case '0':
code1(2,2,3,1,4);break;
case '1':
code1(2,2,3,2,4);break;
case '2':
code1(2,
展开阅读全文