单片机课程设计-智能仪器.docx
单片机课程设计-智能仪器 论文题目:单片机系统设计开发应用智能仪器 学院:计算机科学与信息工程 专业:软件工程 学号:11103205 姓名:高红斌 日期:2022年12月1日 单片机系统设计开发应用智能仪器 一、设计要求及目的 本实验通过一个单通道通用型智能仪器的软硬件系统设计,将这学期学过的单片机原理加以综合运用,以此掌握单片机应用系统的设计要领,本次试验设计的总体目标是一路电压信号输入和两路报警开关量输出控制功能,其中信号电压范围05VDC,AD采样分辨率8bit,数码管显示信息为:以为参数字符和三位十进制采样值,控制参数有两个,即下限报警值L和上线报警值H,当采样值大于H时,高位报警继电器接通(用LED 状态灯D1亮表示);当采样值小于L时,下位报警继电器接通(用D2表示);当采样值介于L和H之间时,两路报警器功能均被解除(D1和D2均熄灭表示) 二、实验环境 微型计算机一台,proteus软件,keilC编译器。 三、元器件列表, 图表1 四、实验原理 本实验选用了一只六联共阴极数码管显示器,按照动态显示原理接线,其 中段码通过锁存器74LS245驱动后接于P0口,位码则有反相器74LS04驱动后接于P1.0-P1.5。A/D转换器采用逐次逼近方式的芯片ADC0809,其并行数据输出端直接连接于P2口,4个控制端CLOCK,START,EOC, 和OE分别接于P3.2-P3.5,采用查询法等待转换结束,转换时钟利用定 时器中断产生。四个面板按键通过8位串行输入并行输出移位寄存器 74LS164与单片机接口,其移位时终端与单片机的TXD引脚相连,串行 数据端(1和2脚)与单片机的RXD引脚相连,串口输出功能采用汇编 语言与C51语言混合编程实现。 软件系统采用一个有多个功能模块构成的程序,模块之间相互依赖,他们 之间的关系如图,程序有主要的两个功能模块组成控制模块和菜单模 块。这两个模块能够同时运行。这里,“同时”的意思是指用户进行菜单操 作的时候,程序还能采集数据并进行控制。 图表2 软件系统结构组成 “控制”和“菜单”这两个主要的模块都是建立在其他小模块的基础上的,比如控制模块建立在A/D转换和LED 显示的基础上,菜单建立在按键检测和LED显示的基础上,而按键检测又建立在串口输出的基础上。下表列出了各个模块的主要函数。 图表3 各个模块的主要函数和功能 五、程序源代码 /main.c void ad_init(); void control_thread(); void menu_thread(); void main() ad_init(); while (1) menu_thread(); control_thread(); /menu.c #define MENU_ON 0 #define MENU_OFF 1 #define MENU_NUM 2 #define MENU_MAX 999 #define MENU_MIN 0 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) /若按键0已被按下 menu_status = MENU_ON; /置当前菜单为打开状态 _menu_idx = 0; /设置参数序号0 /将所有参数当前值取出,送入供显示的参数数组中 for (i = 0 ; i MENU_MAX) _menu_value_menu_idx = MENU_MAX; else if (key = 3) /若按键3按下,则参数值减10 _menu_value_menu_idx -= 10; if (_menu_value_menu_idx param_value1) P16 = 0; P17 = 1; else if (value = param_value0) P16 = 0; P17 = 0; else P16 = 1; P17 = 0; /第3步:如果菜单是关闭的,显示采集到的数值 if (menu_status = 1) print(' ', value); /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) /根据P36状态决定返回值 return KEY_DOWN; else return KEY_UP; char get_key(void) char result = -1; /无键按下时键值为-1