单片机监控程序设计实验.docx

上传人:b****7 文档编号:10823169 上传时间:2023-02-23 格式:DOCX 页数:14 大小:66.01KB
下载 相关 举报
单片机监控程序设计实验.docx_第1页
第1页 / 共14页
单片机监控程序设计实验.docx_第2页
第2页 / 共14页
单片机监控程序设计实验.docx_第3页
第3页 / 共14页
单片机监控程序设计实验.docx_第4页
第4页 / 共14页
单片机监控程序设计实验.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机监控程序设计实验.docx

《单片机监控程序设计实验.docx》由会员分享,可在线阅读,更多相关《单片机监控程序设计实验.docx(14页珍藏版)》请在冰豆网上搜索。

单片机监控程序设计实验.docx

单片机监控程序设计实验

实验五单片机监控程序设计

实验目的

1、理解监控程序的功能和作用

2、掌握基本监控程序的设计与调试方法

3、了解基本监控程序的不足之处

实验仪器

单片机开发板、万利仿真机、稳压电源、计算机

实验原理

系统监控程序是控制单片机系统按预定操作方式运转的核心。

它主要要完成人机对话、内部数据的检测显示和各种控制功能。

监控程序的稳定高效是单片机应用系统设计成功的关键之一。

监控程序又可分为顺序调度型监控程序、优先调度型监控程序、特征编码型监控程序、状态编码型监控程序、键码分析型监控程序、实时操作系统等。

对初学者来说,要设计一个高质量的监控程序是较困难的。

监控程序具有的特点:

(1)能自主运行

(2)能自动重错误中恢复

(3)能执行用户的各种输入操作

1、优先调度型监控程序

作业优先调度型监控程序,能根据各作业的优先级高低进行调度。

优先级高的作业先运行,所有高优先的作业都运行完成后才能运行低优先级作业。

这类单片机系统常用在可操作的智能测试系统中。

监控程序按优先级的高低检测各作业的运行标志。

一旦标志位为1,就代表这个作业需要运行。

这时监控程序结合优先级,决定是否马上执行该作业。

作业开始运行时,要先清除标志,作业运行完成后,再返回检查标志的过程。

程序运行流程图如图3-5所示。

图中作业1的优先级最高,最后判断的作业优先级最低。

 

 

2、特征编码型监控程序

特征编码型监控程序分为位特征码和字节特征码两种。

其中位特征码型与优先级调度型原理相同。

各标志判断的先后次序隐含了优先级。

字节型特征编码型每次检测一个字节是否相同,相同则执行。

在依次检测的过程中也隐含了优先级。

程序运行流程如图3-6所示。

 

图3-6特征编码型监控程序

3、键码分析型监控程序

如果各作业间既没有先后顺序,也没有优先关系。

上述的方法可能都不太合适。

作业的调度完全按操作者的输入或内部参数的变化。

这里假设各作业具有相同的优先级。

监控程序根据当前按键输入和内部状态的值决定执行哪个作业。

在一键多义的系统中,还可以把按键和状态组合起来构成两级状态编码监控程序。

流程图如图3-7所示。

4、状态编码型监控程序

该监控程序把一个单片机应用系统分成若干个状态,每个状态完成一定任务,并在该状态的最后说明下一个状态,也叫状态机程序。

在自动控制系统中,状态机具有设计简单直观,控制容易等特点。

状态编码一般与按键信息共同做为输入,控制单片机运行。

如图所示。

实验内容

1、设计一个特征码型监控程序设计

该监控程序共有8个任务,每个任务的功能是在数码管上显示任务编号,并延时一秒。

现规定这8个任务运行由学号后两位的BCD码决定,为1的位表示要运行。

例如,05号,BCD码是00000101,需要运行的任务是第0,2个任务。

2、状态编码型监控程序

设计一个11状态的监控程序,每个状态的功能是输出状态编号,延时一秒后,进入下一个状态。

状态切换以学号不重复的数字依次进行,都进入第10状态(0-10),数码管显示“-”,延时一秒后进入第一位学号数字指定的状态。

例如,20082401013,单片机内部状态依次是:

2-0-8-4-1-3-10-2。

显示的数字是2-0-8-4-1-3-“-”-2

通过按键切换实验内容1、2;

实验程序代码如下:

#include

#include"display.h"

externuchartable[8];

externucharbefore,next;

bitflag,flag1;

uchart,tasknum,*p,*XH="20094081031";//2094813-

uchari,j,k,zuohao,tasknum1,tasknum2,keynum;

voidTask0()

{table[0]=0;}

voidTask1()

{table[0]=1;}

voidTask2()

{table[0]=2;}

voidTask3()

{table[0]=3;}

voidTask4()

{table[0]=4;}

voidTask5()

{table[0]=5;}

voidTask6()

{table[0]=6;}

voidTask7()

{table[0]=7;}

voidinit()

{

flag=0;

flag1=0;

zuohao=0x1f;

tasknum1=0;

tasknum2=2;

for(i=0;i<8;i++)//数码管初值化

table[i]=0x12;

TMOD=0x01;

EA=1;

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

ET0=1;

TR0=1;

}

voidmain()

{

init();

while

(1);

}

voidtimer0()interrupt1

