找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3698|回复: 0
打印 上一主题 下一主题
收起左侧

如何让测速更精确,误差变小 程序有些看不懂 求注释

[复制链接]
跳转到指定楼层
楼主
ID:58477 发表于 2014-5-13 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit led1=P2^4;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit zheng=P2^0;
sbit fan=P2^1;
sbit zhengled=P3^6;
sbit fanled=P3^7;
sbit zhixing=P3^5;
uchar code table[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,
                          0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74};
uint count=0,count1=0,time=0;
uint qian,bai,shi,ge;
uint moshi=0;  
uchar pwm=75,key55=0,key66=75,xianshi=1;
unsigned long int jishu=0,shuzhi;
void delay(uint xms)  //延时函数
{
int a,b;
for(a=xms;a>0;a--)
  for(b=110;b>0;b--);
}
void initclock()      //时钟初始化
{
T2MOD=0x00;
T2CON=0x04; /*定时器2为自动重装定时工作模式)  TR2=1 */
RCAP2L=(65536-50000)%256;  //给定时器T2装初值
RCAP2H=(65536-50000)/256;
TR2=1;    //打开定时器中断1,2
ET2=1;
EA=1;   //开中断
}

void timer_init()       //定时器一初始化
{
TMOD=0x15;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;   //开定时器零1中断
TR1=1;   //启动计数器1
TH0=0X00;
TL0=0X00;
ET0=1;   //开计数器中断
TR0=1;   //启动计数器器0  
EA=1;   //开中断
}
void jisuan()         //计算时间速度距离函数
{
if(time==1)
{
   jishu=10;
   jishu=TH0*256+TL0;     //读取计数器的值
   TH0=0X00;
   TL0=0X00;       //重装
   time=0;
   TF2=0;
   RCAP2H=(65536-50000)/256;
   RCAP2L=(65536-50000)%256;
   jishu=jishu*60;
   shuzhi=jishu;
}  
}
void display(uint shu)                                   //
{   
   
  qian=shu/1000;
  bai=shu%1000/100;
  shi=shu%1000%100/10;
  ge=shu%1000%100%10;
   led1=0;
   P0=table[qian];
   delay(5);
   led1=1;
   led2=0;
   P0=table[bai];
   delay(5);
   led2=1;
   led3=0;
   P0=table[shi];
   delay(5);
   led3=1;
   led4=0;
   P0=table[ge];
   delay(5);
   led4=1;
}
void keyscan()                               //
{
if(key1==0)
{
  delay(5);
  if(key1==0)
  {
   while(!key1);
   moshi=0;
  }
}
if(key2==0)
{
  delay(5);
  if(key2==0)
  {
   while(!key2);
   moshi=1;
  }
}
if(key3==0)
{
  delay(5);
  if(key3==0)
  {
   EA=0;
   delay(2);
   while(!key3);
   key66=key66+5;
   if(key66>=100)
   {
    key66=100;
   }
   pwm=key66;
   EA=1;
  }
}
if(key4==0)
{
  delay(5);
  if(key4==0)
  {
   while(!key4);
   EA=0;
   delay(2);
   key66=key66-5;
   if(key66<=25)
   {
    key66=25;
   }
   pwm=key66;
   EA=1;
  
  }
}
if(key5==0)
{
  delay(5);
  if(key5==0)
  {
   while(!key5);
   key55++;
   if(key55==1)
   {
    timer_init();
    initclock();
    EA=1;
    delay(100);
    zhixing=0;
   }
   if(key55==2)
   {
    key55=0;
    zhixing=1;
    EA=0;
    zheng=0;
    fan=0;
    jishu=0;
   }
  }
}
if(key6==0)
{
  delay(5);
  if(key6==0)
  {
   while(!key6);
  // {
  //  display(shuzhi);
  // }
   xianshi++;
    if(xianshi==3)
     xianshi=1;
  }
}
}
void chuli()         
{
uint i,j;
i=key66*20;
j=shuzhi;
if(i>j)
  pwm=pwm+1;
if(j>i)
  pwm=pwm-1;
}
void main()
{
  while(1)
  {
    uint ms;
   ms++;
   if(xianshi==1)
    display(key66*20);
   if(xianshi==2)
    display(shuzhi);   
   keyscan();
    jisuan();
    if(ms==15)
    {
     ms=0;
     chuli();
   }
  }
}
void T1_time()interrupt 5     //定时器
{
TF2=0;
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
count++;
if(count==10)
{
  time=1;
  count=0;
}
}
void time1(void)interrupt 3         //定时器1溢出,yichu=1
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count1++;
if(count1==156)
{
   count1=0;
}
if(moshi==0)
{
  
   zheng=0;
   zhengled=0;
   fanled=1;
   if(count1<pwm)
   {
     fan=1;
   }
   if(count1>=pwm)
   {
     fan=0;
   }
}
if(moshi==1)
{
   fan=0;
   zhengled=1;
   fanled=0;
   if(count1<pwm)
   {
     zheng=1;
   }
   if(count1>=pwm)
   {
     zheng=0;
   }
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表