 刘小雨w1
                刘小雨w1
                
             
                      
     
    
  
    
    
        
        
        
        
        
        
            
               
                
    
                
                	                	                									
									                            								
																
									目  录一、概要设计……………………………………………………………3二、程序整体设计说明………………………………………………4三、程序部分源代码及注释……………………………………………9四、测试结果…………………………………………………………24五、设计心得…………………………………………………………25六、致    谢…………………………………………………………25七、参考文献…………………………………………………………25【摘  要】该程序是一个图形界面的java文档编辑器,其界面主要采用了awt包, 程序实现了文本编辑器的基本功能有:新建文件、打开文件、文件保存、文件另存为、剪切、复制、粘贴、删除、查找/替换、改变字体大小,另外还利用Time类的schedule方法实现了文件的定时自动更新功能,并创建备份文件,由于该编辑器是用的awt包,所以在技术上没有实现将Java的关键字以不同颜色显示功能。【关键字】java  编辑器一、概要设计Java程序编辑器是:图形界面、线程、流与文件等技术的综合应用。图形界面的实现:考虑到简单、实用、高效等特点,就选择了AWT来完成实现,在选择组件上,文本编辑区就选用了TaxtArea作为主要的部件。线程实现文件自动保存:在相关的参考书上查阅到在Time类中有一个schedule方法可以在后台自动完成一定的功能,而且调用起来相当简单,于是就用了Time类中的schedule方法来实现文件自动保存及备份功能。文件操作的实现:利用了字符文件流FileReader和FileWriter类来实现。由于Java的特性,可能用任何一个编辑器来编辑,于是就将Windows中的记事本作为模仿对象,根据实现情况删减了其中的一些功能,如自动换行,设置字体,打印等功能。在设计类的时候,考虑到简单明了,就用了两个类,一个主类和一个默认属性类作为程序的整体框架,所有的对象和方法都是在默认属性类中创建和实现的,以及为各组件注册事件监听程序也是在默认属性类中实现的。主类完成对象的实例化及显示。这们设计的优点是:条理清晰,容易理解,容易修改。这样设计的缺点是:不利于共享类中的方法。二、程序整体设计说明1、程序框架图2、程序中所用类说明(1)用户自定义类类名:EditInstantiation作用:实例化对象继承的父类:WindowAdapter主要成员变量:Frame myFrm                        // 定义主窗体TextArea myText                      // 定义文本编辑区Dialog myDlgFind,myDlgFindont        //查找及设置字体对话框TextField TFfind, TFreplace, TffontSize//查找对话框和字体窗体中的文本行Button BfontOK, Bfind, Breplace, Bnext, Bcancel //定义和创建各按钮Label Lf, Lr, Ls                        //定义和创建各标签MenuBar Mbbar                       //定义和创建主菜单Menu Mfile,Medit,Mformation,Mhelp     //定义和创建主菜单中的选项 Toolkit  toolKit Clipboard  myCB                          //剪切板对象 FileDialog  myFDlg                      //定义文件对话框 Choice ChfontName                 //定义和创建字体选择框   private int VIindex = 1;                 //构成文件名后缀变量   private String VSsubFixStr="java";     //构成文件名扩展名变量   private String VSmyFileName = "Document1",VSmyBFileName;                                     //文件名及备份文件名变量   private File VFmyFile=new File(VSmyFileName+VIindex+"java");                                      //文件名变量     private int VIsearchPosition=0;          //查找位置指针     private Timer VTtime;                 //实例化一个Time类 private int VImin=1;          // schedule方法中的一个时间参数 private int VItype=JOptionPINFORMATION_MESSAGE;                                     //提示对话框类型   private String VStitle;                //提示对话框标题   private String VSmessage;           //提示对话框信息    private boolean VBchanged = true;    //改变字体的一个标识 private  int VIfontSizeMin = 8, VIfontSizeMax = 40, VIfontSizeChangedStep = 2;               //设置字体大小及步长 主要成员方法:public void init()   //初始化各部件菜单的定义和事件的监听public void displayEdit ()//显示窗体及调用Time中的schedule方法public void windowClosing ()    //关闭窗体public void save               //保存文件方法内部类类名:KeyEvents作用:实现菜单的事件的响应功能继承的父类:KeyAdapter主要成员变量:无成员方法:actionPerformed()、keyPressed() 内部类类名:FindKeyEvent作用:实现查找中各部件事件的响应功能继承的父类:无主要成员变量:无成员方法:actionPerformed ()内部类类名:fontEvent作用:实现字体中各部件事件的响应功能继承的父类:无主要成员变量:无成员方法:ItemListener(),ActionListener()(2)用户自定义类与Java类的继承关系图如下: 自定义类       Java 类线程使用说明3、实现接口方法本程序用到的方法有:schedule其方法描述如下:schedule(事件,启动时间,间隔时间);4、线程应用本程序为文本编辑器,为实现自动更新,应用到了线程,每隔1分钟对文件进行自动更新5、异常处理说明 (1)打开文件时的异常处理需要处理的异常:IOException处理方法:捕获异常后,显示捕获的异常(2)保存文件时的异常处理需要处理的异常:IOException处理方法:捕获异常后,显示捕获的异常6、程序运行效果及存在的问题(1)程序运行主要界面如下:a、主界面b、打开文件对话框c、保存文件对话框d、另存为文件对话框e、查找/替换对话框字体对话框程序尚还存在的问题我花费了近一个多星期的时间,查阅了许多相关的资料,终于把这个Java编辑器,程序基本实现了该课程设计的基本要求。但由于自己水平有限,使得程序还有不是很完善,首先,最重要的一点是该设计的最重要的功能自动改变java关键字的颜色没有实现。 三、程序部分源代码及注释//**************************************************** // class name  :Edit // implements  :none // extends     :none // attribute    :public // founction   :entrance of the class //*****************************************************  public  class Edit{           //主类          public static void main(String args[]){                   EditInstantiation myEdit= new EditInstantiation();                   myEinit();       //初始化                   myEdisplayEdit();  //显示窗体             } //**************************************************** // class name  :EditInstantiation // implements  :none // extends     :WindowAdapter // attribute   :default // founction   :EditInstantiation of the main class //*****************************************************       class EditInstantiation extends WindowAdapter{    //默认属性类     //define sources   定义各部件     Frame myFrm=new Frame("我的编辑器");     //定义窗体     TextArea myText=new TextArea();           //定义窗体     Dialog myDlgFind=new Dialog(myFrm,"查找",true); //定义查找对话框     Dialog myDlgFindont=new Dialog(myFrm,"字体",true); //定义字体对话框   TextField TFfind=new TextField(30);//定义查找对话中的查找输入框   TextField TFreplace=new TextField(30); //定义查找对话中的替换输入框   TextField TFfontSize,TFfontDemo;//定义字体大小文本框和示例框   Choice CHfontName;//定义字体大小选择框   List LTfontSize;    //定义字体大小标签   Button BfontOK,BfontCancel;  //定义字体大小对话中的确定及取消按钮   Button Bfind=new Button("查找");//定义查找对话中的查找按钮      Button Breplace=new Button("替换");//定义查找对话中的替换及取消按钮 Button Bnext=new Button("下一个");//定义查找对话中的下一个及取消按钮     Button Bcancel=new Button("取消");//定义查找对话中的确定及取消按钮     Label Lf=new Label("查找内容:");     Label Lr=new Label("替换为:    ");     Label Ls=new Label("字体大小:");     FileDialog myFDlg;     Clipboard myCB=TDefaultToolkit()SystemClipboard();  //剪切板对象     Menu Mfile,Medit,Mformation,Mhelp;     MenuBar MBbar;               //define varities   //定义各变量     private int VIindex = 1;     private String VSsubFixStr="java";     private String VSmyFileName = "Document1",VSmyBFileName;     private File VFmyFile=new File(VSmyFileName+VIindex+"java");     private int VIsearchPosition=0;         private Timer VTtime;  private int VImin=1;  // parameter in time schedul  private int VItype=JOptionPINFORMATION_MESSAGE;     private String VStitle;       private String VSmessage;     // flag of the changeing     private boolean VBchanged = true;  // the scope of the font  private  int VIfontSizeMin = 8, VIfontSizeMax = 40, VIfontSizeChangedStep = 2;                       //************************************************     //founction name:init()     //parameter     :none     //attribute     :public     //founction     :initia all compont      //************************************************     public void init(){          //初始化各部件         //------------------ set  menu   ------------------       MBbar=new MenuBar();       myFsetMenuBar(MBbar);       Mfile=new Menu("文件");       Medit=new Menu("编辑");       Mformation=new Menu("格式");       Mhelp=new Menu("帮助");               MBadd(Mfile);          MBadd(Medit);       MBadd(Mformation);       MBadd(Mhelp);              //文件菜单  add File menu       Madd(new MenuItem("新建",new MenuShortcut(KeyEVK_N)));       Madd(new MenuItem("打开",new MenuShortcut(KeyEVK_O)));       Madd(new MenuItem("保存",new MenuShortcut(KeyEVK_S)));       Madd(new MenuItem("另存为"));       MaddSeparator();//分隔线       Madd(new MenuItem("退出",new MenuShortcut(KeyEVK_E)));              //编辑菜单  add Edit menu       Madd(new MenuItem("剪切"));//,new MenuShortcut(KeyEVK_X)));       Madd(new MenuItem("复制"));//new MenuShortcut(KeyEVK_C)));            Madd(new MenuItem("粘贴"));//new MenuShortcut(KeyEVK_V)));            Madd(new MenuItem("删除"));//new MenuShortcut(KeyEVK_D)));            MaddSeparator();//分隔线            Madd(new MenuItem("查找/替换",new MenuShortcut(KeyEVK_F)));            MaddSeparator();//分隔线            Madd(new MenuItem("全选",new MenuShortcut(KeyEVK_A)));                        //格式菜单  add Formation menu               Madd(new MenuItem("字体",new MenuShortcut(KeyEVK_U)));                      //帮助菜单  add Formation menu       Madd(new MenuItem("关于作者"));            //-----------------  menu add end -------------------------                 //add Menu Action Listener            MaddActionListener(new KeyEvents());       MaddActionListener(new KeyEvents());       MaddActionListener(new KeyEvents());                          MaddActionListener(new FindKeyEvent());              //--------------------------- Find dialog-----------------   myDlgFsetSize(350,115);   myDlgFsetLocation(250,150);   myDlgFsetLayout(new FlowLayout(FlowLCENTER));   myDlgFsetBackground(CLIGHT_GRAY);   BsetEnabled(false);       BsetEnabled(false);       BsetEnabled(false);      myDlgFadd(Lf);   myDlgFadd(TFfind);   myDlgFadd(Lr);   myDlgFadd(TFreplace);     myDlgFadd(Bfind);   myDlgFadd(Breplace);   myDlgFadd(Bnext);   myDlgFadd(Bcancel);     myDlgFaddWindowListener(new WindowAdapter(){      public void windowClosing(WindowEvent e){        myDlgFsetVisible(false);       }});//为查找对话框窗体注册事件监听   TFaddKeyListener(new KeyEvents());//注册事件监听   BaddActionListener(new FindKeyEvent());   BaddActionListener(new FindKeyEvent());   BaddActionListener(new FindKeyEvent());     BaddActionListener(new FindKeyEvent());             //---------------  end add action listener  ------------   //================set font dialog ==============   //font size text field   TFfontSize = new TextField("8",14);      TFfontSselectAll();            //font size list field      LTfontSize = new List(5, false);      LTfontSaddItemListener(new fontEvent());      for(int i = VIfontSizeMin; i <= VIfontSizeMax; i = i + VIfontSizeChangedStep)            LTfontSadd(i + "");//添加字体大小      LTfontSselect(0);        //two Button Ok Cancel      BfontOK = new Button("确定");      BfontOKaddActionListener(new fontEvent());      BfontCancel = new Button("取消");      BfontCaddActionListener(new fontEvent());             //a TextField for demo the font      TFfontDemo = new TextField("Java awt",37);      TFfontDsetEditable(false);            // my font dialog设置字体对话框   myDlgFsetLayout(new FlowLayout(FlowLLEFT));   myDlgFsetBackground(CLIGHT_GRAY);   myDlgFadd(Ls);     myDlgFadd(TFfontSize);      myDlgFadd(BfontOK);   myDlgFadd(BfontCancel);   myDlgFadd(LTfontSize);   myDlgFadd(TFfontDemo);      myDlgFsetSize(300,200);     myDlgFsetLocation(300,200);      myDlgFsetResizable(false);      myDlgFaddWindowListener(new WindowAdapter() {                               public void windowClosing(WindowEvent e) {                                 myDlgFshow(false);                               }                             }); //为字体对话框窗体注册事件监听        //=============end set font dialog                    // =======set Edit frame设置编辑器窗休       myFadd(myText,BorderLCENTER);        myFsetSize(500,400);       myFsetBackground(ClightGray);              myFaddWindowListener(this);              myFsetSize(500,400);         myFsetLocation(200,100);         myFsetTitle("Java编辑器");        }                      //************************************************     //founction name:displayEdit()     //parameter     :none     //attribute     :public     //founction     :initial and display the frame     //************************************************     public void displayEdit(){         //显示窗体       myFsetVisible(true);       //---------------------- auto save ---------------------   VTtime = new Timer(true);         VTschedule(new TimerTask(){              public void run(){      if(VSmyFileName!=null){       save(VSmyFileName+"java");       VSmyBFileName=VSmyFileName+"bak";                        }    //添加自动保存功能     save(VSmyBFileName);           }                 }, VImin*60*1000,VImin*60*1000);                   //parament 1 the task           //parament 2 when to start the task           //parament 3 set the interval time       }             //****************************************************     // class name  :KeyEvents     // implements  :ActionListener     // extends     :KeyAdapter     // attribute   :default     // founction   :implement the mouse and key action     //*****************************************************   class KeyEvents extends KeyAdapter implements ActionListener{          //********************************************************      //founction name:actionPerformed()      //parameter     :none      //attribute     :public      //return        :void      //founction     :realize the key action in the menu      //*********************************************************      public void actionPerformed(ActionEvent e){            //完成菜单事件的功能            // File Menu            if (ActionCommand()=="新建"){        //remind you           JFrame aFrame=new JFrame();           aFsetDefaultCloseOperation(JFEXIT_ON_CLOSE);           JOptionPane optionPane=new JOptionPane();           String choices[]={"是","否","取消"};              int n=optionPshowOptionDialog(aFrame,"文件正文已更改,是否保存更改","文本编辑器",JOptionPYES_NO_CANCEL_OPTION,JOptionPWARNING_MESSAGE,null,choices,choices[0]);              //保存文件后新建           if(n==0){//若文件存在,保存在原文件中,再新建文件          try{                   if(VFmyFxists()){               save(VSmyFileName); // call the save founction          myTsetText("");           VIindex++;               }          else{//若文件不存在,则保存后再新建         myFDlg=new FileDialog(myFrm,"保存文件",FileDSAVE);                       myFDsetFile(VSmyFileName);                       myFDshow();                       VSmyFileName=myFDDirectory()+myFDFile();          save(VSmyFileName);         myTsetText("");          VIindex++;            }         }           catch(Exception ne){}       }         //不保存文件新建        if(n==1){           myTsetText("");           VIindex++;        }            //取消新建        if(n==0){return;}              }                         //打开菜单 Open Menu                if (ActionCommand()=="打开") {                   myFDlg=new FileDialog(myFrm,"打开",FileDLOAD);                   myFDshow();                   if (myFDFile()!="") {                          VFmyFile=new File(myFDDirectory()+myFDFile());                          VSmyFileName=myFDDirectory()+myFDFile();                          if( VFmyFxists()){                                  try{                                         FileReader fr=new FileReader(VFmyFile);                                         BufferedReader br=new BufferedReader(fr);                                         String text;                                         myTsetText("");                                         while ((text=adLine())!=null)                                                 myTappend(text+"/r/n");                                         lose();                                         lose();                                       }                                  catch(IOException ioe){                                     VStitle="提示";                                VSmessage="打开文件出错";                           JOptionPshowMessageDialog(myFrm,VSmessage,VStitle,VItype);                                   }                                                                 }                      }                  }                            //保存菜单 Save Menu            if (ActionCommand()=="保存"){                   myFDlg=new FileDialog(myFrm,"保存文件",FileDSAVE);                   myFDsetFile(VSmyFileName);                                      myFDshow();                   VSmyFileName=myFDFile();                   if(VSmyFileName!=null){                          VSmyFileName=myFDDirectory()+myFDFile();                          save(VSmyFileName);                        }                }                            //另存为菜单 SaveAs Menu            if (ActionCommand()=="另存为"){                   myFDlg=new FileDialog(myFrm,"文件另存为",1);                   myFDsetFile(VSmyFileName);                                      myFDshow();                   VSmyFileName=myFDFile();                   if(VSmyFileName!=null){                          VSmyFileName=myFDDirectory()+myFDFile();                          save(VSmyFileName);                        }                }                            //退出菜单 exit Menu            if (ActionCommand()=="退出")               Sxit(0);                           //编辑 Edit Menu            if (ActionCommand()=="剪切"){                        //Cut      String  text  =myTSelectedText();                  StringSelection  selection  =  new  StringSelection(text);                                    myCBsetContents(selection,  null);                  myTplaceRange("",myTSelectionStart(),myTSelectionEnd());                                           }                           if (ActionCommand()=="复制"){             //copy             String text=myTSelectedText();             if(text!=null){              StringSelection selection=new StringSelect									
								
								
							 
                		                	                		                			
									                            								
																
									基于51单片机的温度测量系统的设计摘 要: 单片机在检测和控制系统中得到广泛的应用, 温度则是系统常需要测量、控制和保持的一个量。 本文从硬件和软件两方面介绍了AT89C2051单片机温度控制系统的设计,对硬件原理图和程序框图作了简洁的描述。 关键词: 单片机AT89C2051;温度传感器DS18B20;温度;测量 引言 单片机在电子产品中的应用已经越来越广泛,并且在很多电子产品中也将其用到温度检测和温度控制。为此在本文中作者设计了基于atmel公司的AT89C2051的温度测量系统。这是一种低成本的利用单片机多余I/O口实现的温度检测电路, 该电路非常简单, 易于实现, 并且适用于几乎所有类型的单片机。 一系统硬件设计 系统的硬件结构如图1所示。1数据采集 数据采集电路如图2所示, 由温度传感器DS18B20采集被控对象的实时温度, 提供给AT89C2051的P2口作为数据输入。在本次设计中我们所控的对象为所处室温。当然作为改进我们可以把传感器与电路板分离,由数据线相连进行通讯,便于测量多种对象。 DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0625℃,被测温度用符号扩展的16位数字量方式串行输出,支持3V~5V的电压范围,使系统设计更灵活、方便;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20使电压、特性有更多的选择,让我们可以构建适合自己的经济的测温系统。如图2所示DS18B20的2脚DQ为数字信号输入/输出端;1脚GND为电源地;3脚VDD为外接供电电源输入端。 AT89C2051(以下简称2051)是一枚8051兼容的单片机微控器,与Intel的MCS-51完全兼容,内藏2K的可程序化Flash存储体,内部有128B字节的数据存储器空间,可直接推动LED,与8051完全相同,有15个可程序化的I/O点,分别是P1端口与P3端口(少了P6)。2接口电路 图2 单片机2051与温度传感器DS18B20的连接图接口电路由ATMEL公司的2051单片机、ULN2003达林顿芯片、4511BCD译码器、串行EEPROM24C16(保存系统参数)、MAX232、数码管及外围电路构成, 单片机以并行通信方式从P0~P7口输出控制信号,通过4511BCD译码器译码,用2个共阴极LED静态显示温度的十位、个位。 串行EEPROM24C16是标准I2C规格且只要两根引脚就能读写。由于单片机2051的P1是一个双向的I/O端口,所以在我们在设计中将P1端口当成输出端口用。由图2可知,P7作为串性的时钟输出信号与24C16的第6脚相接,P6则作为串行数据输出接到24C16的第5脚。P 4和P5则作为两个数码管的位选信号控制,在P4=1时,选中第一个数码管(个位);P5=1时,选中第二个数码管(十位)。P0~P3的输出信号接到译码器4511上作为数码管的显示。此外,由于单片机2051的P3端口有特殊的功能,P0(RXD)串行输入端口,P1(TXD)串行输出端口,P2(INTO)外部中断0,P3(INT1)外部中断1P4,(T0) 外部定时/计数输入点,P5(T1)外部定时/计数输入点。由图2可知,P0和P1作为与MAX232串行通信的接口;P2和P3作为中断信号接口;P4和P5作为外部定时/记数输入点。P7作为一个脉冲输出,控制发光二极管的亮灭。 由于在电路中采用的共阴极的LED数码管,所以在设计电路时加了一个达林顿电路ULN2003对信号进行放大,产生足够大的电流驱动数码管显示。由于4511只能进行BCD十进制译码,只能译到0至9,所以在这里我们利用4511译码输出我们所需要的温度。 3报警电路简介 图3 温度在七段数码管上显示连接图本文中所设计的报警电路较为简单,由一个自我震荡型的蜂鸣器(只要在蜂鸣器两端加上超过3V的电压,蜂鸣器就会叫个不停)和一个发光二极管组成(如图3所示)。在这次设计中蜂鸣器是通过ULN2003电流放大IC来控制。在我们所要求的温度达到一定的上界或者下界时(在文中我们设置的上界温度是45℃,下界温度是5℃),报警电路开始工作,主要程序设计如下: main()//主函数 {unsigned char i=0; 
unsigned int m,n; 
while(1) 
{i=ReadTemperature();//读温度} if(i>0 && i<=10) //如果温度在0到10度之间直接给七段数码管赋值 {P1=designP1[i];} else//如果温度大于10度 {m=i%10;//先给第一个七段数码管赋值 
D1=1; 
D2=0; 
P1=designP1[m]; 
n=i/10;//再给第二个七段数码管赋值 
D1=0; 
D2=1; 
P1=designP1[n]; 
if(n>=4&&m>=5)%%(m<=5)//判断温度的取值范围,如果大于45或小于5度,则蜂鸣器叫,发光二极管闪烁 
{ int a,b; 
Q1=1;//蜂鸣器叫 
for(a=0;a<1000;a++)//发光二极管闪烁 
for(b=0;b<1000;b++) 
Q2=1; 
for(a=0;a<1000;a++) 
for(b=0;b<1000;b++) 
Q2=0;}}}