单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 492|回复: 1
收起左侧

求助,自行车里程速度表单片机编程遇到了问题

[复制链接]
深思熟虑 发表于 2017-4-28 21:52 | 显示全部楼层 |阅读模式
速度里程都能正常显示,只是存储总里程有问题,由于课题要求总里程最大值9999.99km,所以里程要分成四部分分别写进存储器。每次读的时候数值都不对,不知道是读还是写的问题,或者是其他问题。大神帮忙看看。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong  unsigned long

  6. sbit lcd_rs = P1^0;         
  7. sbit lcd_rw = P1^1;         
  8. sbit lcd_en = P1^2;        
  9. sbit scl=P3^6;
  10. sbit sda=P3^7;
  11. sbit key1=P2^0;
  12. sbit key2=P2^1;
  13. sbit key3=P2^2;
  14. sbit key4=P2^3;


  15. uint speed;           
  16. uint ave_speed;
  17. ulong mileage;
  18. ulong all_mileage;

  19. uchar eeprom_mileage;

  20. uchar str_speed[16];
  21. uchar str_ave_speed[16];
  22. uchar str_mileage[16];
  23. uchar str_all_mileage[16];

  24. uint int1_count;
  25. uint all_int1_count;
  26. uint int1_count100;
  27. uint time;
  28. uint all_time;

  29. bit start;
  30. uchar key;
  31. uchar q_count;
  32. uchar de;


  33. void eeprom_init();         //存储读写
  34. void eeprom_start();
  35. void eeprom_stop();
  36. void eeprom_ack();
  37. void eeprom_noack();
  38. void eeprom_write(uchar dat);
  39. uchar eeprom_read();
  40. void eeprom_writedat(uchar add,uchar dat);
  41. uchar eeprom_readdat(uchar add);

  42. bit lcd_busy();                                //lcd显示
  43. void lcd_wcmd(uchar cmd);
  44. void lcd_wdat(uchar dat);
  45. void lcd_init();
  46. void lcd_pos(uchar pos);
  47. void display(uchar str1[],uchar str2[]);

  48. void str_speed_init();                  //修改显示缓冲区
  49. void str_ave_speed_init();
  50. void str_mileage_init();
  51. void str_all_mileage_init();
  52. void str_change();

  53. void mileage_clean();

  54. void system_init();
  55. void system_start();//系统启动,停止
  56. void system_stop();

  57. void write(uint dat);//


  58. /*************延时函数*********************/
  59. void delayNOP()
  60. {
  61.         _nop_();_nop_();_nop_();_nop_();
  62. }

  63. void delay()
  64. {
  65.         _nop_();_nop_();_nop_();_nop_();
  66.         _nop_();_nop_();_nop_();_nop_();
  67. }

  68. void delayms(uchar x)   
  69. {
  70.         uchar i,j;
  71.         for(;x>0;x--)
  72.                 for(i=4;i>0;i--)
  73.                         for(j=113;j>0;j--);
  74. }
  75. void delay10ms(uchar x)   
  76. {
  77.         uchar i,j;
  78.         for(;x>0;x--)
  79.                 for(i=151;i>0;i--)
  80.                         for(j=29;j>0;j--);
  81. }

  82. void delay1s(uchar x)
  83. {
  84.         uchar a,b,c;
  85.         for(;x>0;x--)
  86.         {
  87.                 for(c=46;c>0;c--)
  88.                 for(b=152;b>0;b--)
  89.                 for(a=70;a>0;a--);
  90.                 _nop_();
  91.         }
  92. }
  93. /*************延时函数*********************/

  94. /*************中断函数*********************/
  95. void int0() interrupt 0
  96. {        
  97.         int1_count++;
  98.         int1_count100++;
  99.         all_int1_count++;
  100. }

  101. void int1() interrupt 2
  102. {
  103.         delay10ms(2);
  104.         if(key1==0)
  105.         {
  106.                 key=1;
  107.         }else if(key2==0)
  108.         {
  109.                 key=2;
  110.         }else if(key3==0)
  111.         {
  112.                 key=3;
  113.         }else if(key4==0)
  114.         {
  115.                 key=4;
  116.         }
  117. }

  118. void timer0() interrupt 1
  119. {
  120.         TL0=(65536-50000)%256;
  121.         TH0=(65536-50000)/256;
  122.         time++;
  123.         if(time>=20)
  124.         {
  125.                 all_time++;
  126.                 speed=0.6*3.14*int1_count/36*1000;
  127.                 mileage=0.6*3.14*all_int1_count;
  128.                 ave_speed=mileage/36*1000/all_time;
  129.                 all_mileage=eeprom_mileage+mileage;
  130.                 de=0;
  131.                 int1_count=0;
  132.                 time=0;
  133.         }
  134. }
  135. /*************中断函数*********************/

  136. /*************EEPROM存储函数*********************/
  137. void eeprom_start(void)  
  138. {  
  139.          sda=1;  
  140.          delay();  
  141.          scl=1;  
  142.          delay();  
  143.         sda=0;  
  144.          delay();  
  145. }  

  146. void eeprom_stop(void)  
  147. {  
  148.          sda=0;  
  149.          delay();  
  150.          scl=1;  
  151.          delay();  
  152.          sda=1;  
  153.          delay();   
  154. }  

  155. void eeprom_ack(void)  
  156. {  
  157.          uchar i;  
  158.          scl=1;  
  159.          delay();  
  160.          while((sda==1)&&(i<200))i++;  
  161.          scl=0;  
  162.          delay();  
  163. }  

  164. void eeprom_noack(void)  
  165. {  
  166.         sda=1;  
  167.          delay();  
  168.          scl=1;  
  169.          delay();  
  170.          scl=0;  
  171.          delay();  
  172. }  

  173. void eeprom_init(void)  
  174. {  
  175.          sda=1;  
  176.          scl=1;  
  177. }  

  178. void eeprom_write(uchar dat)  
  179. {  
  180.          uchar i;  
  181.          scl=0;  
  182.          for(i=0;i<8;i++)  
  183.          {  
  184.                   if(dat&0x80)  
  185.                   {  
  186.                            sda=1;   
  187.                   }  
  188.                   else   
  189.                   {  
  190.                            sda=0;  
  191.                   }  
  192.                   dat=dat<<1;  
  193.                   delay();  
  194.                   scl=1;  
  195.                   delay();  
  196.                   scl=0;  
  197.                   delay();      
  198.          }  
  199.          sda=1;  
  200.          delay();  
  201. }  

  202. uchar eeprom_read(void)  
  203. {  
  204.          uchar i;  
  205.          uchar dat;  
  206.          scl=0;  
  207.          delay();  
  208.          sda=1;  
  209.          delay();  
  210.          for(i=0;i<8;i++)  
  211.          {  
  212.                   scl=1;  
  213.                   delay();  
  214.                   dat=dat<<1;  
  215.                   if(sda)  
  216.                   {  
  217.                           dat++;
  218.                   }  
  219.                   scl=0;  
  220.                   delay();  
  221.          }  
  222.          return dat;   
  223. }  


  224. void eeprom_writedat(uchar add,uchar dat)  
  225. {  
  226.          eeprom_init();  
  227.          eeprom_start();  
  228.          eeprom_write(0xa0);  
  229.          eeprom_ack();  
  230.          eeprom_write(add);  
  231.          eeprom_ack();  
  232.          eeprom_write(dat);  
  233.          eeprom_ack();  
  234.          eeprom_stop();   
  235. }  

  236. uchar eeprom_readdat(uchar add)  
  237. {  
  238.          uchar a;  
  239.          eeprom_init();  
  240.          eeprom_start();  
  241.          eeprom_write(0xa0);  
  242.          eeprom_ack();  
  243.          eeprom_write(add);  
  244.          eeprom_ack();  
  245.          eeprom_start();  
  246.          eeprom_write(0xa1);  
  247.          eeprom_ack();  
  248.          a=eeprom_read();  
  249.          eeprom_noack();  
  250.         eeprom_stop();  
  251.          return a;   
  252. }  
  253. /*************EEPROM存储函数*********************/

  254. /*************LCD函数*********************/
  255. bit lcd_busy()
  256. {                          
  257.         bit result;        
  258.         lcd_rs = 0;
  259.         lcd_rw = 1;
  260.         lcd_en = 1;
  261.         delayNOP();
  262.         result = (bit)(P0&0x80);
  263.         lcd_en = 0;
  264.         return result;
  265. }

  266. void lcd_wcmd(uchar cmd)

  267. {                          
  268.         while(lcd_busy());
  269.         lcd_rs = 0;
  270.         lcd_rw = 0;
  271.         lcd_en = 0;
  272.         _nop_();
  273.         _nop_();
  274.         P0 = cmd;
  275.         delayNOP();
  276.         lcd_en = 1;
  277.         delayNOP();
  278.         lcd_en = 0;  
  279. }

  280. void lcd_wdat(uchar dat)
  281. {                          
  282.         while(lcd_busy());
  283.         lcd_rs = 1;
  284.         lcd_rw = 0;
  285.         lcd_en = 0;
  286.         P0 = dat;
  287.         delayNOP();
  288.         lcd_en = 1;
  289.         delayNOP();
  290.         lcd_en = 0;
  291. }

  292. void lcd_init()
  293. {
  294.         delayms(15);                  
  295.         lcd_wcmd(0x38);      
  296.         delayms(5);
  297.         lcd_wcmd(0x38);         
  298.         delayms(5);
  299.         lcd_wcmd(0x38);         
  300.         delayms(5);
  301.         
  302.         lcd_wcmd(0x0c);      
  303.         delayms(5);
  304.         lcd_wcmd(0x06);      
  305.         delayms(5);
  306.         lcd_wcmd(0x01);      
  307.         delayms(5);
  308. }

  309. void lcd_pos(uchar pos)
  310. {                          
  311.         lcd_wcmd(pos | 0x80);   
  312. }


  313. void display(uchar str1[],uchar str2[])
  314. {
  315.         uchar m;        
  316.         lcd_init();               
  317.         lcd_pos(0);                        
  318.         m=0;
  319.         while(str1[m] != '\0')
  320.         {                          
  321.                 lcd_wdat(str1[m]);
  322.                 m++;
  323.         }
  324.         lcd_pos(0x40);              
  325.         m=0;
  326.         while(str2[m] != '\0')
  327.         {
  328.                 lcd_wdat(str2[m]);      
  329.                 m++;
  330.         }
  331. }
  332. /*************LCD函数*********************/
  333. /*************修改显示缓冲区函数*********************/
  334. void  str_speed_init()
  335. {
  336.         str_speed[0]='S';
  337.         str_speed[1]='p';
  338.         str_speed[2]='e';
  339.         str_speed[3]='e';
  340.         str_speed[4]='d';
  341.         str_speed[5]=':';
  342.         str_speed[6]=(speed%100000)/10000+0x30;
  343.         str_speed[7]=(speed%10000)/1000+0x30;
  344.         str_speed[8]=(speed%1000)/100+0x30;
  345.         str_speed[9]='.';
  346.         str_speed[10]=(speed%100)/10+0x30;
  347.         str_speed[11]=speed%10+0x30;
  348.         str_speed[12]='k';
  349.         str_speed[13]='m';
  350.         str_speed[14]='/';
  351.         str_speed[15]='h';
  352. }

  353. void  str_ave_speed_init()
  354. {
  355.         str_ave_speed[0]='A';
  356.         str_ave_speed[1]='v';
  357.         str_ave_speed[2]='e';
  358.         str_ave_speed[3]='-';
  359.         str_ave_speed[4]='S';
  360.         str_ave_speed[5]=':';
  361.         str_ave_speed[6]=(ave_speed%100000)/10000+0x30;
  362.         str_ave_speed[7]=(ave_speed%10000)/1000+0x30;
  363.         str_ave_speed[8]=(ave_speed%1000)/100+0x30;
  364.         str_ave_speed[9]='.';
  365.         str_ave_speed[10]=(ave_speed%100)/10+0x30;
  366.         str_ave_speed[11]=ave_speed%10+0x30;
  367.         str_ave_speed[12]='k';
  368.         str_ave_speed[13]='m';
  369.         str_ave_speed[14]='/';
  370.         str_ave_speed[15]='h';
  371. }

  372. void  str_mileage_init()
  373. {
  374.         str_mileage[0]='M';
  375.         str_mileage[1]='i';
  376.         str_mileage[2]='l';
  377.         str_mileage[3]='e';
  378.         str_mileage[4]='a';
  379.         str_mileage[5]='g';
  380.         str_mileage[6]=':';
  381.         str_mileage[7]=(mileage%1000000)/100000+0x30;
  382.         str_mileage[8]=(mileage%100000)/10000+0x30;
  383.         str_mileage[9]=(mileage%10000)/1000+0x30;
  384.         str_mileage[10]=(mileage%1000)/100+0x30;
  385.         str_mileage[11]='.';
  386.         str_mileage[12]=(mileage%100)/10+0x30;
  387.         str_mileage[13]=mileage%10+0x30;
  388.         str_mileage[14]='k';
  389.         str_mileage[15]='m';
  390.         
  391. }

  392. void  str_all_mileage_init()
  393. {
  394.         str_all_mileage[0]='A';
  395.         str_all_mileage[1]='l';
  396.         str_all_mileage[2]='l';
  397.         str_all_mileage[3]='-';
  398.         str_all_mileage[4]='M';
  399.         str_all_mileage[5]='i';
  400.         str_all_mileage[6]=':';
  401.         str_all_mileage[7]=(all_mileage%1000000)/100000+0x30;
  402.         str_all_mileage[8]=(all_mileage%100000)/10000+0x30;
  403.         str_all_mileage[9]=(all_mileage%10000)/1000+0x30;
  404.         str_all_mileage[10]=(all_mileage%1000)/100+0x30;
  405.         str_all_mileage[11]='.';
  406.         str_all_mileage[12]=(all_mileage%100)/10+0x30;
  407.         str_all_mileage[13]=all_mileage%10+0x30;
  408.         str_all_mileage[14]='k';
  409.         str_all_mileage[15]='m';
  410.         
  411. }

  412. void str_change()
  413. {
  414.         str_speed_init();
  415.         str_ave_speed_init();
  416.         str_mileage_init();
  417.         str_all_mileage_init();
  418.         if(q_count)
  419.         {
  420.                 display(str_ave_speed,str_all_mileage);        
  421.         }else if(~q_count)        
  422.         {
  423.                 display(str_speed,str_mileage);
  424.         }        
  425. }
  426. /*************修改显示缓冲区函数*********************/

  427. /*************系统初始化函数*********************/
  428. void system_init()
  429. {
  430.         EA=1;
  431.         EX1=1;
  432.         IT1=1;
  433. }
  434. /*************系统初始化函数*********************/

  435. /*************启动函数*********************/
  436. void system_start()
  437. {        
  438.         EA=1;
  439.         
  440.         EX0=1;
  441.         IT0=1;

  442.         TMOD=0x01;
  443.         ET0=1;
  444.         TR0=1;
  445.         TL0=(65536-50000)%256;
  446.         TH0=(65536-50000)/256;
  447.         
  448.         
  449.         
  450.         eeprom_mileage = eeprom_readdat(00)+eeprom_readdat(01)*256+eeprom_readdat(02)*65536+eeprom_readdat(03)*256*65536;
  451. }

  452. void system_stop()
  453. {
  454.         EA=0;
  455.         lcd_wcmd(0x01);
  456. }
  457. /*************启动函数*********************/

  458. /*************里程清零函数*********************/
  459. void mileage_clean()
  460. {
  461.         write(all_mileage);
  462.         delay10ms(3);
  463.         eeprom_mileage=all_mileage;
  464.         mileage=0;
  465.         all_int1_count=0;
  466. }
  467. /*************里程清零函数*********************/
  468. void write(uint dat)
  469. {
  470.         eeprom_writedat(00,dat%65536%256);
  471.         delay10ms(3);
  472.         eeprom_writedat(01,dat%65536/256);
  473.         delay10ms(3);
  474.         eeprom_writedat(02,dat/65536%256);
  475.         delay10ms(3);
  476.         eeprom_writedat(03,dat/65536/256);
  477.         delay10ms(3);
  478. }

  479. void main()
  480. {
  481.         while(1)
  482.         {
  483.                 if(~start)
  484.                 {
  485.                         system_init();
  486.                 }
  487.                 if(int1_count100>=100)
  488.                 {
  489.                         write(all_mileage);
  490.                         int1_count100=0;
  491.                 }
  492.                 switch(key)
  493.                 {
  494.                         case 1:if(~start)
  495.                                         {
  496.                                                 key=0;
  497.                                                 start=~start;
  498.                                                 system_start();
  499.                                                 str_change();
  500.                                         }
  501.                                         break;
  502.                         case 2:        if(start)
  503.                                         {
  504.                                                 key=0;
  505.                                                 start=~start;
  506.                                                 system_stop();
  507.                                         }
  508.                                         break;
  509.                         case 3:if(start)
  510.                                         {
  511.                                                 key=0;
  512.                                                 q_count=~q_count;
  513.                                         }
  514.                                         str_change();
  515.                                         break;
  516.                         case 4:        if(start)
  517.                                         {
  518.                                                 key=0;
  519.                                                 mileage_clean();
  520.                                                 str_change();
  521.                                         }
  522.                                         break;
  523.                         default:if(start)
  524.                                         {        
  525.                                                 de=1;
  526.                                                 key=0;
  527.                                                 str_change();
  528.                                                 while(1&de){}
  529.                                         }
  530.                                         break;
  531.                 }
  532.         }
  533. }

复制代码

回复

使用道具 举报

 楼主| 深思熟虑 发表于 2017-4-29 18:30 | 显示全部楼层
 
问题已解决
回复

使用道具 举报

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

本版积分规则

     

QQ|手机版|小黑屋|单片机论坛

Powered by 单片机教程网

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