標(biāo)題: 基于單片機的自行車?yán)锍瘫碓O(shè)計(有原理圖 仿真電路 源程序 pcb) [打印本頁]

作者: zhugehei    時間: 2016-9-7 13:54
標(biāo)題: 基于單片機的自行車?yán)锍瘫碓O(shè)計(有原理圖 仿真電路 源程序 pcb)
有需要  畢業(yè) 或者 課程設(shè)計的自己下

51單片機自行車?yán)锍瘫碓韴D


自行車?yán)锍瘫矸抡?br />

自行車?yán)锍瘫淼膒cb圖

1-源程序.zip

71.7 KB, 下載次數(shù): 594, 下載積分: 黑幣 -5

2-原理圖.zip

457.17 KB, 下載次數(shù): 419, 下載積分: 黑幣 -5

5-protus仿真.zip

50.95 KB, 下載次數(shù): 478, 下載積分: 黑幣 -5

12-pcb圖.zip

141.87 KB, 下載次數(shù): 306, 下載積分: 黑幣 -5


作者: admin    時間: 2016-9-7 23:43
下面是主程序:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #include "Data.h"
  5. #include "DS1302.h"
  6. #include "AT24C02.h"

  7. sbit COUNT_IN=P3^2;

  8. //定義1602相關(guān)管腳
  9. sbit rs=P1^4;
  10. sbit en=P1^0;

  11. //鍵盤定義
  12. sbit K1=P3^4;        //設(shè)置時間
  13. sbit K3=P3^6;        //減按鍵
  14. sbit K2=P3^5;        //加按鍵
  15. sbit K4=P3^7;        //設(shè)置半徑安全距離
  16. sbit BEEP=P3^0;

  17. uint count;
  18. unsigned long Velocity,Mileage;

  19. uchar code tab1[]={"  /  /     :    "}; //14/09/10 16:34 3          
  20. uchar code tab2[]={"  0.000km 00km/h"};        //000.000km 00km/h
  21. uchar code tab3[]={"Wheel Radius  cm"};
  22. uchar code tab4[]={"Safe Speed  km/h"};
  23. uchar code tab5[]={"Sec :           "};
  24.                                                   
  25. uchar Mode=0;
  26. uchar bike_set=0;
  27. uchar a;
  28. char RADIUS,SAFE_SPEED;
  29. bit LED_SEC;
  30. uchar before_sec;       

  31. //自定義字符
  32. uchar code num[]={
  33.                                                 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1         
  34.                                                 0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
  35.                                                 0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3         
  36.                                                 0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
  37.                                                 0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5         
  38.                                                 0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
  39.                                                 0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7        
  40. };
  41. void READS();
  42. void SETS();
  43. void delay(uint x)
  44. {
  45.         uint i,j;
  46.         for(i=0;i<x;i++)
  47.         for(j=0;j<110;j++);
  48. }
  49. void init()
  50. {
  51.         IT0=1;        //INT0負(fù)跳變觸發(fā)       
  52.     TMOD=0x01;//定時器工作于方式1
  53.         TH0=0x3c;          //50ms
  54.         TL0=0xb0;
  55.         EA=1; //CPU開中斷總允許
  56.         ET0=1;//開定時中斷
  57.         EX0=1;//開外部INTO中斷
  58.     TR0=1;//啟動定時
  59. }
  60. /********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

  61. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  62. {
  63.         rs=0;//數(shù)據(jù)/指令選擇置為指令
  64.         P0=com;//送入數(shù)據(jù)
  65.         delay(1);
  66.         en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  67.         delay(1);
  68.         en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

  69. }


  70. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  71. {
  72.         rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  73.         P0=dat;//送入數(shù)據(jù)
  74.         delay(1);
  75.         en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  76.         delay(1);
  77.         en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  78. }
  79. //自定義字符集
  80. void Lcd_ram()      
  81. {
  82.         uint i,j,k=0,temp=0x40;
  83.         for(i=0;i<7;i++)
  84.         {
  85.            for(j=0;j<8;j++)
  86.            {
  87.             write_1602com(temp+j);
  88.             write_1602dat(num[k]);
  89.             k++;
  90.            }
  91.            temp=temp+8;
  92.         }
  93. }

  94. void lcd_init()//***液晶初始化函數(shù)****
  95. {
  96.         Lcd_ram();
  97.         write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
  98.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  99.         write_1602com(0x06);//整屏不移動,光標(biāo)自動右移
  100.         write_1602com(0x01);//清顯示

  101.         write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
  102.         for(a=0;a<16;a++)
  103.         {
  104.                 write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
  105.         }
  106.         write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
  107.         for(a=0;a<16;a++)
  108.         {
  109.                 write_1602dat(tab2[a]);//寫顯示固定符號
  110.         }
  111. }

  112. void display()
  113. {
  114.         //                        1km/h=100m/0.1h                   360s
  115.         //                        10km/h=100m/0.01h          36s
  116.         //                        100km/h=100m/0.001h  3.6s
  117.         if(Mode==0&&bike_set==0)
  118.         {
  119.                 //讀時間
  120.                         Ds1302_Read_Time();
  121.                         //顯示時間
  122.                         write_1602com(0x80);
  123.                         write_1602dat(0x30+time_buf1[1]/10);
  124.                         write_1602dat(0x30+time_buf1[1]%10);
  125.                         write_1602com(0x80+3);
  126.                         write_1602dat(0x30+time_buf1[2]/10);
  127.                         write_1602dat(0x30+time_buf1[2]%10);
  128.                         write_1602com(0x80+6);
  129.                         write_1602dat(0x30+time_buf1[3]/10);
  130.                         write_1602dat(0x30+time_buf1[3]%10);
  131.                         write_1602com(0x80+9);
  132.                         write_1602dat(0x30+time_buf1[4]/10);
  133.                         write_1602dat(0x30+time_buf1[4]%10);
  134.                         write_1602com(0x80+12);
  135.                         write_1602dat(0x30+time_buf1[5]/10);
  136.                         write_1602dat(0x30+time_buf1[5]%10);
  137.                         write_1602com(0x80+15);
  138.                         write_1602dat(time_buf1[7]-1);               

  139.                         if(before_sec!=time_buf1[6])
  140.                         {
  141.                                 before_sec=time_buf1[6];
  142.                                 write_1602com(0x80+11);
  143.                                 write_1602dat(':');
  144.                                 LED_SEC=1;
  145.                         }
  146.                         if(LED_SEC==0)
  147.                         {
  148.                                 write_1602com(0x80+11);
  149.                                 write_1602dat(' ');       
  150.                         }

  151.                         write_1602com(0x80+0x40);
  152.                         if(Mileage/1000000==0)
  153.                         write_1602dat(' ');
  154.                         else
  155.                         write_1602dat(0x30+Mileage/1000000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  156.                         if(Mileage%1000000/100000==0)
  157.                         write_1602dat(' ');
  158.                         else       
  159.                         write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  160.                         write_1602dat(0x30+Mileage%1000000%100000/10000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  161.                         write_1602com(0x80+0x40+4);
  162.                         write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  163.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  164.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  165.                         SETS();
  166.        
  167.                         write_1602com(0x80+0x40+10);
  168.                         write_1602dat(0x30+Velocity/10);
  169.                         write_1602dat(0x30+Velocity%10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  170.         }
  171.         else if(Mode!=0)
  172.         {
  173.                 switch(Mode)
  174.                 {
  175.                         case 1:       
  176.                                 write_1602com(0x80+0x40);//顯示固定符號寫入位置
  177.                                 for(a=0;a<16;a++)
  178.                                 {
  179.                                         write_1602dat(tab5[a]);//寫顯示固定符號
  180.                                 }
  181.                                 write_1602com(0x80+0x40+14);
  182.                                 write_1602dat(0x30+time_buf1[6]/10);
  183.                                 write_1602dat(0x30+time_buf1[6]%10);       
  184.                                 write_1602com(0x0F);         //打開閃爍
  185.                                 write_1602com(0x80+1);
  186.                                 break;                                                  
  187.                         case 2:
  188.                                 write_1602com(0x80+4);
  189.                                 break;
  190.                         case 3:
  191.                                 write_1602com(0x80+7);
  192.                                 break;
  193.                         case 4:
  194.                                 write_1602com(0x80+10);
  195.                                 break;
  196.                         case 5:
  197.                                 write_1602com(0x80+13);
  198.                                 break;
  199.                         case 6:
  200.                                 write_1602com(0x80+0x40+15);
  201.                                 break;
  202.                         case 7:
  203.                                 write_1602com(0x80+15);
  204.                                 break;
  205.                         case 8:
  206.                                 write_1602com(0x0c);
  207.                                 write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
  208.                                 for(a=0;a<16;a++)
  209.                                 {
  210.                                         write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
  211.                                 }
  212.                                 write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
  213.                                 for(a=0;a<16;a++)
  214.                                 {
  215.                                         write_1602dat(tab2[a]);//寫顯示固定符號
  216.                                 }
  217.                                 break;
  218.                 }
  219.         }
  220.         else if(bike_set!=0)
  221.         {
  222.                 switch(bike_set)
  223.                 {
  224.                         case 1:       
  225.                                 write_1602com(0x80);//顯示固定符號寫入位置
  226.                                 for(a=0;a<16;a++)
  227.                                 {
  228.                                         write_1602dat(tab3[a]);//寫顯示固定符號
  229.                                 }
  230.                                 write_1602com(0x80+0x40);//顯示固定符號寫入位置
  231.                                 for(a=0;a<16;a++)
  232.                                 {
  233.                                         write_1602dat(tab4[a]);//寫顯示固定符號
  234.                                 }
  235.                                 write_1602com(0x80+12);
  236.                                 write_1602dat(0x30+RADIUS/10);                   //車輪半徑
  237.                                 write_1602dat(0x30+RADIUS%10);
  238.                                 write_1602com(0x80+0x40+10);
  239.                                 write_1602dat(0x30+SAFE_SPEED/10);                   //安全速度
  240.                                 write_1602dat(0x30+SAFE_SPEED%10);       
  241.                                 write_1602com(0x0F);         //打開閃爍
  242.                                 write_1602com(0x80+13);
  243.                                 break;                                                  
  244.                         case 2:
  245.                                 write_1602com(0x80+0x40+11);
  246.                                 break;
  247.                         case 3:
  248.                                 write_1602com(0x0c);
  249.                                 write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
  250.                                 for(a=0;a<16;a++)
  251.                                 {
  252.                                         write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
  253.                                 }
  254.                                 write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
  255.                                 for(a=0;a<16;a++)
  256.                                 {
  257.                                         write_1602dat(tab2[a]);//寫顯示固定符號
  258.                                 }
  259.                                 break;
  260.                 }
  261.         }       
  262. }

  263. void KEY()
  264. {       
  265.         if(bike_set==0&&K1==0)
  266.         {
  267.                 delay(20);
  268.                 if(bike_set==0&&K1==0)
  269.                 {
  270.                         BEEP=0;
  271.                         delay(50);
  272.                         BEEP=1;
  273.                         Mode++;
  274.                         display();
  275.                         if(Mode>=8)
  276.                         {
  277.                                 Mode=0;
  278.                                 Ds1302_Write_Time();
  279.                         }
  280.                 }
  281.                 while(bike_set==0&&K1==0);
  282.         }
  283.         if(K4==0&&Mode==0)
  284.         {
  285.                 delay(20);
  286.                 if(K4==0&&Mode==0)
  287.                 {
  288.                         BEEP=0;
  289.                         delay(50);
  290.                         BEEP=1;
  291.                         bike_set++;
  292.                         display();
  293.                         if(bike_set>=3)
  294.                         {
  295.                                 bike_set=0;
  296.                                 SETS();
  297.                         }
  298.                 }
  299.                 while(Mode==0&&K4==0);
  300.         }

  301.         //+
  302.         if(K2==0&&(Mode!=0||bike_set!=0))
  303.         {
  304.                 delay(20);
  305.                 //調(diào)時
  306.                 if(K2==0&&(Mode!=0||bike_set!=0))
  307.                 {
  308.                         BEEP=0;
  309.                         delay(50);
  310.                         BEEP=1;       
  311.                         switch(Mode)
  312.                         {
  313.                                 case 1:
  314.                                         time_buf1[1]++;
  315.                                         if(time_buf1[1]>=100)
  316.                                                 time_buf1[1]=0;
  317.                                         write_1602com(0x80);
  318.                                         write_1602dat(0x30+time_buf1[1]/10);
  319.                                         write_1602dat(0x30+time_buf1[1]%10);
  320.                                         write_1602com(0x80+1);
  321.                                         break;
  322.                                 case 2:
  323.                                         time_buf1[2]++;
  324.                                         if(time_buf1[2]>=13)
  325.                                                 time_buf1[2]=1;
  326.                                         write_1602com(0x80+3);
  327.                                         write_1602dat(0x30+time_buf1[2]/10);
  328.                                         write_1602dat(0x30+time_buf1[2]%10);
  329.                                         write_1602com(0x80+4);
  330.                                         break;
  331.                                 case 3:
  332.                                         time_buf1[3]++;
  333.                                         if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
  334.                                                 time_buf1[3]=1;
  335.                                         write_1602com(0x80+6);
  336.                                         write_1602dat(0x30+time_buf1[3]/10);
  337.                                         write_1602dat(0x30+time_buf1[3]%10);
  338.                                         write_1602com(0x80+7);
  339.                                         break;
  340.                                 case 4:
  341.                                         time_buf1[4]++;
  342.                                         if(time_buf1[4]>=24)
  343.                                                 time_buf1[4]=0;
  344.                                         write_1602com(0x80+9);
  345.                                         write_1602dat(0x30+time_buf1[4]/10);
  346.                                         write_1602dat(0x30+time_buf1[4]%10);
  347.                                         write_1602com(0x80+10);
  348.                                         break;
  349.                                 case 5:
  350.                                         time_buf1[5]++;
  351.                                         if(time_buf1[5]>=60)
  352.                                                 time_buf1[5]=0;
  353.                                         write_1602com(0x80+12);
  354.                                         write_1602dat(0x30+time_buf1[5]/10);
  355.                                         write_1602dat(0x30+time_buf1[5]%10);
  356.                                         write_1602com(0x80+13);
  357.                                         break;
  358.                                 case 6:
  359.                                         time_buf1[6]++;
  360.                                         if(time_buf1[6]>=60)
  361.                                                 time_buf1[6]=0;
  362.                                         write_1602com(0x80+0x40+14);
  363.                                         write_1602dat(0x30+time_buf1[6]/10);
  364.                                         write_1602dat(0x30+time_buf1[6]%10);
  365.                                         write_1602com(0x80+0x40+15);
  366.                                         break;
  367.                                 case 7:
  368.                                         time_buf1[7]++;
  369.                                         if(time_buf1[7]>=8)
  370.                                                 time_buf1[7]=1;
  371.                                         write_1602com(0x80+15);
  372.                                         write_1602dat(time_buf1[7]-1);
  373.                                         write_1602com(0x80+15);
  374.                                         break;
  375.                         }
  376.                         switch(bike_set)
  377.                         {
  378.                                 case 1:
  379.                                         RADIUS++;
  380.                                         if(RADIUS>=71)
  381.                                         RADIUS=0;
  382.                                         write_1602com(0x80+12);
  383.                                         write_1602dat(0x30+RADIUS/10);
  384.                                         write_1602dat(0x30+RADIUS%10);
  385.                                         write_1602com(0x80+13);
  386.                                         break;
  387.                                 case 2:
  388.                                         SAFE_SPEED++;
  389.                                         if(SAFE_SPEED>=100)
  390.                                         SAFE_SPEED=0;
  391.                                         write_1602com(0x80+0x40+10);
  392.                                         write_1602dat(0x30+SAFE_SPEED/10);
  393.                                         write_1602dat(0x30+SAFE_SPEED%10);
  394.                                         write_1602com(0x80+0x40+11);
  395.                                         break;
  396.                         }
  397.                 }
  398.                 while(K2==0);
  399.         }

  400.         //-
  401.         if(K3==0&&(Mode!=0||bike_set!=0))
  402.         {
  403.                 delay(20);
  404.                 //調(diào)時
  405.                 if(K3==0&&(Mode!=0||bike_set!=0))
  406.                 {
  407.                         BEEP=0;
  408.                         delay(50);
  409.                         BEEP=1;
  410.                         switch(Mode)
  411.                         {
  412.                                 case 1:
  413.                                         time_buf1[1]--;
  414.                                         if(time_buf1[1]<0)
  415.                                                 time_buf1[1]=99;
  416.                                         write_1602com(0x80);
  417.                                         write_1602dat(0x30+time_buf1[1]/10);
  418.                                         write_1602dat(0x30+time_buf1[1]%10);
  419.                                         write_1602com(0x80+1);
  420.                                         break;
  421.                                 case 2:
  422.                                         time_buf1[2]--;
  423.                                         if(time_buf1[2]<=0)
  424.                                                 time_buf1[2]=12;
  425.                                         write_1602com(0x80+3);
  426.                                         write_1602dat(0x30+time_buf1[2]/10);
  427.                                         write_1602dat(0x30+time_buf1[2]%10);
  428.                                         write_1602com(0x80+4);
  429.                                         break;
  430.                                 case 3:
  431.                                         time_buf1[3]--;
  432.                                         if(time_buf1[3]<=0)
  433.                                                 time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
  434.                                         write_1602com(0x80+6);
  435.                                         write_1602dat(0x30+time_buf1[3]/10);
  436.                                         write_1602dat(0x30+time_buf1[3]%10);
  437.                                         write_1602com(0x80+7);
  438.                                         break;
  439.                                 case 4:
  440.                                         time_buf1[4]--;
  441.                                         if(time_buf1[4]<0)
  442.                                                 time_buf1[4]=23;
  443.                                         write_1602com(0x80+9);
  444.                                         write_1602dat(0x30+time_buf1[4]/10);
  445.                                         write_1602dat(0x30+time_buf1[4]%10);
  446.                                         write_1602com(0x80+10);
  447.                                         break;
  448.                                 case 5:
  449.                                         time_buf1[5]--;
  450.                                         if(time_buf1[5]<0)
  451.                                                 time_buf1[5]=59;
  452.                                         write_1602com(0x80+12);
  453.                                         write_1602dat(0x30+time_buf1[5]/10);
  454.                                         write_1602dat(0x30+time_buf1[5]%10);
  455.                                         write_1602com(0x80+13);
  456.                                         break;
  457.                                 case 6:
  458.                                         time_buf1[6]--;
  459.                                         if(time_buf1[6]<0)
  460.                                                 time_buf1[6]=59;
  461.                                         write_1602com(0x80+0x40+14);
  462.                                         write_1602dat(0x30+time_buf1[6]/10);
  463.                                         write_1602dat(0x30+time_buf1[6]%10);
  464.                                         write_1602com(0x80+0x40+15);
  465.                                         break;
  466.                                 case 7:
  467.                                         time_buf1[7]--;
  468.                                         if(time_buf1[7]<1)
  469.                                                 time_buf1[7]=7;
  470.                                         write_1602com(0x80+15);
  471.                                         write_1602dat(time_buf1[7]-1);
  472.                                         write_1602com(0x80+15);
  473.                                         break;
  474.                         }
  475.                         switch(bike_set)
  476.                         {
  477.                                 case 1:
  478.                                         RADIUS--;
  479.                                         if(RADIUS<0)
  480.                                         RADIUS=70;
  481.                                         write_1602com(0x80+12);
  482.                                         write_1602dat(0x30+RADIUS/10);
  483.                                         write_1602dat(0x30+RADIUS%10);
  484.                                         write_1602com(0x80+13);
  485.                                         break;
  486.                                 case 2:
  487.                                         SAFE_SPEED--;
  488.                                         if(SAFE_SPEED<0)
  489.                                         SAFE_SPEED=99;
  490.                                         write_1602com(0x80+0x40+10);
  491.                                         write_1602dat(0x30+SAFE_SPEED/10);
  492.                                         write_1602dat(0x30+SAFE_SPEED%10);
  493.                                         write_1602com(0x80+0x40+11);
  494.                                         break;
  495.                         }
  496.                 }
  497.                 while(K3==0);
  498.         }       
  499.         if(K2==0&&K3==0&&Mode==0&bike_set==0)
  500.         {
  501.                 BEEP=0;
  502.                 delay(100);
  503.                 BEEP=1;
  504.                 delay(100);
  505.                 BEEP=0;
  506.                 delay(100);
  507.                 BEEP=1;
  508.                 delay(100);
  509.                 Mileage=0;
  510.                 SETS();
  511.                 while(K2==0&&K3==0);
  512.         }
  513. }
  514. void BJ_SAFE()
  515. {
  516.         if(Velocity>SAFE_SPEED)
  517.         {
  518.                 BEEP=0;
  519.         }
  520.         else
  521.         {
  522.                 BEEP=1;
  523.         }
  524. }

  525. void main()
  526. {
  527.         //初始化
  528.         Ds1302_Init();
  529.         lcd_init();
  530.         initeeprom();
  531.         //讀取初始參數(shù)
  532.         READS();
  533.         //定時器初始化
  534. //        InitTimer0();
  535.         init();
  536.         lcd_init();
  537.         before_sec=time_buf1[6];
  538.         while(1)
  539.         {
  540.                 if(Mode==0&&bike_set==0)
  541.                 {
  542.                         display();
  543.                         BJ_SAFE();
  544.                 }
  545.                 KEY();
  546.         }
  547. }

  548. void EXINT0() interrupt 0
  549. {
  550.         count++;
  551. }

  552. void time0() interrupt 1
  553. {
  554.         uchar m,n;
  555.         TH0=0x3c;
  556.         TL0=0xb0;         //50ms
  557.         m++;
  558.         if(LED_SEC==1)
  559.         {
  560.                 n++;
  561.                 if(n>=10)
  562.                 {
  563.                         n=0;
  564.                         LED_SEC=0;
  565.                 }
  566.         }
  567.        
  568.         if(m>=10)
  569.         {
  570.                 m=0;
  571.                 Mileage=Mileage+10*(Velocity/3.6)/2;                 //里程m=里程+速度km/h/3.6/2
  572.                 Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;//將500ms的距離經(jīng)過運算得到km/h,將速度/100,方便顯示
  573.                 count=0;       
  574.         }
  575. }

  576. //讀初值
  577. void READS()
  578. {
  579.         uchar Mileage_H,Mileage_M,Mileage_L;
  580.         delay(10);
  581.         RADIUS=read_add(0x01);
  582.         delay(10);
  583.         SAFE_SPEED=read_add(0x02);

  584.         delay(10);
  585.         Mileage_H=read_add(0x03);
  586.         delay(10);
  587.         Mileage_M=read_add(0x04);
  588.         delay(10);
  589.         Mileage_L=read_add(0x05);

  590.         Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
  591. }


  592. //寫初值
  593. void SETS()
  594. {
  595.         delay(10);
  596.         write_add(0x01,RADIUS);
  597.         delay(10);
  598.         write_add(0x02,SAFE_SPEED);

  599. /*        Mileage_H=Mileage/10000;                         //123.4560
  600.         Mileage_M=Mileage%10000/100;
  601.         Mileage_L=Mileage%10000%100; */
  602.         delay(10);
  603.         write_add(0x03,Mileage/100000);
  604.         delay(10);
  605.         write_add(0x04,Mileage%100000/1000);
  606.         delay(10);
  607.         write_add(0x05,Mileage%100000%1000/10);
  608. }
