#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char K=100; //相邻两个红外线探测器之间的圆弧长度,这里预设为100mm
unsigned int t0_num=0; //t0定时器中断次数计数
unsigned int speed; //用来存储计算出的速度,单位为 km/h
unsigned char int0_flag=0; //int0的中断标志位
unsigned char t0_max=65000; //定时器0的最大中断次数,防止当车轮不转时,数据溢出。
sbit sda=P2^0;
sbit scl=P2^1;
sbit cs=P2^2;
sbit zhu=P3^2;
uint S,time;
uchar code blank[]=
{
0x3f, //'0'
0x06, //'1'
0x5B, //'2'
0x4F, //'3'
0x66, //'4'
0x6D, //'5'
0x7D, //'6'
0x07, //'7'
0x7F, //'8'
0x6F, //'9'
0x77, //'A'
0x7C, //'b'
0x39, //'C'
0x5E, //'d'
0x79, //'E'
0x71, //'F'
0xff, //全亮
0x00, //全灭
0x80 //亮点
};
//uchar leds[5];
void write_add(uchar dat)
{
uchar i;
cs=0;
for(i=0;i<8;i++)
{
scl=0;
if(dat&0x01) //真为数据1 假为数据0
{
sda=1;
}else
{
sda=0;
}
dat=dat>>1; //下一位数据判断
scl=1; //上升沿移入一位数据
}
}
void acc(uchar s[])
{
uchar i ;
cs=1; //片选关
scl=1; //
sda=1;
write_add(0x03) ;
cs=1; //显示初始化完毕,关片选
// write_add(0x40) ; //数据设置为固定地址
cs=1; //数据设置为固定地址完毕 关片选
write_add(0x9B) ; //显示开关开,脉宽宽度10/16
cs=1; //关片选
for(i=0; i<4; i++)
{
cs=0; //开片选
write_add(0xC0|2*i) ;
if(5-1==i)
{
write_add(blank[s[i]]|0x80);
}
else
{
write_add(blank[s[i]]);
}
cs=1;
}
}
void main()
{
//初始化中断,下降沿有效
EA=0;
IT0=1;
EX0=1;
//初始化定时器T0,方式2,8位自动重载方式。在6MHz主频时,定时间隔为512us
TMOD=0x02;
TL0=0x0f;
TH0=0x27;
//开启中断
EA=1;
acc(dis);
while(1)
{
if(int0_flag==2) // 连续中断两次,则进行速度计算
{
speed=(K*3600)/(t0_num*512); //计算速度
dis[0]=speed%10000/1000;
dis[1]=speed%1000/100;
dis[2]=speed%100/10;
dis[3]=speed%10;
acc(dis);
t0_num=0;
int0_flag=0;
EA=1;
}
}
void int0_fun() interrupt 0
{
if(int0_flag==0)
{
TR0=1;
}
int0_flag++;
if(int0_flag==2)
{
TR0=0;
EA=0;
int0_flag=0;
}
}
void t0_fun() interrupt 1
{
t0_num++;
if(T0==t0_max)
{
int0_flag=2;
TR0=0;
EA=0;
}
} |