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

📄 main.lst

📁 用单片机实现出租车计价器的源码
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.OBJ
COMPILER INVOKED BY: E:\Program Files\专业工具\keil\C51\BIN\C51.EXE MAIN.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //多模块程序编写得I2C程序!!
   2          //实现简单的数字时钟---DS1307
   3          //experience
   4          //判断时刻,读取时钟为bcd码,十六进制
   5          //先存起步价,无一个误差脉冲(100m),否则先判断则有100m误差(一个脉冲)
   6          //比较分段里程,不用公里,而直接比较100m,还可以减少一个除法
   7          //按键切换的问题,标志位在中断服务程序取反!!!!!!!可悲!!!-----------------------
   8          //整个单片机执行时序问题?----计算等待费用时候!!----------------------
   9          //串口问题!!一定是定时器2出现问题 !!!!
  10          //串行口关于两个文件变量定义的问题!!
  11          //IDATA为什么不会抱错呢
  12          //养成良好的编程习惯!!内存分配-----------
  13          
  14          #include<reg52.h>
  15          #include<intrins.h>
  16          #include<serial.h>
  17          #include<lcd.h>
  18          #include<IIC.h>
  19          #define uchar unsigned char
  20          #define uint  unsigned int
  21          #define ulong unsigned long
  22          
  23          unsigned char idata buf_seri[6];
  24          bit ack_seri;
  25          
  26          uchar code table1[16]=" MARTIAN STUDIO "; 
  27          uchar code table2[16]="状态:载客      ";
  28          uchar code table3[16]="状态:空车      ";
  29              
  30                  
  31          //声明全局变量
  32                  uchar *s ;      //I2C器件读写单元缓冲区首地址指针
  33                  uchar no;       //读写I2C器件字节数
  34                  uchar sla ;     //I2C器件内部地址,都为写地址
  35                  uchar suba;     //器件内部地址
  36                  uchar bdata flag ;      //位寻址区定义
  37          
  38                  uchar bcd_num ;
  39                  
  40                  sbit fg_1s =flag^4;             //1s刷新标志
  41                  sbit fg_1s1=flag^5;          //1s刷新,计算等待费用
  42          
  43                  sbit fg_qibu =flag^7; 
  44                  bit  fg_day_ng;
  45                  bit  fg_100 ;
  46                  bit  fg_wait;
  47                  bit  key_fg;
  48                  bit  fg_on;
  49                  bit  fg_seri;
  50                  uchar buf_key   ;       //存按键值
  51                  uchar idata time_temp[4] ; //存实时读取1307系统时间  
  52                  uchar idata date_temp[3] ; //存实时读取1307系统时间
  53                  uchar idata lcd_temp[16] ;  //显示缓冲?
  54                  uchar idata  dis_temp[8];
  55                  uchar idata mrd[8]      ;         //接收缓冲区
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 2   

  56                  uchar idata trd[8]   ;    //发送缓冲区
  57          //    uchar idata table_shape0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//字形表0-9
  58          //      uchar idata table_shape1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字形表
  59                  
  60                  uchar idata table_time[7]={0x00,0x00,0x06,0x03,0x08,0x09,0x05};//设置起始时间2005年9月8号8点0分0秒
  61                  uchar buf_sec;  
  62          
  63                  uchar idata stack[10]   ;       //人工栈
  64                  uchar idata buf_bcd[9]          ;       //存放hex to bcd 后的 bcd 最多存放8位
  65                  
  66                  ulong buf_dis ;         //存放里程,四个字节
  67                  ulong buf_pre ;         //存放价格,四个字节 
  68                  ulong pre_dis ;         //存放上次载客里程      
  69                  ulong pre_pre ;         //存放上次载客费用
  70                          
  71                  ulong total_pre;                //存放总营业额
  72                  ulong day_pre   ;               //日额
  73          
  74                  uint  qibu_day ;        //存白天起步价格,10元转1000
  75                  uint  qibu_ng  ;        //存夜间起步价格,12元转1200
  76          
  77                  uint  midd_day  ;   //存3-8km价格1.6元转16
  78                  uint  huikong_day  ;    //存>8km价格2.2元转22
  79                  uint  wait_day ;        //等待价格,1.5元转150
  80          
  81          
  82                  ulong  wait_sec ;       //存等待时间,为精确计算,按照秒算
  83                  uint wait_min ;         //存等待分
  84                  uint wait_second ;      //存等待秒
  85                  
  86                  uchar dis_wmin  ;       //载客结束显示等待分钟
  87                  uchar dis_wsec  ;       //载客结束显示等待秒
  88                  
  89                  uchar dec_sec   ;       //存20,1s刷新   
  90                  uchar dia               ;       //存放直径
  91                  uchar buf_dia   ;  //计算速度,定时次数
  92                  uchar extra             ;       //加价
  93                  uint buf_sp     ;       //存放速度
  94                  uint buf_sp_temp;       
  95          
  96                  uchar pu                ;       //存脉冲数191----计算里程
  97                  uchar buf_pu    ;       //暂存脉冲数191         
  98                  
  99          
 100          
 101                  uchar error_type _at_ 0x30 ;  //存放写器件错误代码类型,全局变量
 102          
 103          
 104          //初始化清零子函数
 105          void clr_ram( uchar * s,uchar no )
 106          { static uchar i;
 107   1        for(i=0;i<no;i++)
 108   1              s[i]=0;         
 109   1      }       
 110          
 111          
 112          //清除LCD
 113          void clr_lcd( uchar *s,uchar no)
 114          { static uchar i;
 115   1        for(i=0;i<no;i++)
 116   1              s[i]=0x20;              
 117   1      }       
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 3   

 118          
 119          
 120          //hex 转 bcd  子程序
 121          //入口参数长整型数据
 122          //出口参数存bcd码缓冲区 
 123          void hextobcd(ulong a ,uchar * s)
 124          {
 125   1              static uchar i;
 126   1              ulong temp=a;
 127   1              for(i=0; temp;i++ )
 128   1              {       s[i]=temp%10;
 129   2                      temp/=10;
 130   2              }
 131   1              s[i]='\0';
 132   1              bcd_num=i;
 133   1      
 134   1      }
 135          
 136          
 137          
 138          void out_put( uint a)
 139          {
 140   1      static  idata uchar b[6];       //存bcd码
 141   1      static  idata uchar c[6];         //指针
 142   1      static  uchar j,i;              
 143   1      
 144   1              hextobcd(a,b);
 145   1              //倒转
 146   1              i=bcd_num;
 147   1              for(j=0;j<i; j++)
 148   1                      c[j]=b[i-j-1]+0x30;
 149   1                      
 150   1              for(j=0;j<i;j++)
 151   1                      b[j]=c[j];
 152   1                      b[j]='\0';                      //结束标志
 153   1      
 154   1      UartSendString(b);                      //UartSendString(c);错误,指针已经被改变
 155   1      
 156   1      }
 157                  
 158          
 159          //初始化函数
 160          void init(void)
 161          {       clr_ram(time_temp,4) ;  //时间存放单元清零
 162   1              clr_ram(date_temp,3) ;  //日期存放单元清零
 163   1              clr_ram(dis_temp,8) ;   //显示缓冲区清零
 164   1              clr_ram(trd,8)          ;       //发送缓冲区单元清零
 165   1              clr_ram(mrd,8)          ;       //接收缓冲区单元清零
 166   1              clr_ram(buf_bcd,9)      ;       //bcd码缓冲区清零
 167   1              clr_ram(stack,10)       ;       //清除人工栈
 168   1      
 169   1      //以下单元清零
 170   1      
 171   1          fg_1s =0;   //显示刷新1s未到
 172   1              fg_1s1=0;       //计算等待费用1s未到
 173   1              fg_wait=0;
 174   1              key_fg=0;
 175   1              fg_on=0;        
 176   1              fg_100=0;
 177   1              fg_qibu=1;              //计算起步价
 178   1              fg_day_ng=1;    //day
 179   1              buf_sp=0;
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 4   

 180   1              buf_sp_temp=0;
 181   1              
 182   1              wait_sec=0;
 183   1              wait_min=0;
 184   1              buf_sp=0;
 185   1              dec_sec=20;
 186   1              buf_key=0;              //清除按键值
 187   1              buf_dis=0;
 188   1              buf_pre=0;
 189   1              pre_dis=0;
 190   1              pre_pre=0;
 191   1              total_pre=0;
 192   1              day_pre=0;
 193   1              buf_sec=table_time[0];
 194   1      
 195   1      
 196   1      //以下参数可通过与PC机通信
 197   1              dia=50;         //存直径
 198   1              extra=12;               //夜间加价0.2
 199   1              qibu_day=10000; //起步价格10
 200   1              midd_day=160;           //中间价格1.6元/km
 201   1              huikong_day=210;        //回空价格2.2元/km
 202   1              wait_day=1500;  //等待价格1.5元/min
 203   1              pu=buf_pu=191; //计算里程,脉冲数
 204   1              buf_dia=dia;
 205   1              qibu_ng= qibu_day/10*extra;//起步价格12
 206   1              
 207   1              
 208   1              
 209   1              
 210   1      
 211   1              
 212   1      
 213   1      //定时器设置    
 214   1              TMOD=0X21;                                      //设置TO工作方式
 215   1              TH0=0X6c;                                       //设置T0计数初值 65536-37680=0x6cd0;
 216   1              TL0=0Xd0;
 217   1              ET0=1;                                          //启动定时中断
 218   1              ET1=0;  
 219   1      //中断设置
 220   1      
 221   1              IE0=0 ;
 222   1              IE1=0 ;
 223   1              IT0=1 ;
 224   1              IT1=1 ;
 225   1              EX0=1 ;
 226   1              EX1=1 ;
 227   1              EA=1  ; 
 228   1              TR0=1;                                          //启动定时器
 229   1              TR1=1;
 230   1              }
 231          
 232          
 233          //设置时间
 234          void set_time(void)     
 235          {       
 236   1              no=7;   //写入1307七个字节
 237   1              suba=0X00;      //器内地址
 238   1              sla=0XD0;       //器件地址
 239   1              
 240   1              if (  ! ISendStr(sla,suba,table_time,no)  ) 
 241   1                                      
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 5   

 242   1                              error_type=0x01;        //写时钟错误,代码0x01
 243   1                      
 244   1      }
 245          
 246          
 247          //读取1307系统时间,入口参数为指向字节单元的指针,
 248          //返回1表示读取成功,读取内容存指针所指缓冲区
 249          void rd_time_date(uchar *p_time, uchar *p_date )
 250          {       //读时间        
 251   1              no=4;   //读取1307七个字节
 252   1              suba=0X00;      //器内地址
 253   1              sla=0XD0;       //器件地址
 254   1              if ( ! IRcvStr(sla,suba, p_time, no) ) 
 255   1                      
 256   1                              error_type=0x02;        //读时钟错误,代码0x02
 257   1                
 258   1      
 259   1      
 260   1              
 261   1      
 262   1      
 263   1      
 264   1      
 265   1                              
 266   1              //读日期
 267   1              no=3;   //读取1307七个字节
 268   1              suba=0X04;      //器内地址
 269   1              sla=0XD0;       //器件地址
 270   1      
 271   1              if ( ! IRcvStr(sla,suba, p_date, no) ) 
 272   1                      
 273   1                              error_type=0x02;        //读时钟错误,代码0x02
 274   1      }
 275          
 276          
 277          
 278          
 279          
 280          //车行驶,切换按键,不影响车里程和费用计算
 281          void on_taxi(void)
 282          {
 283   1              //根据100m脉冲加1,代表100m     ,根据价格计算费用
 284   1              if (  fg_100 )
 285   1                              {          buf_dis+=1;  //里程加100m
 286   2                                               fg_100=0;              //清标志
 287   2                                        
 288   2                                         //price
 289   2                                              if ( buf_dis<=30 ) buf_pre=buf_pre;
 290   2                                              if(  buf_dis>30 && buf_dis<=80 && fg_day_ng ) buf_pre+=midd_day ;
 291   2                                              if(  buf_dis>30 && buf_dis<=80 && !fg_day_ng ) buf_pre=buf_pre+midd_day/10*extra;
 292   2                                              if(  buf_dis>80 && fg_day_ng ) buf_pre+=huikong_day;
 293   2                                              if(  buf_dis>80 && !fg_day_ng ) buf_pre+=(huikong_day/10*extra);
 294   2                              }
 295   1                      
 296   1                              //等待费用
 297   1                                      if ( buf_sp<=5 && fg_1s1  )
 298   1                                                      {   
 299   2                                              wait_sec+=1;            //等待累加1s
 300   2                                              dis_wmin=wait_min= wait_sec/60;
 301   2                                                      dis_wsec=wait_second=wait_sec%60;
 302   2                                                       }
 303   1      //解决了问题,终于发现问题了!!
C51 COMPILER V7.50   MAIN                                                                  08/28/2005 16:44:46 PAGE 6   

 304   1                                      if (  wait_min >5  && wait_second==0 &&fg_1s1   ) 
 305   1                                                              fg_wait=1;                      //类似中断处理内设置标志位
 306   1                                                              
 307   1                      if (  fg_wait )         
 308   1                              
 309   1                                         {     fg_wait=0;
 310   2                                                       if (  fg_day_ng  )             
 311   2                                                              buf_pre+=wait_day;
 312   2                                                       else
 313   2                                                               buf_pre=buf_pre+(wait_day/10*extra);
 314   2                                              }
 315   1                                                               

⌨️ 快捷键说明

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