復(fù)制代碼

作者: lemonack    時間: 2016-9-8 16:12
謝謝,我要做個實物出來
作者: basa1356    時間: 2016-9-10 10:15
好厲害
作者: zhaoqing    時間: 2016-9-12 16:07
十分感謝,拿來用了
作者: lemonack    時間: 2016-10-3 09:04
正在做實物,不知能不能用
作者: 百風(fēng)丶    時間: 2017-3-2 00:15
lemonack 發(fā)表于 2016-10-3 09:04
正在做實物,不知能不能用

朋友,這個你做出實物來了么?
作者: lehigh    時間: 2017-3-14 15:34
非常不錯的設(shè)計
作者: CYQ-1011    時間: 2017-4-18 19:31
大神好,我想問問這個速度和里程的代碼具體可以解釋一下嗎  沒看懂


if(m>=10)
        {
                m=0;
                Mileage=Mileage+10*(Velocity/3.6)/2;                 //里程m=里程+速度km/h/3.6/2
                Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;//將500ms的距離經(jīng)過運算得到km/h,將速度/100,方便顯示
                count=0;        
        }
}
作者: CYQ-1011    時間: 2017-4-18 19:57
CYQ-1011 發(fā)表于 2017-4-18 19:31
大神好,我想問問這個速度和里程的代碼具體可以解釋一下嗎  沒看懂

