接触电流测试仪设计毕业设计(编辑修改稿)内容摘要:

序中有一个计数器,每产生200次中断,有一个1秒计数。 按键扫描采用单个按键的扫描,有相应的按键处理子程序,程序中包括按键去抖动,按键的键后处理,去抖动采用延时去抖法。 显示子程序在主程序中被调用对时间进行实时显示。 ,主要完成系统的初始化,按键扫描,显示程序及其他子程序调用等功能。 void main ( void ){ INT8U i。 Init_devices()。 Initial()。 while(1) { WDR()。 /*外部按键响应*/ if( ExtKey_Pressed ) {ExtKey_Pressed = FALSE。 ExtKey_DealWith()。 } /*按键响应*/ if( Key_Pressed ) { Key_Pressed = FALSE。 if (AutoPress) { AutoPress。 Key_Valu = AutoKeyVal。 if (AutoPress){Key_Pressed = TRUE。 } }if (KeySound){Buzzer_ON(3)。 } Key_DealWith()。 } /*菜单显示*/ if ((!AutoPress)amp。 amp。 (State==STOP)){MenuDisp()。 } /*读取时间*/ if (tRead8563=40){tRead8563 = 0。 GetPCF8563()。 } // 200ms /*运行测试*/ if ( State == RUN ) { Control()。 // 输出控制 DispInit()。 StateInfo()。 TestingFace()。 // 显示测试界面 DispAll()。 BackLight()。 // 背光 } else if ( State == PAUSE ) { DispInit()。 StateInfo()。 TestingFace()。 // 显示测试界面 DispAll()。 BackLight()。 // 背光 } else { BitMove = 0。 CtrlPort = 0。 OutPort = 0。 CurChanel = 0。 Step = STEP_clr。 memset(StartTime,0xff,sizeof(StartTime))。 memset(StopTime ,0xff,sizeof(StopTime ))。 /*测试完成后,检验测试结果是否合格?*/ if (Pass==TRUE) { Buzzer_ON(1000)。 // 1S Message(600,5)。 // 合格 3S } else if (Pass==FALSE) { Buzzer_ON(2000)。 // 2S Message(600,6)。 // 不合格 3S } Pass = 0xff。 } /* 接收处理* if ( UART_State == TX_Make ){TX_Pack( UART_Cmd )。 } // 形成发送数据 else if ( UART_State == RX_Done ){RX_Unpack()。 } // 接收结束后处理接收数据并准备发送内容 else if ( UART_State == RX ) { if ( UART_Tx_Reqamp。 IO_Ctrl ) // 切换通道 { UART_Tx_Req amp。 = ~IO_Ctrl。 UART_Cmd = 39。 J39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 AD_Clear )// 询问接触电流采集值 { UART_Tx_Req amp。 = ~AD_Clear。 UART_Cmd = 39。 Z39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 AD_Quer ) // 询问接触电流采集值 { UART_Tx_Req amp。 = ~AD_Quer。 UART_Cmd = 39。 Q39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 CK_Vset ) // 设定程控电源输出电压 { UART_Tx_Req amp。 = ~CK_Vset。 UART_Cmd = 39。 v39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 CK_Vquer ) // 询问程控电源电压 { UART_Tx_Req amp。 = ~CK_Vquer。 UART_Cmd = 39。 V39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 CK_Aquer ) // 询问程控电源电流 { UART_Tx_Req amp。 = ~CK_Aquer。 UART_Cmd = 39。 A39。 UART_State = TX_Make。 } else if ( UART_Tx_Reqamp。 CK_Vout ) // 打开程控电源输出 { UART_Tx_Req amp。 = ~CK_Vout。 UART_Cmd = 39。 O39。 UART_State = TX_Make。 } } /*更改时钟*/ if ( Modify8563 ) { for ( i=0。 i8。 i++ ){SetClock[i]=GetClock[i]。 } Modify8563 = FALSE。 } /*写8563*/ if ( Write8563 ){SetPCF8563()。 Write8563 = FALSE。 } /*保存数据*/ if( SignSave ){Save()。 } }}一般的情况下是在上电的时候初始化,还有就是程序跑飞和出现异常时也要初始化,初始化的目的就是把所有用到的标志位、变量回到设定的初始值,以及引脚的分配,配置寄存器写入需要的值,像时钟的选择(内部、外部)一般在上电时就做好,以后不是特殊需要是不改动的,引脚功能的分配也是一上来就设置好,之后如果可以就不改动,如果经常性的改可能会引发异常。 接通电源之后进入初始化,初始化中有外部设备初始化和变量初始化,其中外部设备初始化包括IO口初始化,定时器TO,T1的初始化,TWI初始化。 变量初始化即初始化函数定义。 初始化中还包括初始化界面的显示开始时显示启动中即信息提示,此程序在整个过程中很重要,通过此程序可以判断测试进入哪个阶段。 在初始化部分中根据程序设计可以知道接通电源之后进行初始化的工作基本步骤可以通过接下来的Proteus仿真来验证此部分设计的正确性。 如果正确首先显示的是“启动中”,一秒钟之后会显示版本信息,版本信息显示时间为三秒钟。 一步一步按程序设置显示相应的信息。 对于一个由单片机为核心构成的系统而言。 输入通道是相当重要的。 可以看到几乎每一样基于单片机的产品都有人机交互的部分。 而此设计也不例外可以实现人机交互。 进行初始化之后就判断是否有外部按键响应或内部按键响应。 如有外部按键就进行测试,如有内部按键相应及进行设置其程序对应如下程序4和程序5。 由于篇幅限制按键处理程序在附件里。 按键功能的设计说明:此设计中包括上,下,左,右,确定和放弃六个键,接通电源之后可以通过按确定键进入系统设置,在系统设置的各种可选项中同样可以通过确定键进入下一级的设置,确认设置结果按确定键。 在同一级的菜单中可以通过上下键来选择。 同时通过确认键进入数值设置。 在进行数值设置时可以按左右来设置,左键是减,右键是加。 如果想退出当前状态可以选择放弃键。 程序4:判断是否有外部按键及处理程序如下 if( ExtKey_Pressed ) { ExtKey_Pressed = FALSE。 ExtKey_DealWith()。 }程序5:判断是否有内部按键响应程序如下 if( Key_Pressed ) { Key_Pressed = FALSE。 if (AutoPress) { AutoPress。 Key_Valu = AutoKeyVal。 if (AutoPress){Key_Pressed = TRUE。 } } if (KeySound){Buzzer_ON(3)。 } Key_DealWith()。 } 菜单的基本作用:提供人机对话,以便让使用者选择应用系统的各种功能,管理应用系统,控制各种功能模块的运行。 :启动中,设定电压,当前电压,工作电流,设备类型,端口设定,参数设定,系统设定,关闭系统,是第一级菜单,接下来是设备类型中第二级菜单,如设备类型有两个选择一类和二类。 其他设置依此类推。 菜单显示需要测量过程及结果的输入,通过调用汉字字模表进行显示,其对应程序如下。 INT8U *TestFace[3]={ 测试中,当前端口, 接触电流}。 INT8U *Power[3]={ 设定电压, 当前电压, 工作电流}。 启动中当前电压,工作电流第一级菜单显示第二级菜单 INT8U *MenuRoot[5]={ 一设备类型,二端口设定, 三参数设置,四系统设定, 五关闭系统}。 INT8U MenuRootID[5]={EUTtype,PortSet,Paramete,SystemSet,ShutOff}。 INT8U *MenuEutTpye[4] ={ 壹类, 贰类,接地,不接地}。 INT8U MenuPortID[9] ={Port0,Port1,Port2,Port3,Port4,Port5,Port6,Port7,Port8}。 INT8U *MenuParam[4] ={电源电压,测试时间, 间隔时间,外部采样}。 INT8U MenuParamID[4] ={Voltage,Testtime,Spacetime,Exterior}。 INT8U *MenuSystem[3] ={时间设定,背光设定,键音设定}。 INT8U MenuSystemID[3] ={Time,Backlight,Buzzer}。 INT8U *MenuBackLight[2] ={绿光, 红光 }。 INT8U MenuBackLightID[2] ={Green,Red}。 INT8U *Adjust[1]={校正因子}。 INT8U*Msg[7] = {启动中…,关机中…,已保存。 ,电源电压不稳,请稍等。 ,合格, 不合格。 } A/D转换说明Atmega32自带一个10位的逐次逼近型ADC。 ADC与一个8通道的模拟多路复用器连接,能对来自端口A 的8 路单端输入电压进行采样。 芯片还支持16 路差分电压输入组合。 两路差分输入(ADCADC0 与ADC。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。