单片机课程设计-智能仪器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
论文题目:单片机系统设计开发应用—智能仪器
学院:计算机科学与信息工程
专业:软件工程
学号:11103205
姓名:高红斌
日期:2013年12月1日
单片机系统设计开发应用—智能仪器
一、设计要求及目的
本实验通过一个单通道通用型智能仪器的软硬件系统设计,将这学期学过的单片机原理加以综合运用,以此掌握单片机应用系统的设计要领,本次试验设计的总体目标是一路电压信号输入和两路报警开关量输出控制功能,其中信号电压范围0—5VDC,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_NUM ; i++)
{
_menu_value[i] = param_value[i];
}
}
} else{
//如果当前菜单为打开状态,则进行以下操作:
if (key == 0)
{
//若按键0按下,则不保存键值,仅切换到下一个参数
if (++_menu_idx == MENU_NUM)
{ //判断是否所有参数都循环到了
menu_status = MENU_OFF; //若已循环完成,设置菜单关闭状态
}
} else if (key == 1)
{
//若按键1按下,则保存键值,并切换到下一个参数
param_value[_menu_idx] = _menu_value[_menu_idx];
if (++_menu_idx == MENU_NUM)
{
menu_status = MENU_OFF;
}
} else if (key == 2) {
//若按键2按下,则参数值加10
_menu_value[_menu_idx] += 10;
if (_menu_value[_menu_idx] > MENU_MAX) {
_menu_value[_menu_idx] = MENU_MAX;
}
} else if (key == 3) {