主要是后面的  40   怎么來的
作者: huaruolong    時間: 2017-5-18 00:13
先看看,謝謝樓主分享
作者: huaruolong    時間: 2017-5-18 00:18
先看看,謝謝樓主分享
作者: YJ199585    時間: 2017-5-22 14:23
想對里程數(shù)清零怎么辦呢
作者: llllll000    時間: 2017-5-23 15:38
CYQ-1011 發(fā)表于 2017-4-18 19:57
主要是后面的  40   怎么來的

同求 大神可以解釋一下嗎
作者: 784306619    時間: 2017-5-31 17:12
哪位大神有這個運行狀態(tài)下的仿真圖,求幫助,要圖片,截圖就好,(那個液晶顯示器至少要有顯示數(shù)字,證明可行性。)
作者: 邱哥    時間: 2017-11-9 18:38
真好感覺還不錯
作者: 邱哥    時間: 2017-11-9 18:43
lemonack 發(fā)表于 2016-9-8 16:12
謝謝,我要做個實物出來

你好,可以請你幫忙把這個自行車?yán)锍唐鞯姆抡孳浖l(fā)一下么?1165939860QQ.COM
作者: yilinghai    時間: 2017-11-10 16:43
親測能用,仿真圖如下

搜狗截圖20171110163625.jpg (507.66 KB, 下載次數(shù): 177)

