打印

关于侧转速的程序,不知哪有错,求助

[复制链接]
1292|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l410383815|  楼主 | 2011-11-14 19:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
   }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