单片机监控程序设计实验.docx
《单片机监控程序设计实验.docx》由会员分享,可在线阅读,更多相关《单片机监控程序设计实验.docx(14页珍藏版)》请在冰豆网上搜索。
单片机监控程序设计实验
实验五单片机监控程序设计
实验目的
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;
}