搜狗截圖20171110163625.jpg

作者: faridzled    時間: 2017-11-14 19:07
thanks for sharing
作者: HaiLJ001    時間: 2017-11-27 16:31
如果做成實物的話,怎么添加信號源呢

作者: clodow    時間: 2017-12-18 16:38
剛好需要啊!
作者: xpxh    時間: 2018-3-5 17:29
感謝分享
作者: SAKURA96    時間: 2018-3-7 23:08
admin 發(fā)表于 2016-9-7 23:43
下面是主程序:

大神,請問子程序在哪里啊
作者: SAKURA96    時間: 2018-3-8 08:50
YJ199585 發(fā)表于 2017-5-22 14:23
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

請問你找到清零的方法了么?
作者: SAKURA96    時間: 2018-3-8 08:50
請問如何里程如何清零
作者: SAKURA96    時間: 2018-3-8 12:46
lemonack 發(fā)表于 2016-10-3 09:04
正在做實物,不知能不能用

請問你實物做出來了么,可以交流一下嗎
作者: SAKURA96    時間: 2018-3-8 12:48
yilinghai 發(fā)表于 2017-11-10 16:43
親測能用,仿真圖如下

請問一下這個里程表如何清零啊,然后能做實物出來嗎
作者: SAKURA96    時間: 2018-3-8 12:48
xpxh 發(fā)表于 2018-3-5 17:29
感謝分享