{

TH0=(65536-20000)/256;

TL0+=(65536-20000)%256;

keynum=dispkey();

t++;

if(t==50)

{

t=0;

if(Flag==1&&keynum!

=0)

{Flag=0;flag=!

flag;table[0]=0x12;}

if(flag==0)

{

if((zuohao>>tasknum1)&0x01)

{

switch(tasknum1)

{

case0:

Task0();tasknum1++;break;

case1:

Task1();tasknum1++;break;

case2:

Task2();tasknum1++;break;

case3:

Task3();tasknum1++;break;

case4:

Task4();tasknum1++;break;

case5:

Task5();tasknum1++;break;

case6:

Task6();tasknum1++;break;

case7:

Task7();tasknum1++;break;

}

}

}

if(flag==1)

{

switch(tasknum2)

{

case0:

table[1]=0x0;tasknum2=9;break;

case1:

table[5]=0x1;tasknum2=3;break;

case2:

table[0]=0x2;tasknum2=0;break;

case3:

table[6]=0x3;tasknum2=10;break;

case4:

table[3]=0x4;tasknum2=8;break;

case5:

break;

case6:

break;

case7:

break;

case8:

table[4]=0x8;tasknum2=1;break;

case9:

table[2]=0x9;tasknum2=4;break;

case10:

table[7]=0x12;tasknum2=2;break;

}

}

}

before=next;

}

/************************************************************************

Display函数

*********************************************************************/

//#define__DISPLAY_H__

#include"display.h"

ucharcodedisptable[]={0x03,0x9F,0x25,0x0D,0x99,0x49,

0x41,0x1F,0x01,0x09,0x11,

0xC1,0x63,0x85,0x61,0x71,0xfe,0xff,0xfd};//0~F数码代码

ucharcodetablepoint[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

ucharpoint,before,next;

uchartable[8];

voiddelay_1ms(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=123;y>0;y--);

}

voiddelay_50ms(uchart)

{

uintj;

for(;t>0;t--)

for(j=6245;j>0;j--);

}

uchardispkey(void)

{

uchari;//keynum=0;

i=8;

before=0;

next=0;

DAT=disptable[table[i-1]];

if(point&tablepoint[i-1])

DAT=DAT&0xfe;//加入小数点

DISPDIN=0;

DISPCLK=0;

DISPCLK=1;

DISPDIN=1;

delay_1ms

(1);

if(!

key)

{

delay_1ms(5);

if(!

key)next=i;

}

for(i=7;i>0;i--)

{

DAT=0xff;

DAT=disptable[table[i-1]];

if(point&tablepoint[i-1])

DAT=DAT&0xfe;//加入小数点

DISPCLK=0;

DISPCLK=1;

delay_1ms

(1);

if(!

key)

{

delay_1ms(5);

if(!

key)next=i;

}

}

DAT=0xff;

//returnnext;

if(before==0&&next!

=0)Flag=1;

if(before!

=0&&next==0)returnbefore;

}

思考题

1、请说说实验内容1,2分别执行了哪几个子程。

实验内容1执行了0、1、2、3、4五个子程序,实验内容2执行了2、0、9、4、8、1、3、-八个子程序。

2、实验内容2的程序有什么不足之处,如何改进?

实验内容2的程序不能智能的寻找状态。

改进如下:

#include

#include"display.h"

externuchartable[8];

externucharbefore,next;

bitflag,flag1;

uchart,tasknum,*p,*XH="20094081031";//2094813-

uchari,j,k,zuohao,tasknum1,tasknum2,keynum;

voidTask0()

{table[0]=0;}

voidTask1()

{table[0]=1;}

voidTask2()

{table[0]=2;}

voidTask3()

{table[0]=3;}

voidTask4()

{table[0]=4;}

voidTask5()

{table[0]=5;}

voidTask6()

{table[0]=6;}

voidTask7()

{table[0]=7;}

voidinit()

{

flag=0;

flag1=0;

zuohao=0x1f;

tasknum1=0;

tasknum2=2;

for(i=0;i<8;i++)//数码管初值化

table[i]=0x12;

TMOD=0x01;

EA=1;

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

ET0=1;

TR0=1;

}

voidmain()

{

init();

while

(1);

{

keynum=dispkey();

if(Flag==1&&keynum!

=0)

{Flag=0;flag=!

flag;table[0]=0x12;}

if(flag==1)

{

p=XH;

for(i=0;i<11;i++)

{

for(j=0;j

{

if(p[i]==p[j])flag1=1;

}

if(flag1==0){table[k++]=*(p+i);flag1=0;}

}

table[k]=0x12;

p=XH;

}

before=next;

}

}

voidtimer0()interrupt1

{

TH0=(65536-20000)/256;

TL0+=(65536-20000)%256;

keynum=dispkey();

t++;

if(t==50)

{

t=0;

if(Flag==1&&keynum!

=0)

{Flag=0;flag=!

flag;table[0]=0x12;}

if(flag==0)

{

if((zuohao>>tasknum1)&0x01)

{

switch(tasknum1)

{

case0:

Task0();tasknum1++;break;

case1:

Task1();tasknum1++;break;

case2:

Task2();tasknum1++;break;

case3:

Task3();tasknum1++;break;

case4:

Task4();tasknum1++;break;

case5:

Task5();tasknum1++;break;

case6:

Task6();tasknum1++;break;

case7:

Task7();tasknum1++;break;

}

}

}

}

before=next;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1