⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 060305.lst

📁 基于单片机的自行车计时
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.01   060305                                                                05/18/2008 12:47:07 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE 060305
OBJECT MODULE PLACED IN 060305.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 060305.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //几点说明:关机可以让单片机真正休眠进入真正低功耗状态,但是由于液晶一直有电供应且不知其功耗,故能省多少电
             -并不知道,当然可以通过一个管脚通过
   2          //控制三极管的基极来给液晶供电,关机时给其断电
   3          #include <at89x52.h>
   4          #include"LCD1602.h"
   5          #include"I2C.h"
   6          sfr  P1Port             = 0x90;
   7          sbit led1=P3^7;
   8          sbit led2=P3^6;
   9          sbit led3=P3^5;
  10          sbit led4=P3^4;
  11          sbit lcd_on=P2^7;//P2^7控制lcd的开关
  12          //########################################################################################################
             -##############################
  13          //I2C程序
  14          //########################################################################################################
             -##############################
  15          unsigned char  wheel_radi;
  16          unsigned short sec_add1;
  17          unsigned char  second1;
  18          unsigned char  minute;
  19          unsigned char  hour;
  20          unsigned short sec_add2;  //ms
  21          unsigned int  cal_sec_add2;     //
  22          unsigned int  mil_temp;
  23          unsigned int   miles;                   //最大值为65536,即655.36km
  24          unsigned int   speed;
  25          unsigned int   max_speed;
  26          unsigned int   time_round;   //保存一个时间里面包含了几个36ms
  27          unsigned int   temp_radi;
  28          unsigned int   totalmile=0;
  29          unsigned int   wspeed;//存放圈速度
  30          unsigned char  butt_down;
  31          bit speedflag;
  32          bit firstime_flag;//消除速度第一次效应
  33          unsigned char timearray[]={0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,0xff};
  34          unsigned char speedarray[]={0x30,0x30,0x2e,0x30,0x6b,0x6d,0x2f,0x68,0xff};
  35          unsigned char milesarray[]={0x30,0x30,0x30,0x2e,0x30,0x30,0x6b,0x6d,0xff};
  36          unsigned char wspeedarray[]={0x30,0x30,0x30,0x72,0x2f,0x6d,0x69,0x6e,0xff};
  37          void Delay1ms(unsigned char count)
  38          {
  39   1              unsigned char i,j;
  40   1              for(i=0;i<count;i++)
  41   1              for(j=0;j<33;j++);
  42   1      }
  43          void inttial_reg()
  44                  {
  45   1               max_speed=0;
  46   1               speedflag=0;
  47   1               firstime_flag=0;
  48   1           sec_add1=0;
  49   1               second1=0;
  50   1               minute=0;
  51   1               hour=0;                  //时、分、秒、毫秒计数器,用来寄存行驶时间
  52   1               sec_add2=0;
C51 COMPILER V8.01   060305                                                                05/18/2008 12:47:07 PAGE 2   

  53   1               cal_sec_add2=0;
  54   1               mil_temp=0;
  55   1               miles=0;
  56   1               speed=0;
  57   1               time_round=0;
  58   1           temp_radi=180*wheel_radi;
  59   1              }    
  60          void initiall()
  61          {       
  62   1               //warm up 延时
  63   1               lcd_on=1;
  64   1               Delay1ms(60);
  65   1               sta();
  66   1               wri_one_char(0xa0);
  67   1               ack();
  68   1               wri_one_char(0x02);
  69   1               ack();
  70   1               sta();
  71   1               wri_one_char(0xa1);
  72   1               ack();
  73   1               wheel_radi=read();
  74   1               no_ack();      
  75   1               stop();
  76   1               inttial_reg();
  77   1               TMOD=0x11;
  78   1               TL0=0xb0;
  79   1               TH0=0x3c;
  80   1               TL1=0x30;
  81   1               TH1=0xf8;                      //打开外中断0,定时器0和定时器1、总中断的中断允许
  82   1               TCON=0x01;                     //将外中断0设置为跳变触发方式
  83   1      //下面从外部存储器中读入车轮周长的值
  84   1      //将中断设为下降沿,定时器模式设为1
  85   1      //将定时器0用来计时,定时器1用来计相邻脉冲的时间间隔
  86   1      //如果下一脉冲还没有到来而已经经过很长时间,则可以将速度置零
  87   1      //$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  88   1               LCD_Initial();
  89   1      }
  90          void timer0 (void) interrupt 1                             //计时程序,时间数据输出到LCD上
  91          {
  92   1               TL0=0xb0;
  93   1               TH0=0x3c;
  94   1               if (sec_add1==19)                                                 //定时时长50ms
  95   1                      {
  96   2                         sec_add1=0;
  97   2                            if (second1==59)
  98   2                                   {
  99   3                                    second1=0;
 100   3                                                if (minute==59)
 101   3                                                   {
 102   4                                                    minute=0;
 103   4                                                             if (hour==9)
 104   4                                                                    {
 105   5                                                                         hour=0;
 106   5                                                                         }
 107   4                                                                 else
 108   4                                                                    {
 109   5                                                                        hour++;
 110   5                                                                        }
 111   4                                                        }
 112   3                                                else
 113   3                                                   {
 114   4                                                        minute++;
C51 COMPILER V8.01   060305                                                                05/18/2008 12:47:07 PAGE 3   

 115   4                                                       }
 116   3                                    }
 117   2                         else
 118   2                             {
 119   3                                  second1++;
 120   3                                      }
 121   2                      }
 122   1               else
 123   1                   {  
 124   2                        sec_add1++;      
 125   2                        }
 126   1      }
 127          void timer1 (void) interrupt 3                    //定时器1的中断,对转一圈的时间进行计时
 128          {
 129   1              TL1=0x30;
 130   1              TH1=0xf8;                                                               //定时时长2ms
 131   1              sec_add2++;
 132   1              if(sec_add2>2500){speed=0;wspeed=0;speedflag=1;}
 133   1              else{speedflag=0;}
 134   1      }
 135          void pulse_in (void) interrupt 0
 136          {       
 137   1      //将当前寄存器数值保存并置零,同时开启定时器
 138   1              //Delay1ms(100);
 139   1              mil_temp+=wheel_radi;     //因为wheel_radi是以厘米为单位的,而且我们的显示精度到0.01km(即10m),故要和1000
             -进行比较
 140   1                 if (mil_temp>=1000)
 141   1                    {
 142   2                         mil_temp-=1000;
 143   2                         miles++;                      //这里miles也是取的整数,单位也是10m,尽管最后在lcd上显示的是km/s
 144   2                        }
 145   1              cal_sec_add2=sec_add2;
 146   1              sec_add2=0;
 147   1              if(speedflag==0)                                                     
 148   1                {
 149   2                 speed=temp_radi/cal_sec_add2;
 150   2                 wspeed=30000/cal_sec_add2;
 151   2                 }                                                       //*************#########################*******************由于简化运算,这里的精度不可能很
             -高,
 152   1              else {
 153   2                              speed=0;
 154   2                              wspeed=0;
 155   2                       }                 //这里速度的单位是:百米/小时
 156   1              if(firstime_flag==0){firstime_flag=1;speed=0;wspeed=0;}//消除速度第一次效应
 157   1              if(speed>max_speed) max_speed=speed;
 158   1              IE0=0; //清中断标志
 159   1      }
 160          //时间格式:   hour(1bit)  :  minute (int)  :  second1 (int)
 161          //速度:           speed(3bits)   百米/小时------->**.*
 162          //里程:           miles   十米------>km   .**
 163          //这里很重要的一件事情就是将数据形式转换为可以送去显示的形式
 164          void display()
 165          {
 166   1              timearray[1]=hour+0x30;
 167   1              timearray[3]=minute/10+0x30;
 168   1              timearray[4]=minute%10+0x30;
 169   1              timearray[6]=second1/10+0x30;
 170   1              timearray[7]=second1%10+0x30;
 171   1              speedarray[0]=speed/100+0x30;
 172   1              speedarray[1]=(speed/10)%10+0x30;
 173   1              speedarray[3]=speed%10+0x30;
 174   1              milesarray[0]=miles/10000+0x30;
C51 COMPILER V8.01   060305                                                                05/18/2008 12:47:07 PAGE 4   

 175   1              milesarray[1]=(miles/1000)%10+0x30;
 176   1              milesarray[2]=(miles/100)%10+0x30;
 177   1              milesarray[4]=(miles/10)%10+0x30;
 178   1              milesarray[5]=miles%10+0x30;
 179   1              wspeedarray[0]=wspeed/100+0x30;
 180   1              wspeedarray[1]=(wspeed/10)%10+0x30;
 181   1              wspeedarray[2]=wspeed%10+0x30;
 182   1      }
 183          unsigned int cal_total_miles()
 184                  {
 185   1              unsigned int stoa=0;
 186   1              sta();
 187   1              wri_one_char(0xa0);
 188   1              ack();
 189   1              wri_one_char(0x00);
 190   1              ack();
 191   1              sta();
 192   1              wri_one_char(0xa1);
 193   1              ack();
 194   1              stoa=read();
 195   1              no_ack();       
 196   1              stop();
 197   1              stoa=stoa<<8;
 198   1              sta();
 199   1              wri_one_char(0xa0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -