红外线自动计数器

发布时间 : 星期二 文章红外线自动计数器更新完毕开始阅读

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

联系合同范文客服:xxxxx#qq.com(#替换为@)