这是光电传感器和霍尔传感器用来计算速度和次数的程序
时间:10-02
整理:3721RD
点击:
错在哪呢?求教
/**程序功能 光电传感器 霍尔传感器***/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6;
sbit we=P2^7;
sbit beep=P2^3;
sbit gd=P2^0; //光电传感器接口 当光耦传感器被遮光时电压由0V变为5V
sbit hr=P2^1; //霍尔传感器接口 当霍尔传感器附近有磁铁且极性相同时电压由5V变为0V
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管显示位
uchar key, pp=0,sd=0,dq=0,a0,a1,a2,a3,a4,a,b,c; //pp全局变量,产生时间基准;sd全局变量,缓存当前速度;dq全局变量,计算当前速度
void delayms(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan() //按键扫描,读按键1
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:key=1;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
}
beep=1;
}
void dis(uchar a,uchar b,uchar c) //a显示内容;b,c显示位置
{
a0=a/10;
a1=a%10;
du=0;
P0=tab[a0];
du=1;
du=0;
we=0;
P0=num;
we=1;
we=0;
delayms(40);
du=0;
P0=tab[a1];
du=1;
du=0;
we=0;
P0=num[c];
we=1;
we=0;
delayms(40);
}
void t0() interrupt 1 //利用定时器0产生时间基准
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
if(pp==20)
{
pp=0; //时间基准清0,重新开始
sd=dq; //转存当前速度,便于显示
dq=0; //当前速度清0,重新开始
}
}
void main()
{
uint count=0; //用于计算总次数
bit gd2=0; //用于确定光电传感器的上升延
bit hr2=0; //用于确定霍尔传感器的上升延
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
begin:
dis(0,4,5);
while(1)
{
keyscan();
if(key==1)
{
count=0;
goto begin;
}
if(dq==0)
{
dis(sd,1,2);
}
if(gd==0)
{
gd2=1;
}
if(hr==0)
{
hr2=1;
}
if((gd!=0&&gd2!=0)||(hr!=0&&hr2!=0))
{
gd2=0;
hr2=0;
count++;
if(count==100)
{
count=0;
}
dq++;
if(dq==100)
{
dq=0;
}
dis(count,4,5);
}
}
}
/**程序功能 光电传感器 霍尔传感器***/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6;
sbit we=P2^7;
sbit beep=P2^3;
sbit gd=P2^0; //光电传感器接口 当光耦传感器被遮光时电压由0V变为5V
sbit hr=P2^1; //霍尔传感器接口 当霍尔传感器附近有磁铁且极性相同时电压由5V变为0V
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管显示位
uchar key, pp=0,sd=0,dq=0,a0,a1,a2,a3,a4,a,b,c; //pp全局变量,产生时间基准;sd全局变量,缓存当前速度;dq全局变量,计算当前速度
void delayms(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan() //按键扫描,读按键1
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:key=1;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
}
beep=1;
}
void dis(uchar a,uchar b,uchar c) //a显示内容;b,c显示位置
{
a0=a/10;
a1=a%10;
du=0;
P0=tab[a0];
du=1;
du=0;
we=0;
P0=num;
we=1;
we=0;
delayms(40);
du=0;
P0=tab[a1];
du=1;
du=0;
we=0;
P0=num[c];
we=1;
we=0;
delayms(40);
}
void t0() interrupt 1 //利用定时器0产生时间基准
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
if(pp==20)
{
pp=0; //时间基准清0,重新开始
sd=dq; //转存当前速度,便于显示
dq=0; //当前速度清0,重新开始
}
}
void main()
{
uint count=0; //用于计算总次数
bit gd2=0; //用于确定光电传感器的上升延
bit hr2=0; //用于确定霍尔传感器的上升延
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
begin:
dis(0,4,5);
while(1)
{
keyscan();
if(key==1)
{
count=0;
goto begin;
}
if(dq==0)
{
dis(sd,1,2);
}
if(gd==0)
{
gd2=1;
}
if(hr==0)
{
hr2=1;
}
if((gd!=0&&gd2!=0)||(hr!=0&&hr2!=0))
{
gd2=0;
hr2=0;
count++;
if(count==100)
{
count=0;
}
dq++;
if(dq==100)
{
dq=0;
}
dis(count,4,5);
}
}
}
好东西呀,谢谢分享
好东西呀
不错不错呀啊呀
多谢多谢