单片机智能仪器课程设计报告.docx
单片机智能仪器课程设计报告 课程设计报告 课程名称单片机原理及应用 设计题目智能仪器 专业计算机应用技术 班级Z140547 学号Z14054708 姓名 完成日期2022/6/25 课程设计任务书 设计题目:智能仪器 设计内容与要求: 要求实现一路电压信号输入和两路报警开关量输出控制功能。其中信号电压范围为05VDC,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.0P2.3。A/D转换器采用ADC0809,以通用I/O口的方式与单片机连接,其并行数据输出端直接连接于P1口,4个控制端CLOCK、START、EOC和OE分别接于P2.4P2.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_valuei=param_valuei; 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='0' && c=1;i-) bufi='0'+value%10; value/=10; if(value=0) break; buf0=name; for(i=0;i>1)|0x80; delay(); (3)Main.c void ad_init(); void control_thread(); void menu_thread(); void main() ad_init(); while(1) menu_thread(); control_thread(); (4)Keybroad.c #include #define CHECK_KEY_DOWN 0 #define CHECK_KEY_UP 1 #define KEY_UP 0 #define KEY_DOWN 1 sbit _p32=P32; char _key_status=CHECK_KEY_DOWN; char _key_idx=0; void serial(char byte); char _check_key(unsigned char _key_idx) serial(0x01 param_value1) P36=0; P37=1; else if (value=param_value0) P36=0; P37=0; else P36=1; P37=0; if(menu_status=1) print(' ',value); (6)Ad.c #include sbit P24=P24; sbit P25=P25; sbit P26=P26; sbit P27=P27; unsigned char ad() P25=0; P25=1; P25=0; while(! P26); P27=1; return P1; void ad_init() TMOD=0x02; TH0=0; TL0=0; ET0=1; TR0=1; EA=1; void_ad_clock(void) interrupt 1 P24= P24; (7)Serial.c PUBLIC _SERIAL DE SEGMENT CODE RSEG DE _SERIAL:MOV SCON,#0 MOV SBUF,R7 JNB TI,$ CLR TI RET END 仿真开发过程: 系统运行如图,测控状态运行效果如下: 参数设置状态运行效果如下: 运行结果表明,测控与参数设置这两个环节的确是“同时”进行的。具体表现为若参数L设置位100,某一时刻的采样值位60,那么在进行参数设置过程中,处于后台运行的控制程序还会使报警器灯D1在此时点亮。若将参数L修改位30,只要确保保存参数后,不等关闭菜单显示,D1就会熄灭了。 设计要点总结: 此次设计要点在于可使多个程序“同时”拥有运行权限,对外表现出实时多任务的效果。这类程序的关键在于每个程序有不能占据过多的机时,因此必须设法将长时间运行改为短时运行。 为了完成此次设计,要先了解各个模块的相关功能,才能够对每个子模块进行设计。