单片机智能仪器课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;