已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电 xxx系统设计说明说专业名称: 电子信息工程技术 姓 名: 张晖煌 学 号: 1010403204 班 级: 电信B班 指导教师: 李南安 2012年 5月 16日目录1.功能概述12.硬件电路设计13.软件系统设计14.仿真开发过程和效果116Xxx系统设计说明书1. 功能概述智能仪器是一种依靠嵌入式计算机技术发展的新型电子测控单元,其基本功能是根据传感器的实时信号和仪器设定的目标参数进行测量与控制。目前市售的一种典型智能仪器形式如下图所示由图可见,智能仪器由面板和机箱组成,而系统电子元件安装于机箱内的线路板上。面板三为实现人机交互而设计的,由46位数码管显示器、35个薄膜按键和若干个LED状态指示组成。由于按键数量少,智能仪器通常都不采用09数字按键方案,而是通过增加和减小两个功能键,与u设置/切换和确认等键配合,实现对智能仪器内置参数的设定与输出控制功能。 本智能仪器总体设计目标是实现一路电压信号输入和两路报警开关量输出功能。其中信号电压范围为05VDC,AD采样分辨率为8bit,数码管显示信息为:一位参数字符和三位十进制采样值。控制参数有两个,即下限报警值(L)和上限报警值(H)。当采样值大于H时,高位报警继电器接通(用LED状态灯D1亮表示);当采样值小于L时,下位报警继电器接通(用D2亮表示);当采样值介于L和H之间时,两路报警器功能均被解除(用D1和D2均熄灭表示)。 该系统具体功能为,仪器上电后自动进入测控状态,显示器显示实时采样值,同时D1和D2实时切换报警状态。若按下0#健,进入参数设置状态(测控转入后台但仍然继续进行),显示器显示工作参数L(在最左位)及其参数当前值(在最有13位);若按压2#或3#键,可对当前参数值加10或减10计算并更新显示;若按压1#键可确认修改结果(下次再进入参数设置状态是可以此结果作为新的当前值,否则修改后的参数值不被保存),并转入下一参数H的设置过程(同理不再讲述)。再次按压0#键或1#键均可退出参数设置状态,返回测控状态。2. 硬件电路设计为了今后的功能扩展,本方案选用了一只六联共阴极数码管作为显示器,按照动态显示原理接线,其中段码通过锁存器74LS245驱动后接于P0 口,位码则由反相器74LS04 驱动后接于P1.0P1.5。A/D转换器采用逐次逼近方式的芯片 ADC0808,其并行数据输出端直接连接于P2口,4个控制端CLOCK、START、EOC和OE分别接于P3.2P3.5,采用查询法等待转换结束,转换时钟利用定时器中断产生。四个面板按键通过8位串行输入并行输出移位寄存器74LS164与单片机接口,其移位时钟端(8脚)与单片机的TXD引脚相连,串行数据端(1和2脚)与单片机的RXD引脚相连,串口输出功能采用汇编语言与C51语言混合编程实现。硬件系统电路图原理如图所示。3. 软件系统设计 软件系统采用一个由多个功能模块构成的程序,模块之间相互依赖,它们之间的关系如下图所示:从图中可以看到,程序由两个主要的功能模块组成控制模块和菜单模块。这两个模块能够同时运行。这里,“同时”的意思是指在用户进行菜单操作的时候,程序还能实时采集数据并进行控制。“控制”和“菜单”这两个主要模块都是建立在其他小模块的基础上的,比如控制模块建立在A/D转换和LED显示的基础上,菜单建立在按键检测和LED显示的基础上,而按键检测又建立在串口输出的基础上。表9.1列出了各个模块的主要函数。 表9.1各个散热主要函数和功能模块主要函数和功能控制模块Void control_thread(void);菜单模块Void menu_thread(void);A/D转换模块Char ad(void);LED显示Void print(char name , unsigned int value);串口输出Void serial(char byte);按键检测Unsigned char get_key(void);下面对这个程序设计过程中的一些重点问题进行说明。1.控制和菜单模块的“同时”运行控制和菜单模块的调用执行都在main.c中,代码如下:Void main() While (1) Menu_thread(); Control_thread(); 在主函数中,始终交替调用menu_thread()和control_thread(),它们分别对应着菜单的线程函数和控制散发的线程函数。只有在menu_thread()被 调用时,菜单里的参数项才会在显示器上刷新,用户通过键盘对菜单的操作才能够得到程序的响应和处理。只有在control_thread()被 调用时,才会进行A/D采样并刷新显示器上的内容,控制报警器的动作。要想使两个模块看起来是同时执行的,就要求menu_thread()和control_thread()各自的执行时间都不能很长。如果menu_thread()执行的时间较长,那么在这期间程序不会进行采样,报警器状态也就不会随之变化。同理,如果control_thread()执行的时间过长,在函数返回前,用户按压键盘的操作不会得到程序响应。 在这两个函数中,control_thread()的逻辑较为简单,代码如下:Void control_thread () Unsigned char value =ad(); If (valueparam_value1 P16=1; P17=0;else if (valueparam_value0 P16=0; P17=0;else P16=0;P17=1;If(menu_status=1) Print(h,value); 每一次control_thread()被 调用时,都会依次执行A/D转换采样、根据采样值控制LED灯以及显示采样值这3步操作,执行时间都不会很长。用户按压键盘、修改参数的操作会很及时、流畅地得到程序的响应。但是,从用户打开菜单到修改若干参数,到最后关闭菜单的过程一定会持续较长的时间,如果menu_thread()函数设计成要等到菜单关闭才返回,那么采样和控制的过程一定会受到严重的干扰。2.菜单线程的短时运行菜单线程的代码在menu.c中实现,下面列出代码的主要框架:void menu_thread(void) Char key =get_key(); If (menu_status=MENU_OFF) If(key=0) Menu_status=MENU_ON; else If (key=0) If (+_menu_idx = MENU_NUM) Menu_status=MENU_OFF;else if (key=1)else if (key=2)else if (key=3)If (menu_status=MENU_ON)Print(_menu_name_menu_idx,_menu_value_menu_idx); 如前面所分析的,menu_thread()不能设计为用户关闭菜单后才返回.在本书给出的实现方案中,菜单模块通过两个非常重要的变量来记录菜单的状态:_menu_status表示菜单的开/关状态,menu_idx表示当前打开的是第1或者第2 个菜单项。每次menu_thread()时,首先通过调用unsigned char get_key()得到当前被 按压过的键值,并记录在变量key中。然后用嵌套的Ifelse语句,处理在_menu_status= =MENU_ON(即菜单为打开状态)和_menu_status=MENU_ON;(即菜单为关闭状态)这两种状态下0#3#4个按键所应该执行的不同操作。例如在_menu_status=MENU_OFF时,如果0#键就打开菜单,修改_menu_status=MENU_ON;在_menu_status=MENU=MENU_OFF时,如果按压0#键则切换到下一个参数,即+menu_idx.在函数的最后会根据菜单的状态,将当前打开的菜单项显示在显示器上。因此,不论菜单是何种状态,也无论是否有键被 按下,menu_thread()函数都会在很短的时间里完成操作并返回。不过,从上面的代码框架可以看到,在menu_thread()里会调用unsigned char get _key()以获得被 按下的键值。为满足menu_thread()每次执行的时间都不能很长这一要求,无论是否有键被按下,也无论用户是否按下这个键不抬起,函数get_key()都 必须既能检测到按键,又能在很短的时间里返回,下面我们不来解释get_key()是如何实现的。3.按键检测的短时运行在被解释按键检测函数unsigned char get_key()之前,我们先来解释一下如何检测某一按键是否被 按下了。由图9.9的检测电路可知,要检测第1 个按键是否被 按下,需要通过74LS164将低电平送到Q7端,同时将高电平送到Q6、Q5和Q4.然后检测P3.6是否为低电平。如果是,表示第1 个按键被 按下,否则表示没按下。这部分功能在keyboard.c的char_check_key(unsigned char key_idx)中实现,代码如下:char _check_key(unsigned char _key_idx)serial(-(0x01_key_idx);if(_p36=0) return KEY_DOWN;else Return KEY_UP;这个函数是unsigned char get_key()的重要组成部分。在本次中,在调用get_key()时,若得到返回值0-3,则说明该值所对应的按键被用户按下后又抬起,即完成了一次完整的触键操作。如果返回-1,说明没有检测到哪一个键被按下过。此外,如果用户一直压下某个键不松开,在此期间调用函数,也会得到返回值-1.Unsigned char get_key()函数的实现依赖于两个重要的全局变量:_key_status和_key_idx。程序代码如下:char get_key(void) char result =-1; if(_key_status =CHECK_KEY_DOWN) if(_check_key(_key_idx)=KEY_DOWN) _key_status=CHECK_KEY_UP; else If(+_key_idx=4) _key_idx=0; else if(_key_status=CHECK_KEY_UP) if(_check_key(_key_idx)=KEY_UP) result=_key_idx;_key_status=CHECK_KEY_DOWN;If(+_key_idx=4) _key_idx=0; return result;按键检测分为两个阶段,第一阶段的目标是发现哪个键被按下了。在这个阶段里,_key_status=CHECK_KEY_DOWN,当满足这个条件时,程序会检测当前的_key_idx表示的按键是否被按下,即调用_check_key(_key_idx)并判断返回值是否为KEY_DOWN。如果条件不满足,则令_key_idx加1表示下一个键,get_key()函数返回。待到下一个get_key()再被调用时,程序检查_key_idx所指的另一个键是被按下。直到当某个键确实被按下时,例如2号键被按下,那么在按下的这个期间里,一定会发生一次get_key()的调用,且这一次调用是_key_idx=2,因此就会有_check_key(_key_idx)=KEY_DOWN,于是程序进入第2阶段,_key_status被修改为CHECK_KEY_UP。在_key_status=CHECK_KEY_UP的第2阶段,_key_idx的值不会再被修改,而是锁定在刚才检测到的被按下的键上,对于刚才的例子就是_key_idx=2。在这个阶段,每次get_key()被调用时,都会检查2号键是否被抬起,即判断_check_key(_key_idx)=KEY_UP是否成立。如果条件不成立,说明此刻检查时,2号键还没有被用户松开,于是get_key()继续返回-1,如果条件成立,说明用户按下2号键之后又松开了,于是get_key()会返回2,同时_key_status被改回CHECK_KEY_DOWN,下次调用时再重复前面的过程。4. 仿真开发过程和效果按照4.4节介绍的方法,在Proteus中绘制系统原理图,在Keil中建立项目,并添加编写的程序文件。项目编译和连接通过后的界面如下图所示:由上图可见,该项目由7个程序文件所组成,其中6个位C语言文件,一个为汇编语言文件。系统的全部源程序清单如下:(1) main.c文件void ad_init();void control_thread();void menu_thread();void main() ad_init(); while(1) menu_thread(); control_thread(); (2)control.c文件#includesbit P16=P16;sbit P17=P17;unsigned char ad();void print(char name,unsigned int value);extern unsigned char param_value2;extern char menu_status;void control_thread() unsigned char value=ad();if(valueparam_value1) P16=0;P17=1; else if(value=param_value0) P16=0; P17=0; else P16=1; P17=0; if(menu_status=1) print(,value); (3)menu.c文件#define MENU_ON 0#define MENU_OFF 1#define MENU_NUM 2#define MENU_MAX 999#define MENU_MIN 0unsigned char param_value=100,150;unsigned char menu_status=MENU_OFF;char _menu_name=L,H;unsigned char _menu_value=0,0;unsigned char _menu_idx=0;char get_key();void print(char name,unsigned int value);void menu_thread(void) char i=0; char key=get_key(); if(menu_status=MENU_OFF) if(key=0) menu_status=MENU_ON;_menu_idx=0;for(i=0;iMENU_MAX) _menu_value_menu_idx=MENU_MAX; else if(key=3) _menu_value_menu_idx+=10; if(_menu_value_menu_idxMENU_MIN) _menu_value_menu_idx=MENU_MIN; if(menu_status=MENU_ON) print(_menu_name_menu_idx,_menu_value_menu_idx); (4)keyboard.c文件 #include #define CHECK_KEY_DOWN 0 #define CHECK_KEY_UP 1 #define KEY_UP 0 #define KEY_DOWN 1 sbit _p33=P33; sbit _p34=P34; sbit _p35=P35; sbit _p36=P36; char _key_status=CHECK_KEY_DOWN; char _key_idx=0; void serial(char byte); char _check_key(unsigned char _key_idx) serial(0x01_key_idx);if(_p36=0) return KEY_DOWN; else return KEY_UP; char get_key(void) char result=-1; if(_key_status=CHECK_KEY_DOWN) if(_check_key(_key_idx)=KEY_DOWN) _key_status=CHECK_KEY_UP; else if(+_key_idx=4) _key_idx=0; else if(_key_status=CHECK_KEY_UP) if(_check_key(_key_idx)=KEY_UP) result=_key_idx; _key_status=CHECK_KEY_DOWN; if(+_key_idx=4) _key_idx=0; return result;(5)led.c文件#includechar code map1=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;char code map2=0x00,0x76,0x38;char _convert(char c) if(c= ) return map20; else if(c=H) return map21;else if(c=L) return map22; else if(c0&c=9) return map1c-0; return 0; void_delay() int i=0,j=0; for(i=0;i10;i+) for(j=0;j1;i-)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业安全操作标准
- 城市河道绿化植树造林合同
- 人教新课标五年级语文下册教案
- 二年级语文下册集体备课教案
- 唐山市摄影服装租赁合同
- 妇幼保健院护工聘用合同
- 新闻采访车辆油耗维修管理规范
- 展览馆照明系统安装合同范本
- 印刷包装招投标委托书样本
- 大型剧院施工合同模板
- 三年级中华优秀传统文化教案
- 福建广播电视大学中国现当代文学名著导读(2)-形成性考核二答案
- 青岛版三年级上册数学 两位数乘一位数的口算 教案
- 学校教室室内装修工程施工组织设计方案
- 河道整治护岸施工方案
- 《寻访小动物》ppt课件
- 沙钢高炉及热风炉砌筑总施工组织设计
- 义乌中学浙江省物理学科基地
- 教师资格证考试《生物学科知识与教学能力》(初级中学)学科知识细胞
- 栈道栈桥工程施工组织设计
- 电脱盐成套技术介绍
评论
0/150
提交评论