单片机智能仪器课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

课程名称单片机原理及应用

设计题目智能仪器

专业计算机应用技术

班级Z140547

学号Z14054708

姓名

完成日期2015/6/25

课程设计任务书

设计题目:智能仪器

设计内容与要求:

要求实现一路电压信号输入和两路报警开关量输出控制功能。其中信号电压范围为0~5VDC,AD采样分辨率为8bit,数码管显示信息为:1位参数字符和3位十进制采样值。控制参数有两个,即下限报警值(L)和上限报警值(H)。当采样值大于H时高位报警继电器接通(用LED状态灯D1亮表示);当采样值小于L时,下位报警继电器接通(用D2亮表示);当采样值介于L和H之间是,两路报警器功能均被解除(用D1和D2均熄灭表示)。

该系统具体功能为,仪器上电后自动进入测控状态,显示器显示实时采样值,同时D1和D2实时切换报警状态。若0#键按下,进入参数设置状态(测控转入后台运行),显示器显示工作参数L及其当前值;若2#或3#键按下,可对当前参数值进行加10或减10计算并更新显示;若按压1#键可以确认修改结果(下次再进入参数设置状态时可以以此结果作为新的当前值,否则修改后的参数值不被保存),并转入下一个参数H的设置过程(同理不再赘述)。再次按压0#键或1#键均可退出参数设置状态,返回测控状态。

设计仪器:

一台电脑、ISIS 7 Professional软件和Keil uVision4软件

硬件电路设计:

选用一只四联共阴极数码管作为显示器,按照动态显示原理接线,其中段码通过锁存器72LS245驱动后接于P0口,由4只PNP型三极管驱动后介于P2.0~P2.3。A/D转换器采用ADC0809,以通用I/O口的方式与单片机连接,其并行数据输出端直接连接于P1口,4个控制端CLOCK、START、EOC和OE分别接于P2.4~P2.7,采用查询法等待转换结束,转换时钟利用定时器中断产生。4个面板按键通过8 位串行输入并行输出移位寄存器74LS164与单片机接口,其移位时钟端(8脚)与单片机的TXD引脚相连,串行数据端(1和2脚)与单片机的RXD引脚相连。如图

软件系统设计:

采用一个由多个功能模块构成的程序,模块之间相互依赖,他们之间的关系如下

程序由两个主要的功能模块组成一一控制模块和菜单模块,两个模块能够同时运行(指用户在进行菜单操作时,程序需还能实时采集数据并进行控制)而“控制”和“菜单”这两个主要

模块都是建立在其他小模块的基础上的,比如控制模块建立在A/D转换和LED显示的基础上,菜单建立在按键检测和LED 现实的基础上的,而按键检测又建立在串口输出的基础上。表1列出了各个模块

(1)menu.c

#define MENU_ON 0

#define MENU_OFF 1

#define MENU_NUM 2

#define MENU_MAX 240

#define MENU_MIN 10

unsigned 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;

_menu_value[i]=param_value[i];

}}

}else{

if(key==0) {

if(++_menu_idx==MENU_NUM){

menu_status=MENU_OFF;

}

}else if(key==1) {

param_value[_menu_idx]=_menu_value[_menu_idx];

if(++_menu_idx==MENU_NUM){

menu_status=MENU_OFF;

}

}else if(key==2) {

_menu_value[_menu_idx]+=10;

if(_menu_value[_menu_idx]>MENU_MAX){

_menu_value[_menu_idx]=MENU_MAX;

}

}else if(key==3) {

_menu_value[_menu_idx]-=10;

if(_menu_value[_menu_idx]

_menu_value[_menu_idx]=MENU_MIN;

}}}

if(menu_status==MENU_ON){

print(_menu_name[_menu_idx],_menu_value[_menu_idx]);

}}

(2)Led.c

#include

char 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 map2[0];

else if (c=='H')

return map2[1];

else if (c=='L')

return map2[2];

else if (c>='0' && c<='9')

return map1[c - '0'];

return 0;

}

void _delay() {

int i=0,j=0;

相关文档
最新文档