水位控制和测量仪表毕业设计中期报告要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业设计(论文)
中期报告
题目名称:通用智能测控仪表开放式实验平台软件
设计
学院名称:电子信息学院
班级:电气类112
学号:201100474216
学生姓名:谢云
指导教师:张谦
2015 年 4月
论文编号:201100474216
通用智能测控仪表开放式实验平台软
件设计
General intelligent measurement instrument open experimental platform for software
design
院系名称:电子信息学院
班级:电气类112
学号:201100474216
学生姓名:谢云
指导教师:张谦
2015 年 4月
目录
1毕业设计基本的具体任务与要求 (1)
2课题总体方案 (2)
3 进度时间安排 (4)
4已完成如下 (5)
4.1键盘扫描模块 (9)
4.2数码管显示模块 (9)
4.3报警模块 (9)
4.4 AD采集显示模块 (9)
4.5 DA输出和显示模块 (9)
5.自己的进度和任务书对比 (10)
6.参考文献 (11)
7.附录 (12)
附录1 数码管模块程序 (12)
附录2 按键模块程序 (15)
附录3 AD模块程序 (20)
附录4 DA模块程序 (24)
附录5 蜂鸣器模块程序 (27)
1毕业设计基本的具体任务与要求
软件设计中完成以下任务:
软件设计:
1、编制功能块调试程序,用于电路调试。
2、主程序设计
3、编制部分控制算法程序。
4、系统调试(仿真或实际调试)
2课题总体方案
操作流程图[13]
1.开机显示:上面显示8888 (检测数码管好坏)
下面显示8888
2.按k7键设置:上面显示p100 (意思是上限值)
下面需要设定的上限值
3. 继续按k7键:上面显示p200 (意思是下限值)
下面需要设定的下限值
4. 继续按k7键:上面显示p300 (意思是报警值)
下面需要设定的报警值
5. 继续按k7键:上面显示p400 (意思是设定数字值)
下面需要设定的设定值
6. 继续按k7键:上面显示p500 (意思是设定数字值)
下面需要设定的kp调节值
7. 继续按k7键:上面显示p600 (意思是设定数字值)
下面需要设定的设定ki调节值
8. 继续按k7键:上面显示p100 (意思是上限值)
下面需要设定的上限值
注:每一次按k7键表示上一级k7设置完成。
9. 按k4键设置:进行数码管移位(用于选择数码管)
10. 按k5键设置:数码管数字+1 (用于改变数码管数字)
11. 按k6键设置:确认设置完成(pid控制)
12. 按k3键设置:返回上一级设置(修改上一级菜单)
其流程图如图2-1所示:
图2-1:pid基本运算模块流程图
3 进度时间安排
2014.12.15 --- 2014-2015-1学期结束:
查找阅读资料、设计准备
14 – 15第2学期:
1-3周:开题报告,翻译;
4-9周:程序编译与调试;
10-11周:程序改进;
12到13周:论文与答辩;
已完成的任务:
目前已完成键位设置,AD和DA转换以及数码管显示程序。
pid控制程序和尚未完成。
4已完成如下
1. 开机显示上面显示8888 (检测数码管好坏)
下面显示8888
2. 按k3键设置显示上面显示p100 (意思是上限值)
下面需要设定的上限值
3. 继续按k3键显示上面显示p200 (意思是下限值)
下面需要设定的下限值
4. 继续按k3键显示上面显示p300 (意思是报警值)
下面需要设定的报警值
5. 继续按k3键显示上面显示p400 (意思是设定数字值)
下面需要设定的设定值
6. 继续按k3键显示上面显示p100 (意思是上限值)
下面需要设定的上限值
注:每一次按k3键表示上一级k3设置完成
7. 按k4键设置进行数码管移位(用于选择数码管)
8. 按k5键设置数码管数字+1 (用于改变数码管数字)
9. 按k6键设置确认设置完成(显示ad转换的数字量)
10. 按k7键设置返回上一级设置(修改上一级菜单)
其流程图如图4-1,图4-2,图4-3所示:
图4-1:已完成键盘设置流程图
图4-2:DA输出和显示流程图
图4-3:AD采集显示流程图
4.1键盘扫描模块
键盘按下时类似一个瞬时开关,开关打开时为逻辑1,关闭时为逻辑0.但是开关有回弹特性,弹起时间通常为5-30ms。
此时用延时。
该设计采用的单独5个按键,初始化阶段,所有的行(输出端口)被强行设置为低电平。
在没有任何键按下时,所有的列(输入端口)将读到高电平,任何键的闭合将造成其中的一列变为低电平。
为了查看是否有一个键已经按下,微处理器仅仅需要查看任一列的值是否变为低电平。
检测到有键按下,就确定是哪一个键。
每一个键都有自己的功能,按下一个键能执行相应的功能[3,4,6]。
与其相关程序:数码管程序,数据采集程序。
4.2数码管显示模块
为了减少LED对端口的占用,数码管显示模块运用动态扫描方式对6个数码管定时写值。
为了避免闪烁需要很高的刷新率,人眼视觉暂留时间约为10ms,为了避免闪烁,可用一个定时器进行定时中断,定时刷新。
数码管用于显示采集数据和设置数据,主要用来显示电压和电流的数值及平常的显示[2,5]。
与其相关程序:按键程序,数据采集程序。
4.3报警模块
在按键按下时,同时输出指示灯亮。
当采集数值超过或者低于显示数值时蜂鸣器报警报警模块主要是起到一个保护的作用,使其不超过和不低于他的量程。
与其相关程序:数码管程序,数据采集程序,按键程序。
4.4 AD采集显示模块
其硬件是ADC0834,,该硬件能将0到5V的电压转换成0到255的数字量输出[2,3,4,5,6]。
4.5 DA输出和显示模块
其硬件是DA5620,该硬件能将0到255的数字量转换成0到5V[2,3,4,5,6]。
5.自己的进度和任务书对比
目前进度处于正常范围。
第八周可以将AD显示和DA开环控制调试结束。
第九周添加pid及掉电保护进行调试。
下一步工作计划:
第八周完善未加pid调试程序。
第九周完成任务书规定内容。
第十周和第十一周进行程序的改进,如果有时间的话。
第十二周整理设计过程中的所有资料。
第十三周答辩及论文。
6.参考文献
[1] 杨学昭,马彦霞,薛立.AT24C512存储器在无线抄表器中的应用. 中原工学院学报[J],2004
[2] 袁东.51单片机应用开发实战手册.电子工业出版社[M],2011年4月page32-53 82-99 129-177
[3] 郭天祥.51单片机C语言教程[M].北京,电子工业出版社, 2013年8月page56-184
[4] 彭伟.单片机C语言程序设计实训100例.电子工业出版社[M], 2010年1月page118-121 154-175, 236-257 , 331-342
[5] 于永,戴佳,刘波.51单片机C语言常用模块与综合系统设计实例精讲[M].电子工业出版社,
2008年10月page88-113, 145-158, 319-328
[6] 赵建领,弓雷.51系列单片机开发宝典.电子工业出版社[M], 2012年2月page375-389 ,352-358 ,486-507 , 574-605
[7] 张义和,王敏男,许宏昌,余春长.例说51单片机.人民邮电出版社[M], 2008年4月page134-179
[8] 范红刚,杜林娟.51单片机自学笔记.北京航空航天大学出版社[M], 2013年8月page188-232 ,306-331
[9] 杨学昭,王东云等. 单片机原理、接口技术及应用(含C51)[M].西安,西安电子科技大学出版社,2009年2月page148-182
[10] 张五一,张道光. 微型计算机原理与接口技术[M].郑州,河南科学技术出版社,2006年8月
[11] 康华光. 电子技术基础数字部分[M].北京,北京高等教育出版社,2009年7月
[12] 宋戈,黄鹤松,吕玉良,蒋海峰.51单片机应用开发范例大全[M].人民邮电出版社.2012年6
月
[13] 浙江求是科教设备有限公司过程控制系列之-设备使用说明书[N]
7.附录
附录1 数码管模块程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code shuzi[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x8c,0xbf}; //0~9,p,-
unsigned char code weishu[]={
0x80,0x40,0x20,0x10,
0x08,0x04,0x02,0x01}; //分别选通1~8个数码管
sbit wei=P0^6; //位选锁存器
sbit duan=P0^5; //段选锁存器
uint z,x,y;
/*********************************************
延时程序,时间1ms
*********************************************/
void delay(z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*************************************************** 数码管显示
其中p0.6是位选锁存端,p0.5是段选锁存端,
p2控制a~h,com8到com1.
上面四位数码管显示
****************************************************/ void upxianshi()
{ uchar i;
for(i=0;i<4;i++)
{
wei=1;
P2=weishu[i];
wei=0;
duan=1; //第一位数码管显示0
P2=shuzi[i+8];
duan=0;
delay(2);
P0=0xff;
}
/*duan=1; //第一位数码管显示0
P2=shuzi[0];
duan=0;
P2=0xff;
wei=1;
P2=weishu[0];
wei=0;
delay(1);
duan=1; //第二位数码管显示1
P2=shuzi[1];
duan=0;
P2=0xff;
wei=1;
P2=weishu[1];
wei=0;
delay(1);
duan=1; //第三位数码管显示2
P2=shuzi[2];
duan=0;
P2=0xff;
wei=1;
P2=weishu[2];
wei=0;
delay(1);
duan=1; //第四位数码管显示3
P2=shuzi[3];
duan=0;
P2=0xff;
wei=1;
P2=weishu[3];
wei=0;
delay(1); */
}
/*************************************************** 数码管显示
其中p0.6是位选锁存端,p0.5是段选锁存端,
p2控制a~h,com8到com1.
下面面四位数码管显示
****************************************************/ void downxianshi()
{ uchar j;
for(j=4;j<8;j++)
{
wei=1;
P2=weishu[j];
wei=0;
duan=1; //第一位数码管显示0
P2=shuzi[j];
duan=0;
delay(2);
P0=0xff;
}
/*duan=1; //第五位数码管显示4
P2=shuzi[4];
duan=0;
P2=0xff;
wei=1;
P2=weishu[4];
wei=0;
delay(1);
duan=1; //第六位数码管显示5
P2=shuzi[5];
duan=0;
P2=0xff;
wei=1;
P2=weishu[5];
wei=0;
delay(1);
duan=1; //第七位数码管显示6
P2=shuzi[6];
duan=0;
P2=0xff;
wei=1;
P2=weishu[6];
wei=0;
delay(1);
duan=1; //第八位数码管显示7 P2=shuzi[7];
duan=0;
P2=0xff;
wei=1;
P2=weishu[7];
wei=0;
delay(1);*/
}
void main()
{
while(1)
{
upxianshi();
downxianshi();
}
}
附录2 按键模块程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code shuzi[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x7b,0x40}; //0~9,p,-
unsigned char code weishu[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe}; //分别选通1~8个数码管
sbit wei=P0^6; //位选锁存器
sbit duan=P0^5; //段选锁存器
sbit bee=P0^7; //段选锁存器
sbit k3=P0^1;
sbit k4=P0^3;
sbit k5=P0^4;
sbit k6=P1^2;
sbit k7=P1^6;
sbit stcp=P0^2;
sbit shcp=P0^3;
sbit ds=P0^1;
uint z,x,y;
/*********************************************
延时程序,时间1ms(同附录1)
*********************************************/
/********************************************************
独立按键程序
其中s3键作用是保存s4键作用是设置s5键是转换
s6键作用是上升s7键作用是显示
注意地方,在显示的时候需要把一端的io口设置为高电平,否则会影响显示***********************************************************/
void led()
{
uchar i;
for(i=0;i<4;i++)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
}
}
void dulianjian()
{ uchar i;
P2=0x00; //先将按键一端置地,当做接地,检测另一端if(k3==0) //检测按键K3是否按下
{
delay(10); //消除抖动
if(k3==0)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1; //需要修改的程序,保存
delay(50);
while((i<50)&&(k3==0)) //检测按键是否松开
{ ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
delay(50);
delay(10);
i++;
}
i=0;
}
}
if(k4==0) //检测按键K4是否按下
{
delay(10); //消除抖动
if(k4==0)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1; //需要修改的程序,保存
delay(50);
while((i<50)&&(k4==0)) //检测按键是否松开
{
ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
delay(50);
delay(10);
i++;
}
i=0;
}
}
if(k5==0) //检测按键K5是否按下
{
delay(10); //消除抖动
if(k5==0)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1; //需要修改的程序,保存
delay(50);
while((i<50)&&(k5==0)) //检测按键是否松开
{ ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
delay(50);
delay(10);
i++;
}
i=0;
}
}
if(k6==0) //检测按键K6是否按下
{
delay(10); //消除抖动
if(k6==0)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1; //需要修改的程序,保存
delay(50);
while((i<50)&&(k6==0)) //检测按键是否松开
{ ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
delay(50);
delay(10);
i++;
}
i=0;
}
}
if(k7==0) //检测按键K4是否按下
{
delay(10); //消除抖动
if(k7==0)
{
ds=1;
shcp=0;
shcp=1;
stcp=0;
stcp=1; //需要修改的程序,保存
delay(50);
while((i<50)&&(k7==0)) //检测按键是否松开
{ ds=0;
shcp=0;
shcp=1;
stcp=0;
stcp=1;
delay(50);
delay(10);
i++;
}
i=0;
}
}
}
void main()
{
bee=0;
while(1)
{
dulianjian();
}
}
附录3 AD模块程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char #define uint unsigned int
unsigned char code shuzi[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x8c,0xbf}; //0~9,p,-
unsigned char code weishu[]={
0x80,0x40,0x20,0x10,
0x08,0x04,0x02,0x01}; //分别选通1~8个数码管
//sbit dadata=P0^4;
//sbit daclk=P1^2;
//sbit daload=P1^4;
//sbit daldac=P1^3;
sbit wei=P0^6; //位选锁存器
sbit duan=P0^5; //段选锁存器
uint z,x,y;
uchar bai,shi,ge,a;
/*********************************************
延时程序,时间1ms(同附录1)
*********************************************/
/*************************************************** xianshi
****************************************************/ void upxianshi()
{
duan=1; //第一位数码管显示0
P2=shuzi[bai];
duan=0;
P2=0xff;
wei=1;
P2=weishu[0];
wei=0;
delay(1);
duan=1; //第二位数码管显示1
P2=shuzi[shi];
duan=0;
P2=0xff;
wei=1;
P2=weishu[1];
wei=0;
delay(1);
duan=1; //第三位数码管显示2
P2=shuzi[ge];
duan=0;
P2=0xff;
wei=1;
P2=weishu[2];
wei=0;
delay(1);
}
/*************************************************** AD转换
****************************************************/ sbit clk=P1^6;
sbit cs=P1^5;
sbit d0=P0^4;
sbit d1=P0^4;
void ad()
{
unsigned char i,adval,dat,test,datt;
adval = 0x00;
test = 0x00;
dat=0x00;
datt=0x00;
clk=0;
cs=1;
cs=0; //chushihua
d1=1;
clk=1;
_nop_();
clk = 0;
_nop_();
d1=1;
clk = 1;
_nop_();
clk = 0;
_nop_();
d1=0;
clk = 1;
_nop_();
clk = 0;
_nop_();
d1=0;
clk = 1;
_nop_();
clk=0;
d1=1;
for( i = 0;i < 8;i++ ) //读取前8位的值{
_nop_();
adval<<= 1;
clk = 1;
_nop_();
clk = 0;
if (d0)
adval|= 0x01;
else
adval|= 0x00;
}
dat=adval;
clk=1;
for( i = 0;i < 8;i++ ) //读取前8位的值{
_nop_();
test>>= 1;
clk = 1;
_nop_();
clk = 0;
if (d0)
test|= 0x01;
else
test|= 0x00;
}
datt=test;
/*if(dat==datt)
{
bai=1;
shi=1;ge=1;
}
else bai=1;shi=0;ge=0;*/
bai=dat/100;
shi=dat%100/10;
ge=dat%10;
_nop_();
// upxianshi();
clk=1;
_nop_();
clk=0;
cs = 1;
d0 = 1;
}
void main()
{
while(1)
{
for(a=0;a<4;a++)
{
ad();
}
upxianshi();
}
}
附录4 DA模块程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code shuzi[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x7b,0x40}; //0~9,p,-
unsigned char code weishu[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe}; //分别选通1~8个数码管
sbit dadata=P0^4;
sbit daclk=P1^2;
sbit daload=P1^4;
sbit daldac=P1^3;
sbit wei=P0^6; //位选锁存器
sbit duan=P0^5; //段选锁存器
uint z,x,y;
uchar datt;
/********************************************* 延时程序,时间1ms(同附录1)
*********************************************/ void da()
{
daclk=0;
daload=1;
daldac=1; //chushihua
_nop_();
_nop_();
daclk=1;
_nop_();
dadata=1;//通道4 0倍增益
_nop_();
daclk=0;
_nop_();
daclk=1;
_nop_();
dadata=1;//通道4 0倍增益
_nop_();
daclk=0;
_nop_();
daclk=1;
_nop_();
_nop_();
dadata=1;//通道4 0倍增益
_nop_();
daclk=0;
_nop_();
_nop_();
datt=date;
for(i=0;i<8;i++) //shuju wei {
daclk=1;
_nop_();
_nop_();
dat=datt&0x80;
if(dat) dadata=1;
else dadata=0;
daclk=0;
_nop_();
_nop_();
datt<<=1;
}
_nop_();
daload=0;
_nop_();
daload=1;
_nop_();
daldac=0;//genxin
_nop_();
daldac=1;
}
}
附录5 蜂鸣器模块程序
头文件和io口定义同附录1
/********************************************* 延时程序,时间1ms(同附录1)
*********************************************/
void main()
{
bee=0;
while()
{
bee=1;
}
}。