請問如何里程表如何清零,然后怎么做實物啊
作者: Amor-Cupid    時間: 2018-3-8 14:58
太棒啦。學(xué)到很多,加油。
作者: a422714088    時間: 2018-3-13 17:44

如果做成實物的話,怎么添加信號源呢  就是把這塊板子放去哪里才可以測速呢。。。
作者: 徐某某    時間: 2018-5-7 11:00
yilinghai 發(fā)表于 2017-11-10 16:43
親測能用,仿真圖如下

兄弟,把仿真圖發(fā)我下吧

作者: 徐某某    時間: 2018-5-7 11:01
yilinghai 發(fā)表于 2017-11-10 16:43
親測能用,仿真圖如下

仿真軟件發(fā)我下吧

作者: 徐某某    時間: 2018-5-7 16:00
百風(fēng)丶 發(fā)表于 2017-3-2 00:15
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

朋友,實物做出來沒,能用不

作者: 徐某某    時間: 2018-5-7 16:01
lemonack 發(fā)表于 2016-9-8 16:12
謝謝,我要做個實物出來

朋友,實物做出來了嗎
作者: duhangke    時間: 2018-5-14 12:11
樓主棒棒噠,
作者: denminshen    時間: 2018-6-19 23:38
樓主朋友你好,請問這句;Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;后面的  40   是怎么來的???
作者: tieq1952    時間: 2018-6-23 07:42
謝謝,學(xué)習(xí)了
作者: woojoon1981    時間: 2018-6-23 17:57
謝謝分享
作者: denminshen    時間: 2018-6-24 00:19
終于弄明白了,那個除以40是樓主隨便寫的樣,我沒有要,參考樓主朋友的程序,我打算用在電動車?yán)锍瘫砩,所以將安全速度改成了加脈沖個數(shù)設(shè)置了,使每圈的磁極脈沖個數(shù)與輪半徑都參與里程與速度關(guān)連了,仿真沒有問題了等有空做個實物出來試試看到底行不行了。
if(m>=10)
        {
                m=0;
               
                Mileage=Mileage+count*2*3.14*RADIUS/maicong/10;//里程數(shù)mileage=里程+記數(shù)值*輪周長/每圈磁極對數(shù)/10
                Velocity=count *2*3.14*RADIUS/maicong/100000*2*3600 ;//velocity是速度,將500ms的距離經(jīng)過運算得到km/h,方便顯示
                count=0;       
        }
