a=0; delayms(5); a=1;
P0=Tab[ge]; b=0; delayms(5); b=1; }
void display2(uchar numdis)
{ uchar shi,ge; shi=numdis/10; ge=numdis;
P2=Tab[shi]; c=0; delayms(5); c=1;
P2=Tab[ge]; d=0; delayms(5);
12
d=1; }
2.软件流程框图
开始 系统初始化 Y Y K1按下K2按下 K2按下 K1按下 数码管1加一,进门数码管2加一,出门指示灯闪烁一次蜂鸣指示灯闪烁一次,蜂 器播报 鸣器播报 K1,K2顺序检测 3.程序
#include\
#define uchar unsigned char #define uint unsigned int
#include
sbit hongwai1=P3^6; //位定义模拟红外光电开关1接口 sbit hongwai2=P3^7; //位定义模拟红外光电开关2接口 sbit a=P1^0; //第一个数码管十位 sbit b=P1^1; //第一个数码管各位 sbit c=P1^2; //第二个数码管十位 sbit d=P1^3; //第二个数码管各位
13
sbit jin=P3^5; //进门指示灯端口 sbit chu=P3^4; //出门指示灯端口
uchar dirvalue=0x18; //方向开始赋初值
void delayms(uint); //Tab为数码管显示值,存入一个数组内 void direction(void); //声明按键扫描函数
uchar code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char num1=0,num2=0; //num为被显示的数字
void display1(uchar numdis) //显示函数1 { uchar shi,ge;
shi=numdis/10; //将数扯开到十位 ge=numdis; //将数扯开到各位
P0=Tab[shi]; //送十位数 a=0; //打开位选 delayms(5); //延时 a=1; //关闭位选
P0=Tab[ge]; //送个位数 b=0; //打开位选 delayms(5); //延时
b=1; //关闭位选 }
void display2(uchar numdis) //显示函数2
{ uchar shi,ge; //同上 shi=numdis/10; ge=numdis;
P2=Tab[shi]; c=0;
delayms(5); c=1;
P2=Tab[ge]; d=0;
delayms(5); d=1;
14
}
void delayms(uint x) //延时函数 {uint i,j;
for(i=x;i>0;i--) for(j=110;j>0;j--); }
void direction(void) //方向控制函数 检测人的进出并做出相应的操作 {
if(dirvalue==0x18) //开始初值 如果检测K1先按下 右移一位,如果检测到K2先按下左移一位 { if(hongwai1==0) dirvalue>>=1; if(hongwai2==0) dirvalue<<=1; while(!hongwai1||!hongwai2); } else if(dirvalue==0x0c) //右移后的值 { if(hongwai2==0) //检测K2的状态 { num1++; jin=0; while(!hongwai2); dirvalue=0x18; if(num1==99) num1=99; delayms(200); jin=1; } } else if(dirvalue==0x30) //左移后的值 { if(hongwai1==0) //检测K1的状态 { num2++; chu=0; while(!hongwai1); dirvalue=0x18;
15
if(num2==99) num2=99; delayms(200); chu=1; } } }
void main() //主函数
{
P3=0xff; //P3口全赋高电平 while(1) { direction(); //方向控制函数
display1(num1); //第一个数码管显示 display2(num2); //第二个数码管显示 }
}
16
相关推荐: