#include <reg51.h>
#define uchar unsigned char
#define NUM 10
#define count_M1 50000 ///T0的计数植0.05s
#define H_0 (65636-count_M1)/256 高八位
#define L_0 (65636-count_M1)%256
unsigned int count[NUM];
uchar i=0;
unsigned int over=0;
unsigned int cun;
sfr16 DPTR=0x82;
unsigned int Speed;
uchar Times=0;
sbit clk=P2^2;
sbit dat=P2^0;
sbit key=P2^1;
sbit p01=P0^1;
/*向bc728x发送一个字节*/
void send_byte(uchar send_byte)
{
uchar bit_counter;
clk=0; //产生一个clk脉冲
clk=1;
do
{
clk=0;
clk=1;
}
while(dat); //发送clk脉冲直至dat为低电平
clk=0;
clk=1; //Ta时间之内再次输入一clk脉冲
while(!dat); //等待bc728x进入接收状态
for(bit_counter=0;bit_counter<8;bit_counter++)
{
if((send_byte&0x80)==0)
{
dat=0;
}
else
{
dat=1;
}
send_byte=send_byte<<1;
clk=0;
clk=1;
}
dat=1;
}
void write728x(uchar reg_add,uchar write_data)
{
send_byte(reg_add); //发送寄存器地址
send_byte(write_data);//发送数据字节
}
int Sum_AVE()
{
int sum;
int average;
uchar i;
for(i=0;i<NUM;i++)
{
sum+=count[i];
}
/ 可以加iic 存
average=sum/NUM;
return (average);
}
void T0_1s(void) interrupt 1 //
{
uchar i=0;
TH0=H_0;
TL0=L_0;
if(++Times==20) //计够1s
{ over++;
TR1=0;
Times=0;
DPL=TL1;
DPH=TH1;
TH0=0;
TL0=0;
Speed=DPTR;
count[i]=Speed;
i++;
if(i==NUM)
{
cun=Sum_AVE();
write728x(0x14,0x30+cun/256);
write728x(0x14,(0x40+cun%256));
}
}
}
void main()
{ unsigned int tmr;
IE=0x8a; 1000 1010
TMOD = 0x51; ///0101 0001B 计数1 定时0
TH0=H_0;
TL0=L_0;
TH1=0;
TL1=0;
TR0=1;
TR1=1;
for(tmr=0;tmr<0xffff;tmr++); //等待复位
write728x(0x12,0xc8); //初始化BC7281B为SCN=1,RP=1;BMS=1
write728x(0x14,0x00); //在第0位显示0
write728x(0x14,0x10); //在第1位显示0
while(1){
if(over==10)
{
TR0=0;
TR1=0;
write728x(0x14,0x30+cun/256);
write728x(0x14,(0x40+cun%256));
}
//TR0=1;
//TR1=1;
}
}