作者: hs88    時間: 2018-6-28 05:03
騙幣的,1062三個使能引腳都沒定義,它知道干嘛呢
作者: 1379310    時間: 2018-6-29 19:35
要是有各元器件的解釋和備注就完美了
作者: liyongan_1985    時間: 2018-10-26 11:28
程序從頭到尾認(rèn)真研究與學(xué)習(xí)了一下,就程序整體邏輯而言,個人以為還是不錯的,但是其中有一處個人以為還可以進(jìn)一步優(yōu)化,其中正常顯示的邏輯中,關(guān)于里程的存儲處理函數(shù)SETS();,放在if(Mode==0&&bike_set==0)中,具體見下屬函數(shù),會導(dǎo)致里程存儲過于頻繁,對于FLASH是一種考驗,又因為本程序的邏輯中,測速計算處于定時器中斷中,每隔500ms才計算一次速度及里程數(shù)據(jù),所以更沒有必要那么頻繁的存儲里程數(shù)據(jù)。還有其中的/40注釋沒有說明,其實我以為就是前面別人所說的磁極脈沖數(shù)。個人見解歡迎批評指正,謝謝。
if(Mode==0&&bike_set==0)//正常顯示模式
        {
                //讀時間
                        Ds1302_Read_Time();
                        //顯示時間
                        write_1602com(0x80);
                        write_1602dat(0x30+time_buf1[1]/10);
                        write_1602dat(0x30+time_buf1[1]%10);
                        write_1602com(0x80+3);
                        write_1602dat(0x30+time_buf1[2]/10);
                        write_1602dat(0x30+time_buf1[2]%10);
                        write_1602com(0x80+6);
                        write_1602dat(0x30+time_buf1[3]/10);
                        write_1602dat(0x30+time_buf1[3]%10);
                        write_1602com(0x80+9);
                        write_1602dat(0x30+time_buf1[4]/10);
                        write_1602dat(0x30+time_buf1[4]%10);
                        write_1602com(0x80+12);
                        write_1602dat(0x30+time_buf1[5]/10);
                        write_1602dat(0x30+time_buf1[5]%10);
                        write_1602com(0x80+15);
                        write_1602dat(time_buf1[7]-1);               

                        if(before_sec!=time_buf1[6])//:顯示周期為1s,500ms顯示:500ms顯示空
                        {
                                before_sec=time_buf1[6];
                                write_1602com(0x80+11);
                                write_1602dat(':');
                                LED_SEC=1;
                        }
                        if(LED_SEC==0)
                        {
                                write_1602com(0x80+11);
                                write_1602dat(' ');       
                        }

                        write_1602com(0x80+0x40);//顯示固定符號寫入位置,從2行第2個位置后開始顯示
                        if(Mileage/1000000==0)
                        write_1602dat(' ');
                        else
                        write_1602dat(0x30+Mileage/1000000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        if(Mileage%1000000/100000==0)
                        write_1602dat(' ');
                        else       
                        write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000/10000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        write_1602com(0x80+0x40+4);
                        write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
                        SETS();
       
                        write_1602com(0x80+0x40+10);
                        write_1602dat(0x30+Velocity/10);
                        write_1602dat(0x30+Velocity%10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
        }
作者: chenxiaoya    時間: 2018-10-29 22:35
給力 學(xué)習(xí)學(xué)習(xí)
作者: Dremt    時間: 2018-11-1 20:45
版主能否解釋一下里面的參數(shù)

Mileage=Mileage+10*(Velocity/3.6)/2;                 //里程m=里程+速度km/h/3.6/2
Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;//將500ms的距離經(jīng)過運算得到km/h,將速度/100,方便顯示
作者: Dremt    時間: 2018-11-3 21:38
值得學(xué)習(xí)
作者: ky2020    時間: 2018-12-19 10:58
我正需要這個太感謝了  萬歲
作者: 雨過路猶在    時間: 2019-3-16 15:20
sec是什么功能??? 看不懂哎
作者: zsq12    時間: 2019-3-16 16:35
很好的分享,謝謝樓主
作者: 我的國兒    時間: 2019-6-1 00:57
denminshen 發(fā)表于 2018-6-24 00:19
終于弄明白了,那個除以40是樓主隨便寫的樣,我沒有要,參考樓主朋友的程序,我打算用在電動車?yán)锍瘫砩,?...

你好,能想你請教一些這個程序的相關(guān)問題嗎,謝謝了
作者: 我的國兒    時間: 2019-6-1 00:58
liyongan_1985 發(fā)表于 2018-10-26 11:28
程序從頭到尾認(rèn)真研究與學(xué)習(xí)了一下,就程序整體邏輯而言,個人以為還是不錯的,但是其中有一處個人以為還可 ...

你好 能想你請教一些關(guān)于這個程序的一些問題嗎  謝謝
作者: 我的國兒    時間: 2019-6-1 01:18
你好 ,可以想你請教一些相關(guān)問題嗎 謝謝
作者: 21qq    時間: 2019-7-6 11:09
是用的protel99嗎?怎么沒有pcb的源文件啊
作者: 21qq    時間: 2019-7-6 11:10
是用的protel99嗎,怎么沒找到pcb的源文件啊
作者: biglin0633    時間: 2019-11-13 09:44
yilinghai 發(fā)表于 2017-11-10 16:43
親測能用,仿真圖如下

為什么我下載后用不了啊求解
作者: biglin0633    時間: 2019-11-22 09:27
faridzled 發(fā)表于 2017-11-14 19:07
thanks for sharing

這個霍爾傳感器是怎么實現(xiàn)和單片機的連接呢  大佬
作者: biglin0633    時間: 2019-11-22 09:28
a422714088 發(fā)表于 2018-3-13 17:44
如果做成實物的話,怎么添加信號源呢  就是把這塊板子放去哪里才可以測速呢。。。

我也是不知道
作者: 圓滾滾的發(fā)燒友    時間: 2019-11-29 20:04
非常給力老鐵!
作者: 22583596    時間: 2019-12-1 15:09
希望樓主做一個摩托車智能防盜的
作者: 51黑電子會員    時間: 2020-3-23 21:55
denminshen 發(fā)表于 2018-6-24 00:19
終于弄明白了,那個除以40是樓主隨便寫的樣,我沒有要,參考樓主朋友的程序,我打算用在電動車?yán)锍瘫砩希?...

老兄  你那maichong是脈沖個數(shù)還是磁鋼個數(shù) ?為什么除以maichong?還要除以10?
作者: 精神小伙丿    時間: 2020-4-6 23:16
十分感謝分享,很受用

作者: bibibibiaaa    時間: 2020-4-28 15:44
liyongan_1985 發(fā)表于 2018-10-26 11:28
程序從頭到尾認(rèn)真研究與學(xué)習(xí)了一下,就程序整體邏輯而言,個人以為還是不錯的,但是其中有一處個人以為還可 ...

請問mode和bike set代表什么?我是小白看不懂求回答
作者: 江南云客    時間: 2020-6-21 09:08
多謝,幫大忙了。
作者: 江南云客    時間: 2020-6-21 09:44
請問一下那個源程序復(fù)制到Keil4里編譯不成功呀?
作者: Cbing901    時間: 2020-6-23 22:49
admin 發(fā)表于 2016-9-7 23:43
下面是主程序:

找到寶了,切換能切換到初始模式嗎

作者: 我還以為我很強    時間: 2020-6-30 01:15
仿真測試不是從0開始計里程數(shù)的,從何修改?
作者: ftaimf    時間: 2020-12-15 19:08
您好,想問一下,這個pcb文件打開后與您的pcb截圖不一樣
作者: yyght    時間: 2020-12-28 13:51
感謝樓主的分享。收藏、值得學(xué)習(xí)
作者: akaichan    時間: 2021-3-24 14:29
跟樓主好好學(xué)習(xí)
作者: 195414    時間: 2021-4-13 16:13
CYQ-1011 發(fā)表于 2017-4-18 19:31
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

能把文件分享一下嗎

作者: asd阿斯頓    時間: 2021-5-13 20:14
里程表怎么清零

作者: 芙蓉焊料    時間: 2022-8-22 12:31
請問查看原理圖用什么軟件?
作者: yhryhryhryyy    時間: 2023-5-7 14:51
幫助很大,希望繼續(xù)出帖子!嘿嘿




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1