wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24097|回復: 8
打印 上一主題 下一主題
收起左側

51單片機避障智能小車原理圖和源程序資料

  [復制鏈接]
跳轉到指定樓層
樓主
避障智能小車電路原理圖如下:


單片機源程序如下:
  1. 附錄B
  2. 按照預定的功能,系統實現預定的功能的程序如下所示:

  3. #include <intrins.h>                                                 
  4. #include <AT89X52.h>
  5. /********************************************************************************\
  6. **                                                 宏定義區                                                                        **
  7. \********************************************************************************/

  8. /*-------------------------------  LCD模塊 ------------------------------------*/
  9. #define LCD_RW                          P2_6                                 //讀寫控制端
  10. #define LCD_RS                          P2_7                                        //數據命令選擇端
  11. #define LCD_E                           P2_5                                        //執行使能端
  12. #define LCD_Data                        P1                                          //P1口
  13. #define Write                                0x00                                        //低電平寫入
  14. #define Read                                0x01                                        //高電平讀出
  15. #define Data                                0x01                                        //高電平選擇數據
  16. #define Cmd                                0x00                                        //低電平選擇命令

  17. #define Enable                        0x00                                        //躍變到低電平時執行命令
  18. #define Disable                        0x01   
  19. #define True                                0x01
  20. #define False                                0x00
  21. #define LCD_Init                        0x38                                        //初始化模式                                                       
  22. #define LCD_DispCtr                    0x0C                                        //開顯示及光標設置
  23. #define LCD_CloseCtr                0x08                                        //關顯示
  24. #define LCD_CLS                        0x01                                        //清屏幕
  25. #define LCD_EnterSet                   0x06                                        //顯示光標
  26. #define Busy                                P1_7                                        //忙信號

  27. /*--------------------------  測速/測距/測時模塊 -------------------------------*/
  28. #define CircleLength                0.132                                //小車轉一輪的長度為.132m

  29. /*--------------------------------  控速模塊 -----------------------------------*/
  30. #define P03                                P0_3                                           //后電機
  31. #define P04                                P0_4                                          //后電機
  32. #define P01                                  P0_1                                           //前電機
  33. #define P02                                P0_2                                           //前電機
  34. #define P31                                P0_5                               //控制液晶背光
  35. #define P33                                P3_3

  36. /*------------------------------  菜單選擇模塊        ---------------------------------*/
  37. #define Line                                0x00                                        //0代表直線模式
  38. #define Curve                                0x01                                        //1代表S型模式
  39. #define Normal                        0x00                                        //0 代表正常速度
  40. #define Low                                0x01                                        //1 代表低速
  41. #define High                                0x02                                        //2 代表高速
  42. /*********************************************************************************\
  43. **                                                          全局函數聲明區                                                        **
  44. \*********************************************************************************/
  45. /*-------------------------------  LCD模塊 -------------------------------------*/
  46. void LCDInit(void);                                                                //LCD初始化
  47. void SetWriteCmd(void);                                                                //設置寫命令模式
  48. void SetReadCmd(void);                                                                //設置讀命令模式
  49. void SetWriteData(void);                                                        //設置寫數據模式
  50. void WriteCmd(char cmd);                                                        //寫命令
  51. void WriteData(char ddata);                                                        //寫數據
  52. void ExecuteCmd(void);                                                                //執行命令
  53. void SetXY(char x,char y);                                                        //定位顯示地址
  54. void DisplaySingleChar(char x,char y,char cchar);                //顯示單個字符
  55. void DisplayString(char x,char y,char *str);                         //顯示一段字符串
  56. void Delay(unsigned int time);                                                //延時主程序
  57. void DelayUs(unsigned int time);                                                //延時子程序
  58. bit  IsBusy(void);                                                                        //判斷忙標志函數
  59. void DisplayTime(void);                                                                //顯示時間
  60. void DisplayAVGSpeed(void);                                                        //顯示平均速度
  61. void DisplayDistance(void);                                                        //顯示路程

  62. /*--------------------------  測速/測距/測時模塊 -------------------------------*/                                                
  63. void INTInit(void);                                                          //所有中斷初始化
  64. void SpeedINT(void);                                                                   //測速中斷
  65. void ComputeTime(void);
  66. void ComputeSpeedANDDistance(void);                                        //計算速度和距離

  67. /*--------------------------------  控速模塊 -----------------------------------*/
  68. void CtrSpeedINT(void);                                                     //控速中斷
  69. void Time0INT(void);          
  70. void Time1INT(void);                                                               //控速單位時間中斷
  71. void Clock0_Init(void);                                                                //時鐘中斷初始化
  72. void Clock1_Init(void);                                                        //時鐘中斷初始化
  73. void CtrSpeed(void);

  74. /********************************************************************************\
  75. **                                             全局變量區                                                                        **
  76. \********************************************************************************/

  77. float  SpeedCount = 0;                                                              //測速計數脈沖
  78. float  Speed = 0.0;                                                       
  79. float  Distance = 0.0;                                        
  80. char   Time1INTCount=0;                                                                //T1中斷時間計時
  81. float  PassTime=0.00;                                                                //小車行走的時間
  82. short  IsT0INT=1;                                                                       
  83. bit           IsT1INT;                                                                        //判斷T1是否已經響應中斷
  84. short  IsT0INT2=1;

  85. char   Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff};                                    //3ms,3ms,15ms,3ms
  86. char   Tlx[5]={0x48,0x48,0x68,0x48,0xff};                       
  87. char   Thx0=0xd8;
  88. char   Tlx0=0xf0;
  89. char   Thx1=0xb1;                                                                         //20ms
  90. char   Tlx1=0xe0;


  91. short  Round=0;
  92. short  Back=0;
  93. short  Back0=0;
  94. bit    Backid;
  95. bit    Stop=0;

  96. char   Area0=0;
  97. char   Area1=0;                                                                        //區域變量

  98. char   LowSpeedArea1StartTime;
  99. char   LowSpeedArea1EndTime;
  100. char   HighSpeedAreaEndTime;
  101. char   LowSpeedArea2EndTime;
  102. char   LowSpeedArea1PassTime=0;                                                 //第一個低速區通過時間
  103. char   HighSpeedAreaPassTime=0;                                                //高速區通過時間
  104. char   LowSpeedArea2PassTime=0;                                                //第二個低速區通過時間
  105. char   ReadyToGo=4;                                                                //倒計時

  106. char   flag;
  107. bit    Roundid=0;
  108. char   Nocurve=0;
  109. char   ChangeFlag;
  110. char   Mode;

  111. bit    Running;
  112. bit    SelectedAll;                                                                //模式和速度是否選擇完畢標志
  113. bit          IsSelectingMode;                                                                //模式選擇標志
  114. bit          IsSelectingSpeed;                                                        //速度選擇標志
  115. bit    ModeSelected;                                                                //已經被選擇的模式標志
  116. char   SelectedMode=10;                                                                //模式選擇是否完畢標志
  117. bit    Next;                                                                                //Next鍵標志
  118. bit    SpeedSelected;                                                                //已經被選中的速度方案標志
  119. char   SelectedSpeed;                                                                //速度選擇是否完畢標志

  120. bit    ChoosingDisplay;                                                                //人工選擇菜單開始標志
  121. bit    SelectedShow;                                                                //顯示選擇標志
  122. bit          SelectedReturn;                                                                //返回選擇標志
  123. bit    Selected;                                                                        //確定/返回鍵選擇標志
  124. bit    ReturnSelection;                                                                //返回鍵啟用標志
  125. bit    AVGSpeedShow;                                                                //平均速度顯示標志
  126. bit    TotalDistanceShow;                                                        //總路程顯示標志
  127. bit    ReturnMain;                                                                        //返回主菜單標志

  128. bit    AutoDisplay;                                                                //自動顯示標志
  129. bit    GoToChoosingDisplay;                                                        //人工選擇標志

  130. bit    AutoMode=0;
  131. char   PassLineID=0;
  132. char   PassLine=0;
  133. float  PrepareDistance;
  134. float  FirstDistance;
  135. float  SecondDistance;
  136. float  ThirdDistance;
  137. int    FirstHigh;
  138. int    SecondHigh;
  139. int    ThirdHigh;
  140. float  Rate=1.25;                                                                   //5ms時的速度
  141. float  Count=4;                                                                        //時間的倍數




  142. /********************************************************************************\
  143. **                                             全局函數實現區                                                        **
  144. \********************************************************************************/

  145. /*--------------------------------        主函數 ------------------------------------*/
  146. void main()
  147. {       
  148.     P01=0;
  149.         P02=0;
  150.         P03=0;
  151.         P04=0;
  152.         P31=1;                                                                                        //單片機復位,背光開

  153.         Delay(40);                                                                                //延時等待LCD啟動
  154.         LCDInit();                                                                                //初始化LCD
  155.         DisplayString(0x0,0,"  Starting...  ");
  156.         DisplayString(0x0,1,"Designed By 202");
  157.         Delay(300);
  158.         WriteCmd(LCD_CLS);
  159.                                                        
  160.         EA=1;                                                                                          //開總中斷
  161.         EX0=1;                                                                                        //開INT0中斷
  162.         IT0=1;                                                                                        //INTO邊沿觸發
  163.         EX1=1;                                                                                     //開INT1中斷
  164.         IT1=1;                                                                                         //INT1邊沿觸發       

  165.         SelectedAll=False;                                                                       //開始模式和速度選擇
  166.        
  167.         /*------------------------------  模式選擇 ---------------------------------*/
  168.         DisplayString(0x0,0,"Choose The Mode ");
  169.         DisplayString(0x0,1,"you want.       ");
  170.         Delay(50);
  171.         WriteCmd(LCD_CLS);
  172.        
  173.         IsSelectingMode=True;
  174.         while(1)
  175.         {                                                                                                  
  176.                 WriteCmd(LCD_CLS);
  177.                 DisplayString(0x0,0,"   Line Mode   ");
  178.                 DisplayString(0x0,1,"Next        Yes");

  179.                 Delay(300);                                                                //延時消除抖動

  180.                 while (1)                                                                           //不斷檢測中斷,直到按確定鍵或是NEXT鍵
  181.                 {
  182.                         if (Next==True)                                                //如果按Next鍵則直接跳出
  183.                                 break;
  184.                         if (ModeSelected==True)                                        //如果按確定鍵則設置模式為Line并跳出
  185.                         {       
  186.                                 SelectedMode=Line;
  187.                                 break;
  188.                         }                                                                        //如果什么鍵都沒有按下,那么一直顯示等待
  189.                 }

  190.                 if (ModeSelected==True)                                                //按下了確定鍵,退出模式選擇       
  191.                 {       
  192.                         IsSelectingMode=False;
  193.                         break;
  194.                 }
  195.                 if (Next==True)                                                        //按下了Next鍵,顯示下一個菜單項
  196.                 {
  197.                         Next=False;
  198.                         WriteCmd(LCD_CLS);
  199.                         DisplayString(0x0,0,"  Curve Mode   ");
  200.                         DisplayString(0x0,1,"Next        Yes");                       
  201.                        
  202.                         Delay(300);                                                        //延時消除抖動

  203.                         while(1)                                                                //不斷檢測中斷,直到按確定鍵或是Next鍵
  204.                     {
  205.                                 if (Next==True)                                        //如果再一次按下Next鍵,則跳出
  206.                                         break;
  207.                                 if (ModeSelected==True)                        //如果按下確定鍵,則設置模式為Curve,并跳出
  208.                                 {
  209.                                         SelectedMode=Curve;
  210.                                         break;
  211.                                 }
  212.                         }
  213.                 }
  214.             
  215.                 if (ModeSelected==True)                                            //按下了確定鍵,退出模式選擇
  216.                 {
  217.                         IsSelectingMode=False;
  218.                         break;
  219.                 }

  220.                 if (Next==True)                                                        //再一次按下了Next鍵,則循環模式選擇
  221.                 {
  222.                         Next=False;
  223.                         WriteCmd(LCD_CLS);
  224.                         DisplayString(0x0,0,"    AutoMode    ");
  225.                         DisplayString(0x0,1,"Next         Yes");

  226.                         Delay(300);                                                    //延時消除抖動

  227.                         while(1)
  228.                         {
  229.                                 if (Next==True)
  230.                                         break;
  231.                                 if (ModeSelected==True)
  232.                                 {
  233.                                         AutoMode=1;
  234.                                         break;       
  235.                                 }
  236.                         }
  237.                 }

  238.                 if (ModeSelected==True)
  239.                 {
  240.                         IsSelectingMode=False;
  241.                         break;
  242.                 }

  243.                 if (Next==True)
  244.                 {
  245.                         Next=False;
  246.                         continue;
  247.                 }
  248.         }
  249.        
  250.         Delay(50);
  251.         WriteCmd(LCD_CLS);   
  252.        
  253.         /*------------------------------  速度選擇 ---------------------------------*/
  254.         if (SelectedMode==Line && AutoMode==0)
  255.         {
  256.                 DisplayString(0x0,0,"  Now Choose a  ");
  257.                 DisplayString(0x0,1,"  kind of Speed ");
  258.                 Delay(50);
  259.                 WriteCmd(LCD_CLS);
  260.                
  261.                 IsSelectingSpeed=True;
  262.                 while(1)                                                                                       
  263.                 {
  264.                         WriteCmd(LCD_CLS);
  265.                         DisplayString(0x0,0," Normal Speed   ");
  266.                         DisplayString(0x0,1,"Next         Yes");

  267.                         Delay(300);                                                         //延時消除抖動
  268.                        
  269.                         while(1)
  270.                         {
  271.                                 if (Next==True)                                         //如果按Next鍵則直接跳出
  272.                                         break;
  273.                                 if (SpeedSelected==True)                      //如果按確定鍵則設置速度為Normal并跳出
  274.                                 {       
  275.                                         Thx[0]=0xec;Tlx[0]=0x78;                  //5ms
  276.                                         Thx[1]=0xf0;Tlx[1]=0x60;                  //4ms
  277.                                         Thx[2]=0x8a;Tlx[2]=0xd0;                   //30ms
  278.                                         Thx[3]=0xf4;Tlx[3]=0x48;              //3ms
  279.                                         SelectedSpeed=Normal;
  280.                                         break;
  281.                                 }                                                                 //如果什么鍵都沒有按下,那么一直顯示等待                       
  282.                         }
  283.        
  284.                         if (SpeedSelected==True)                                  //按下了確定鍵,退出速度選擇       
  285.                         {       
  286.                                 IsSelectingSpeed=False;
  287.                                 break;
  288.                         }
  289.        
  290.                         if (Next==True)
  291.                         {
  292.                                 Next=False;
  293.                                 WriteCmd(LCD_CLS);
  294.                                  DisplayString(0x0,0,"   Low  Speed   ");
  295.                                 DisplayString(0x0,1,"Next         Yes");
  296.                                
  297.                                 Delay(300);                                             //延時消除抖動

  298.                                 while(1)
  299.                                 {
  300.                                         if (Next==True)                                //如果再一次按下Next鍵,則跳出
  301.                                                 break;
  302.                                         if (SpeedSelected==True)                //如果按下確定鍵,則設置速度為Low,并跳出
  303.                                         {       
  304.                                                 SelectedSpeed=Low;                        //這里沒有速度設置,因為默認速度就是Low
  305.                                                 break;
  306.                                         }                               
  307.                                 }                       
  308.                         }
  309.        
  310.                         if (SpeedSelected==True)                                //按下了確定鍵,退出速度選擇
  311.                         {
  312.                                 IsSelectingSpeed=False;
  313.                                 break;
  314.                         }
  315.        
  316.                         if (Next==True)
  317.                         {
  318.                                 Next=False;
  319.                                 WriteCmd(LCD_CLS);
  320.                                 DisplayString(0x0,0,"  High  Speed   ");
  321.                                 DisplayString(0x0,1,"Next         Yes");

  322.                                 Delay(300);                                         //延時消除抖動
  323.        
  324.                                 while(1)
  325.                                 {
  326.                                         if (Next==True)                         //如果再一次按下Next鍵,則跳出
  327.                                                 break;
  328.                                         if (SpeedSelected==True)         //如果按下確定鍵,則設置速度為High,并跳出
  329.                                         {
  330.                                                 Thx[0]=0xe0;Tlx[0]=0xc0; //8ms
  331.                                                 Thx[1]=0xe0;Tlx[1]=0xc0;  //8ms
  332.                                             Thx[2]=0x63;Tlx[2]=0xc0;  //40ms
  333.                                             Thx[3]=0xec;Tlx[3]=0x78;  //5ms
  334.                                                 SelectedSpeed=High;
  335.                                                 break;
  336.                                         }                               
  337.                                 }                       
  338.                         }
  339.        
  340.                         if (SpeedSelected==True)                                  //按下了確定鍵,退出速度選擇
  341.                         {
  342.                                 IsSelectingSpeed=False;
  343.                                 break;
  344.                         }
  345.        
  346.                         if (Next==True)                                           //再一次按下了Next鍵,則循環速度選擇
  347.                         {
  348.                                 Next=False;
  349.                                 continue;
  350.                         }
  351.        
  352.                 }
  353.         }

  354.         SelectedAll=True;                                 //標志模式選擇和速度選擇完畢
  355.        
  356.         Running=True;
  357.         Delay(50);
  358.         WriteCmd(LCD_CLS);

  359.        
  360.         /*-------------------------  顯示所選擇的模式和速度方案 -------------------------*/
  361.         if (SelectedMode==Line)
  362.         {       
  363.                 DisplayString(0x0,0,"Choosen Mode is ");
  364.                 DisplayString(0x0,1,"      Line      ");
  365.                 Delay(50);
  366.                 WriteCmd(LCD_CLS);
  367.         }
  368.         if (SelectedMode==Curve)
  369.         {
  370.                
  371.                 DisplayString(0x0,0,"Choosen Mode is ");
  372.                 DisplayString(0x0,1,"     Curve      ");
  373.                 Delay(50);
  374.                 WriteCmd(LCD_CLS);
  375.         }
  376.         if (AutoMode==1)
  377.         {
  378.                 DisplayString(0x0,0,"Choosen Mode is ");
  379.                 DisplayString(0x0,1,"    AutoMode    ");
  380.                 Delay(50);
  381.                 WriteCmd(LCD_CLS);
  382.         }                                  

  383.         if (SelectedMode==Line)
  384.         {
  385.                 if (SelectedSpeed==Normal)
  386.                 {
  387.                         DisplayString(0x0,0,"Choosen Speed is");
  388.                         DisplayString(0x0,1,"     Normal     ");
  389.                         Delay(50);
  390.                         WriteCmd(LCD_CLS);
  391.                 }
  392.        
  393.                 if (SelectedSpeed==Low)
  394.                 {
  395.                         DisplayString(0x0,0,"Choosen Speed is");
  396.                         DisplayString(0x0,1,"      Low       ");
  397.                         Delay(50);
  398.                         WriteCmd(LCD_CLS);
  399.                 }
  400.        
  401.                 if (SelectedSpeed==High)
  402.                 {
  403.                         DisplayString(0x0,0,"Choosen Speed is");
  404.                         DisplayString(0x0,1,"      High      ");
  405.                         Delay(50);
  406.                         WriteCmd(LCD_CLS);
  407.                 }
  408.         }

  409.         INTInit();                                                                                           //初始化所有中斷
  410.         DisplayString(0x0,0,"Left Times To Go");
  411.         while (ReadyToGo--)
  412.     {
  413.                 DisplaySingleChar(0x7,1,ReadyToGo+0x30);
  414.                 DisplaySingleChar(0x09,1,'s');
  415.                 Delay(300);               
  416.         }
  417.         WriteCmd(LCD_CLS);
  418.         DisplayString(0x05,0,"Go!!!");
  419.         Delay(100);
  420.         WriteCmd(LCD_CLS);
  421.         DisplayString(0x0,0,"   Living...   ");
  422.         DisplayString(0x0,1,"Designed by 202");

  423.        
  424.         if (SelectedMode==Line&&AutoMode==0)
  425.                 flag=Area0;
  426.         else
  427.             flag=1;
  428.        
  429.         while(flag<5)
  430.         {  
  431.                 if(AutoMode==1)                                                                          //自動模式
  432.             {
  433.                         switch(PassLineID)
  434.                     {
  435.                            case 0  :{
  436.                                                            if(IsT0INT==1)
  437.                                                                 {P01=P02=P04=0;P03=1;}             
  438.                                                          else
  439.                                                                {P01=P02=P03=P04=0;}               
  440.                                                 }break;
  441.                            case 1  :{
  442.                                       P01=P02=P03=0;P04=1;
  443.                                     }break;
  444.                            case 2  :{
  445.                                              P01=P02=P04=0;P03=1;             
  446.                                     }break;
  447.                            default :break;
  448.                     }
  449.                 }
  450.            else
  451.            {                       
  452.                         if(SelectedMode==Line)                                                      //直線模式
  453.                     {
  454.                                   flag=Area0;
  455.                                   if(IsT0INT==1)       
  456.                                       {P03=1;P04=0;P01=P02=0;}
  457.                             else
  458.                                         {P03=0;P04=0;P01=P02=0;}
  459.                     }
  460.                            else                                                                          
  461.                     {                                                                                       //S型模式
  462.                                  if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0)
  463.                               {
  464.                                             if(Backid==1)
  465.                                              {P01=1;P02=0;P03=0;P04=1;}
  466.                                           else
  467.                                           {P01=0;P02=1;P03=0;P04=1;}
  468.                                       Back=1;           
  469.                           }          
  470.                                   else
  471.                               {
  472.                                             if(Round==0)
  473.                                           {
  474.                                                      if(IsT0INT2==1)
  475.                                                         {P01=0;P02=0;P03=1;P04=0;}
  476.                                                else
  477.                                                         {P01=0;P02=0;P03=0;P04=0;}
  478.                                       }
  479.                                           else  
  480.                                           {       
  481.                                                      if(P33==0)
  482.                                                      {
  483.                                                                   if(IsT0INT2==1)
  484.                                                                         {P01=0;P02=0;P03=1;P04=0;}
  485.                                                                    else
  486.                                                                     {P01=0;P02=0;P03=0;P04=0;}
  487.                                                }
  488.                                                else
  489.                                {
  490.                                                                    EX1=1;
  491.                                                                     if(Round%2)
  492.                                                    {  
  493.                                                                           if(IsT0INT2==1)
  494.                                                                 {P01=1;P02=0;P03=1;P04=0;Backid=1;}
  495.                                                             else
  496.                                                                 {P01=1;P02=0;P03=0;P04=0;}
  497.                                                                    }
  498.                                                        else
  499.                                                                    {
  500.                                                                            if(IsT0INT2==1)
  501.                                                      {P01=0;P02=1;P03=1;P04=0;Backid=0;}
  502.                                                                            else
  503.                                                                     {P01=0;P02=1;P03=0;P04=0;}
  504.                                                         }
  505.                                            }
  506.                                            }
  507.                           }  
  508.                     }                       
  509.                 }
  510.                
  511.                 if (IsT1INT==1)
  512.                 {
  513.                         IsT1INT=0;
  514.                         ComputeTime();
  515.                         ComputeSpeedANDDistance();
  516.                 }
  517.         }
  518.        
  519.         //補中斷路程,加上最后一次中斷缺失的路程
  520.         ComputeSpeedANDDistance();
  521.         P04=1;P03=0;P01=P02=0;Delay(90);
  522.         P03=0;P04=0;                                                                                //行程結束,小車停止
  523.         P31=1;                                                                                            //行程結束,背光開
  524.         ET0=0x0;                                                                            //關T0中斷
  525.         ET1=0x0;                                                                                       //關T1中斷
  526.         EX1=0x01;                                                                                          //開INT1中斷
  527.         Running=False;
  528.        
  529.        
  530.         AutoDisplay=True;                                                //默認情況下直線模式會自動顯示各個區域經過的時間
  531.         WriteCmd(LCD_CLS);
  532.        
  533.         if (SelectedMode==Line)                                                            //直線模式才顯示
  534.         {
  535.                 while(1)
  536.                 {
  537.                         if (GoToChoosingDisplay==True)
  538.                                 break;
  539.                         Delay(200);
  540.                         WriteCmd(LCD_CLS);
  541.                         Delay(200);
  542.                         DisplayString(0,0," LowSpeedArea1");
  543.                         DisplayString(0,1," Costed ");
  544.                         DisplaySingleChar(0x0C,1,'s');
  545.                         LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime;
  546.                         DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);
  547.                         if (LowSpeedArea1PassTime > 9)                        //通過第一個低速區的時間超過s
  548.                                 DisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);
  549.                                
  550.                         if (GoToChoosingDisplay==True)
  551.                                  break;
  552.                         Delay(200);
  553.                         WriteCmd(LCD_CLS);
  554.                         Delay(200);
  555.                         DisplayString(0,0," HighSpeedArea ");
  556.                         DisplayString(0,1," Costed ");
  557.                         DisplaySingleChar(0x0C,1,'s');
  558.                         HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime;
  559.                         DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);
  560.                         if ( HighSpeedAreaPassTime> 9)                             //通過高速區的時間超過s
  561.                                 DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);
  562.        

  563.                         if (GoToChoosingDisplay==True)
  564.                                 break;
  565.                         Delay(200);
  566.                         WriteCmd(LCD_CLS);
  567.                         Delay(200);
  568.                         DisplayString(0,0," LowSpeedArea2 ");
  569.                         DisplayString(0,1," Costed ");
  570.                         DisplaySingleChar(0x0C,1,'s');
  571.                         LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime;
  572.                         DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);
  573.                         if ( LowSpeedArea2PassTime> 9)                             //通過第二個低速區的時間超過s
  574.                                 DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);       

  575.                 }
  576.         }
  577.        
  578.         AutoDisplay=False;

  579.         /*----------------  菜單選擇你想要看的內容--總時間、總路程以及平均速度 --------------*/
  580.         ChoosingDisplay=True;                                                                  
  581.         WriteCmd(LCD_CLS);

  582.         /*首先顯示主菜單,然后顯示第一個選項*/
  583.         DisplayString(0x0,0,"Now Choose what ");
  584.         DisplayString(0x0,1,"you want to see ");
  585.         Delay(100);

  586.         while(1)
  587.         {
  588.                
  589.                 WriteCmd(LCD_CLS);
  590.                 DisplayString(0x0,0,"   Costed Time  ");
  591.                 DisplayString(0x0,1,"Next        Show");

  592.                 Delay(250);                                                                                //延時消除抖動

  593.     /*------------------------------------第一次按鍵--------------------------------------*/
  594.                
  595.                 /*不斷檢測確定鍵和Next鍵*/
  596.                 while(1)
  597.                 {
  598.                         if (Next==True)
  599.                                 break;
  600.                         if (SelectedShow==True)
  601.                                 break;
  602.                 }

  603.                 /*按下了確定鍵,顯示第一個選項的內容*/
  604.                 if (SelectedShow==True)          
  605.                 {
  606.                         SelectedShow=False;
  607.                         SelectedReturn=False;
  608.                         Selected=False;
  609.                         WriteCmd(LCD_CLS);
  610.                         DisplayString(0,0,"Costed Time is");                                  
  611.                         DisplayTime();
  612.                         DisplayString(0x0A,1,"s");
  613.                         ReturnSelection=True;                                 //按下了確定鍵,那么這個時候開啟返回鍵的功能               
  614.                         AVGSpeedShow=False;               

  615.                         Delay(250);                                                //延時消除抖動
  616.                 }

  617.                 /**按下了Next鍵,則顯示第二個選項*/
  618.                 if (Next==True)                                                //按下Next鍵,顯示AVGSpeed菜單項
  619.                 {
  620.                         Next=False;
  621.                         WriteCmd(LCD_CLS);
  622.                         DisplayString(0x0,0,"    AVGSpeed    ");
  623.                         DisplayString(0x0,1,"Next        Show");                                       
  624.                         ReturnMain=False;
  625.                         ReturnSelection=False;                              //按下了Next鍵,那么這個時候關閉返回鍵的功能
  626.                         AVGSpeedShow=True;                                         //表明AVGSpeed選項已經顯示過了

  627.                         Delay(250);                                                 //延時消除抖動
  628.                 }

  629.         /*------------------------------------第二次按鍵--------------------------------------*/
  630.                 /*顯示第一個選項的內容后又不斷檢測返回鍵(確定鍵)和Next鍵*/
  631.                 while(1)
  632.                 {
  633.                         if (Next==True)
  634.                                 break;
  635.                         if (Selected==True)
  636.                                  break;
  637.                 }
  638.                                
  639.                 if (Next==True)               
  640.                 {
  641.                         Next=False;
  642.                         ReturnMain=False;
  643.                         ReturnSelection=False;                             //按下了Next鍵,那么這個時候關閉返回鍵的功能       
  644.                         if (AVGSpeedShow==False)                     //還沒有顯示AVGSpeed選項,顯示它
  645.                         {                                                                //即第一次選擇了確定鍵
  646.                                 WriteCmd(LCD_CLS);
  647.                                 DisplayString(0x0,0,"    AVGSpeed    ");
  648.                                 DisplayString(0x0,1,"Next        Show");
  649.                                 TotalDistanceShow=False;        //顯示了AVGSpeed,則表明TotalDistance還沒有顯示
  650.                                
  651.                                 Delay(250);                                //延時消除抖動                                                                       
  652.                         }       
  653.                         if (AVGSpeedShow==True)                        //已經顯示過AVGSpeed選項了,則顯示下一個選項
  654.                         {                                                        //即第一次選擇了Next鍵
  655.                                 WriteCmd(LCD_CLS);
  656.                                 DisplayString(0x0,0," Total Distance ");
  657.                                 DisplayString(0x0,1,"Next        Show");
  658.                                 TotalDistanceShow=True;                                    //表明顯示了TotalDistance選項       

  659.                                 Delay(250);                                                        //延時消除抖動
  660.                         }
  661.                 }       

  662.                 if (Selected==True)                                                     //按下了確定鍵或返回鍵
  663.                 {
  664.                         SelectedShow=False;
  665.                         SelectedReturn=False;
  666.                         Selected=False;
  667.                         if (ReturnSelection==True)               //第一次選擇了確定鍵,故這次按下的是返回鍵
  668.                                 ReturnMain=True;
  669.                         if (ReturnSelection==False)   
  670.                         {
  671.                                 WriteCmd(LCD_CLS);
  672.                                 DisplayString(0,0,"The AVGSpeed is");                                       
  673.                                 DisplayAVGSpeed();
  674.                                 DisplayString(0x0A,1,"m/s");
  675.                                 ReturnSelection=True;                         //按下了確定鍵,那么這個時候開啟返回鍵的功能
  676.                                
  677.                                 Delay(250);                                        //延時消除抖動                               
  678.                         }
  679.                         TotalDistanceShow=False;                                       
  680.                 }

  681.                 if (ReturnMain==True)                                        //按下了返回鍵,返回主菜單
  682.                 {
  683.                         ReturnMain=False;
  684.                         continue;
  685.                 }                                               

  686.         /*------------------------------------第三次按鍵--------------------------------------*/

  687.                 /*如果沒有返回主菜單,則繼續檢測Next鍵和確定鍵*/
  688.         
  689.                 while(1)
  690.                 {                            
  691.                         if (Next==True)
  692.                                 break;
  693.                         if (SelectedShow==True)
  694.                                 break;
  695.                 }
  696.                
  697.                 /*按下Next鍵,顯示下一個選項*/
  698.                 if (Next==True)
  699.                 {
  700.                         Next=False;
  701.                         ReturnMain=False;
  702.                         ReturnSelection=False;                             //按下了Next鍵,那么這個時候關閉返回鍵的功能       
  703.                         if (TotalDistanceShow==True)
  704.                                 ReturnMain=True;
  705.                         if (TotalDistanceShow==False)                //還沒有顯示TotalDistance選項,顯示它
  706.                         {                                                                               
  707.                                 WriteCmd(LCD_CLS);
  708.                                 DisplayString(0x0,0," Total Distance ");
  709.                                 DisplayString(0x0,1,"Next        Show");
  710.                                 TotalDistanceShow=True;                                        
  711.                                
  712.                                 Delay(250);                                                //延時消除抖動                                               
  713.                         }       
  714.                 }

  715.                 if (Selected==True)                                                //按下了確定鍵或返回鍵
  716.                 {
  717.                         SelectedShow=False;
  718.                         SelectedReturn=False;
  719.                         Selected=False;
  720.                         if (ReturnSelection==True)                           //按下的是返回鍵
  721.                                 ReturnMain=True;
  722.                         if (ReturnSelection==False)                         
  723.                         {
  724.                                 if (TotalDistanceShow==False)                 //表明AVGSpeed選項的內容還沒有顯示
  725.                                 {
  726.                                         WriteCmd(LCD_CLS);
  727.                                         DisplayString(0,0,"The AVGSpeed is");                                       
  728.                                         DisplayAVGSpeed();
  729.                                         DisplayString(0x0A,1,"m/s");
  730.                                         ReturnSelection=True;        

  731.                                         Delay(250);                                        //延時消除抖動
  732.                                 }
  733.                                 if (TotalDistanceShow==True)
  734.                                 {
  735.                                         WriteCmd(LCD_CLS);
  736.                                         DisplayString(0,0,"Total Distance");
  737.                                         DisplayDistance();
  738.                                         DisplayString(0x0A,1,"m");
  739.                                         ReturnSelection=True;                 //按下了確定鍵,那么這個時候開啟返回鍵的功能

  740.                                         Delay(250);                                        //延時消除抖動
  741.                                 }
  742.                         }
  743.                 }

  744.                 if (ReturnMain==True)                                                 //按下了返回鍵,返回主菜單
  745.                 {
  746.                         ReturnMain=False;
  747.                         continue;                               
  748.                 }

  749.         /*------------------------------------第四次按鍵--------------------------------------*/
  750.                 while(1)
  751.                 {                            
  752.                         if (Next==True)
  753.                                 break;
  754.                         if (SelectedShow==True)
  755.                                 break;
  756.                 }
  757.                
  758.                 if (Next==True)                                                            //所有菜單項已經顯示完畢,返回主菜單
  759.                 {
  760.                         Next=False;
  761.                         ReturnMain=False;
  762.                         ReturnSelection=False;                                
  763.                         if (TotalDistanceShow==False)               
  764.                         {                                                                               
  765.                                 WriteCmd(LCD_CLS);
  766.                                 DisplayString(0x0,0," Total Distance ");
  767.                                 DisplayString(0x0,1,"Next        Show");
  768.                                 TotalDistanceShow=True;                                
  769.                                
  770.                                 Delay(250);                                                //延時消除抖動                                                       
  771.                         }       
  772.                 }

  773.                 if (SelectedShow==True)
  774.                 {
  775.                         SelectedShow=False;
  776.                         SelectedReturn=False;
  777.                         Selected=False;
  778.                         if (ReturnSelection==True)                           //按下的是返回鍵
  779.                                 ReturnMain=True;
  780.                         if (ReturnSelection==False)                         
  781.                         {
  782.                                 if (TotalDistanceShow==True)
  783.                                 {
  784.                                         WriteCmd(LCD_CLS);
  785.                                         DisplayString(0,0,"Total Distance");
  786.                                         DisplayDistance();
  787.                                         DisplayString(0x0A,1,"m");
  788.                                         ReturnSelection=True; //按下了確定鍵,那么這個時候開啟返回鍵的功能

  789.                                         Delay(250);                                        //延時消除抖動
  790.                                 }
  791.                         }                       
  792.                 }
  793.                
  794.                 if (ReturnMain==True)                                                 //按下了返回鍵,返回主菜單
  795.                 {
  796.                         ReturnMain=False;
  797.                         continue;                               
  798.                 }



  799.         /*------------------------------------第五次按鍵--------------------------------------*/
  800.                 while(1)
  801.                 {                            
  802.                         if (Next==True)
  803.                                 break;
  804.                         if (SelectedShow==True)
  805.                                 break;
  806.                 }

  807.                 if (Next==True)                                                     //所有菜單項已經顯示完畢,返回主菜單
  808.                 {
  809.                         Next=False;
  810.                         ReturnMain=False;
  811.                         ReturnSelection=False;
  812.                         if (TotalDistanceShow==True)                        //最后一個選項已經顯示完畢,返回主菜單
  813.                         {
  814.                                 ReturnMain=True;
  815.                         }                                
  816.                 }
  817.        
  818.                 if (SelectedShow==True)
  819.                 {
  820.                         SelectedShow=False;
  821.                         SelectedReturn=False;
  822.                         Selected=False;
  823.                         if (ReturnSelection==True)                           //按下的是返回鍵
  824.                                 ReturnMain=True;
  825.                         if (ReturnSelection==False)                         
  826.                         {
  827.                                 if (TotalDistanceShow==True)
  828.                                 {
  829.                                         WriteCmd(LCD_CLS);
  830.                                         DisplayString(0,0,"Total Distance");
  831.                                         DisplayDistance();
  832.                                         DisplayString(0x0A,1,"m");
  833.                                         ReturnSelection=True;                 //按下了確定鍵,那么這個時候開啟返回鍵的功能

  834.                                         Delay(250);                                        //延時消除抖動
  835.                                 }
  836.                         }                       
  837.                 }
  838.         /*------------------------------------第六次按鍵--------------------------------------*/               
  839.                 while(1)
  840.                 {                            
  841.                         if (Next==True)
  842.                                 break;
  843.                         if (SelectedShow==True)
  844.                                 break;
  845.                 }

  846.                 if (Next==True)
  847.                 {
  848.                         Next=False;
  849.                         ReturnMain=False;
  850.                         ReturnSelection=False;                       
  851.                 }
  852.                 if (SelectedShow==True)
  853.                 {
  854.                         SelectedShow=False;
  855.                         SelectedReturn=False;
  856.                         Selected=False;
  857.                 }
  858.                 continue;       
  859.         }
  860.         while(1);
  861. }


  862. /****************************************************************************************\
  863. **                                                                   LCD驅動模塊                                                                **
  864. \****************************************************************************************/

  865. /*---------------------------------  LCD初始化函數--------------------------------------*/

  866. void LCDInit(void)
  867. {
  868.     //三次顯示模式設置
  869.         LCD_Data=0;
  870.         LCD_E=Disable;
  871.         Delay(5);
  872.         WriteCmd(LCD_Init);
  873.         Delay(5);
  874.         WriteCmd(LCD_Init);
  875.         Delay(5);
  876.         WriteCmd(LCD_Init);

  877.         WriteCmd(LCD_Init);                                                           //初始化
  878.         WriteCmd(LCD_CloseCtr);                                                        //關顯示
  879.         WriteCmd(LCD_CLS);                                                                //清屏幕
  880.         WriteCmd(LCD_EnterSet);                                                        //光標移動設置
  881.         WriteCmd(LCD_DispCtr);                                                        //顯示開以及光標設置
  882.        
  883. }

  884. /*---------------------------------  LCD模式設置函數--------------------------------------*\
  885.        
  886.         SetWriteCmd()                                  設置LCD為寫命令模式
  887.         SetReadCmd()                                       設置LCD為讀命令模式
  888.         SetWriteData()                                設置LCD為寫數據模式
  889.        
  890. \*----------------------------------------------------------------------------------------*/
  891. void SetWriteCmd(void)
  892. {
  893.         LCD_RW=Write;
  894.         LCD_RS=Cmd;
  895. }

  896. void SetReadCmd(void)
  897. {
  898.         LCD_RW=Read;
  899.         LCD_RS=Cmd;
  900. }

  901. void SetWriteData(void)
  902. {
  903.         LCD_RW=Write;
  904.         LCD_RS=Data;
  905. }

  906. /*---------------------------------  LCD功能執行函數--------------------------------------*\
  907.        
  908.         WriteCmd()                                        寫命令
  909.         WriteData()                                        寫數據
  910.         ExecuteCmd()                                        執行命令
  911.         SetXY()                                                顯示定位
  912.         DisplaySingleChar()                        顯示單個字符
  913.         DisplayString()                                顯示一串字符
  914.         IsBusy()                                                忙標志檢測
  915. \*----------------------------------------------------------------------------------------*/
  916. void WriteCmd(char cmd)
  917. {
  918.         while(IsBusy());
  919.         LCD_Data=cmd;       
  920.         SetWriteCmd();
  921.         ExecuteCmd();
  922. }

  923. void WriteData(char ddata)
  924. {
  925.         while(IsBusy());
  926.         LCD_Data=ddata;
  927.         SetWriteData();       
  928.         ExecuteCmd();
  929. }

  930. void ExecuteCmd(void)
  931. {
  932.         LCD_E=Enable;
  933.         LCD_E=Disable;
  934. }

  935. void SetXY(char x,char y)
  936. {
  937.         if (y)
  938.                 x|=0x40;
  939.         x|=0x80;
  940.         Delay(5);
  941.         WriteCmd(x);

  942. }

  943. void DisplaySingleChar(char x,char y,char cchar)
  944. {
  945.         SetXY(x,y);
  946.         WriteData(cchar);       
  947. }

  948. void DisplayString(char x,char y,char *str)
  949. {
  950.         while(*str)
  951.         {
  952.                 Delay(5);
  953.                 DisplaySingleChar(x++,y,*str);
  954.                 str++;
  955.         }
  956. }

  957. bit IsBusy(void)
  958. {
  959.         LCD_Data=0xFF;
  960.         SetReadCmd();
  961.         ExecuteCmd();
  962.         return (bit)(P1 & 0x80);       
  963. }

  964. /*-------------------------------------    延時函數  -------------------------------------*/
  965. void Delay(unsigned int time)
  966. {
  967.     unsigned int timeCounter = 0;
  968.         for (timeCounter = time;timeCounter > 0 ;timeCounter --)
  969.                 DelayUs(255);
  970. }

  971. void DelayUs(unsigned int time)
  972. {
  973.         unsigned int timeCounter = 0;
  974.         for (timeCounter = 0;timeCounter < time;timeCounter ++)
  975.                 _nop_();
  976. }

  977. /*******************************************************************************************\
  978. **                                    LCD顯示模塊                                         **
  979. \*******************************************************************************************/

  980. void ComputeTime(void)
  981. {
  982.         if (Area0 < 5)
  983.                 PassTime+=0.5;
  984. }

  985. void ComputeSpeedANDDistance(void)
  986. {
  987.         Speed=SpeedCount/4*CircleLength;                                        //計算瞬時速度
  988.         Distance+=Speed;                                                                //計算距離                                               
  989.         SpeedCount=0;
  990.        
  991. }
  992. /*-------------------------------------  顯示時間 ----------------------------------------*/
  993. void DisplayTime(void)
  994. {
  995.         char PassTime1=0x30;
  996.         char PassTime2=0x30;
  997.         char PassTime3=0x30;
  998.         char PassTime4=0x30;
  999.        
  1000.         if ((int)PassTime*100<100)                                  //時間未夠1s
  1001.         {
  1002.                 PassTime1+=0;      
  1003.                 PassTime2+=(int)(PassTime*100)/10;
  1004.                 PassTime3+=(int)(PassTime*100)%10;
  1005.         }
  1006.         else if ((int)(PassTime*100) > 100  && (int)(PassTime*100) < 1000) //夠1s而未夠10s
  1007.         {
  1008.                 PassTime1+=(int)(PassTime*100)/100;
  1009.                 PassTime2+=(int)(PassTime*100)/10%10;
  1010.                 PassTime3+=(int)(PassTime*100)%10;
  1011.         }
  1012.         else
  1013.         {
  1014.                 PassTime1+=(int)(PassTime*100)/1000;
  1015.                 PassTime2+=(int)(PassTime*100)/100%10;
  1016.                 PassTime3+=(int)(PassTime*100)/10%10;
  1017.                 PassTime4+=(int)(PassTime*100)%10;
  1018.         }

  1019.         if ((int)(PassTime*100) < 1000)
  1020.         {       
  1021.                 DisplaySingleChar(0x05,1,PassTime1);
  1022.                 DisplaySingleChar(0x06,1,'.');
  1023.                 DisplaySingleChar(0x07,1,PassTime2);
  1024.                 DisplaySingleChar(0x08,1,PassTime3);
  1025.         }
  1026.         else
  1027.         {
  1028.                 DisplaySingleChar(0x04,1,PassTime1);
  1029.                 DisplaySingleChar(0x05,1,PassTime2);
  1030.                 DisplaySingleChar(0x06,1,'.');
  1031.                 DisplaySingleChar(0x07,1,PassTime3);
  1032.                 DisplaySingleChar(0x08,1,PassTime4);
  1033.         }
  1034.        
  1035.        
  1036. }
  1037. /*------------------------------------ 顯示平均速度----------------------------------------*/

  1038. void DisplayAVGSpeed(void)
  1039. {
  1040.         int Speed1=0x30;                                                                        //初始化為0的ASCII碼
  1041.         int Speed2=0x30;
  1042.         int Speed3=0x30;

  1043.         if ((int)(Distance/PassTime*100)< 100)
  1044.         {
  1045.                 Speed1+=0;
  1046.                 Speed2+=(int)(Distance/PassTime*100)/10;
  1047.                 Speed3+=(int)(Distance/PassTime*100)%10;
  1048.         }
  1049.         else
  1050.         {
  1051.                 Speed1+=(int)(Distance/PassTime*100)/100;
  1052.                 Speed2+=(int)(Distance/PassTime*100)/10%10;
  1053.                 Speed3+=(int)(Distance/PassTime*100)%10;
  1054.         }

  1055.         DisplaySingleChar(0x05,1,Speed1);
  1056.         DisplaySingleChar(0x06,1,'.');
  1057.         DisplaySingleChar(0x07,1,Speed2);
  1058.         DisplaySingleChar(0x08,1,Speed3);
  1059. }
  1060. /*-------------------------------------  顯示路程 ----------------------------------------*/

  1061. void DisplayDistance(void)
  1062. {
  1063.         int Distance1=0x30;
  1064.         int Distance2=0x30;
  1065.         int Distance3=0x30;
  1066.         int Distance4=0x30;

  1067.         if ((int)(Distance*100) < 100)
  1068.         {
  1069.                 Distance1+=0;
  1070.                 Distance2+=(int)(Distance*100)/10;
  1071.                 Distance3+=(int)(Distance*100)%10;
  1072.         }
  1073.         else if ((int)(Distance*100) > 100  && (int)(Distance*100) < 1000)
  1074.         {
  1075.                 Distance1+=(int)(Distance*100)/100;
  1076.                 Distance2+=(int)(Distance*100)/10%10;
  1077.                 Distance3+=(int)(Distance*100)%10;
  1078.         }
  1079.         else
  1080.         {
  1081.                 Distance1+=(int)(Distance*100)/1000;
  1082.                 Distance2+=(int)(Distance*100)/100%10;
  1083.                 Distance3+=(int)(Distance*100)/10%10;
  1084.                 Distance4+=(int)(Distance*100)%10;
  1085.         }
  1086.        

  1087.         if ((int)(Distance*100) < 1000)
  1088.         {       
  1089.                 DisplaySingleChar(0x05,1,Distance1);
  1090.                 DisplaySingleChar(0x06,1,'.');
  1091.                 DisplaySingleChar(0x07,1,Distance2);
  1092.                 DisplaySingleChar(0x08,1,Distance3);
  1093.         }
  1094.         else
  1095.         {
  1096.                 DisplaySingleChar(0x04,1,Distance1);
  1097.                 DisplaySingleChar(0x05,1,Distance2);
  1098.                 DisplaySingleChar(0x06,1,'.');
  1099.                 DisplaySingleChar(0x07,1,Distance3);
  1100.                 DisplaySingleChar(0x08,1,Distance4);
  1101.         }
  1102. }
  1103. /*-------------------------------------  中斷初始化  -------------------------------------*/

  1104. void INTInit(void)
  1105. {                                               
  1106.         EA=1;                                                                          //開總中斷
  1107.         IT0=1;                                                                          //INTO邊沿觸發
  1108.         PX0=1;                                                                    //INTO優先級為高級
  1109.         EX1=1;                                                                          //開INT1中斷
  1110.         IT1=1;                                                                          //INT1邊沿觸發
  1111.         PX1=1;                                                                    //INT1優先級為高級
  1112.         Clock0_Init();                                                   //初始化時鐘中斷
  1113.         TMOD=0x11;                                                                  //T0/T1定時方式1
  1114.         ET0=0x01;                                                                //開T0中斷
  1115.         ET1=0x01;                                                               //開T1中斷
  1116. }

  1117. void Clock0_Init(void)
  1118. {
  1119.         TR0=0x01;                                                                 //啟動T0
  1120.         TH0=Thx0;                                                                       //定時初值
  1121.         TL0=Tlx0;

  1122. }
  1123. void Clock1_Init(void)
  1124. {
  1125.         TR1=0x01;                                                                //啟動T1
  1126.         TH1=0x3C;                                                                          //定時初值-50ms中斷一次
  1127.         TL1=0x0B0;
  1128. }

  1129. /*******************************************************************************************\
  1130. **                                                                           中斷處理程序                                  **
  1131. \*******************************************************************************************/

  1132. /*-----------------------------------   外部中斷0 ----------------------------------------*\

  1133.         外部中斷0有兩個功能
  1134.         (1)作為菜單選擇的Next鍵
  1135.         (2)作為測速的計數器

  1136. \*-----------------------------------------------------------------------------------------*/
  1137. void SpeedINT(void) interrupt 0                          //中斷INT0
  1138. {
  1139.         if (SelectedAll==False)                                //如果模式和速度還沒有選擇完畢,則此中斷作為Next鍵
  1140.                 Next=True;                                                                       
  1141.         if (Running==True)                                         //如果模式和速度已經選擇完畢,則此中斷作為測速中斷
  1142.                 SpeedCount++;
  1143.         if (ChoosingDisplay==True)                        //如果是在選擇要顯示的內容
  1144.                 Next=True;                         
  1145. }




  1146. /*-----------------------------------   外部中斷1 ----------------------------------------*\

  1147.         外部中斷1有兩個功能
  1148.         (1)作為菜單選擇的確定鍵/返回鍵
  1149.         (2)控速

  1150. \*-----------------------------------------------------------------------------------------*/
  1151. void CtrSpeedINT(void) interrupt 2                           //中斷INT1
  1152. {                             
  1153.        
  1154.         if (SelectedAll==False)                                        //如果模式和速度還沒有選擇完畢,則此中斷作為確定鍵
  1155.         {
  1156.                 if (IsSelectingMode==True)                                  //模式選擇標志
  1157.                                 ModeSelected=True;
  1158.                 if (IsSelectingSpeed==True)                                  //速度選擇標志
  1159.                                 SpeedSelected=True;
  1160.         }

  1161.         if (Running==True)                                         //如果模式和速度選擇已經完畢,則此中斷作為控速中斷
  1162.         {
  1163.                 if (Area0==0)                                        //經過第一條鐵線(即起跑線),開始計時,開始測速
  1164.                 {
  1165.                         EX0=1;
  1166.                         Clock1_Init();
  1167.                          P31=0;                                                                  //過起跑線,背光滅
  1168.                 }
  1169.                 if (Area0==1)
  1170.                         LowSpeedArea1StartTime=PassTime;    //讀取進入第一個低速區的時刻
  1171.                 if (Area0==2)
  1172.                         LowSpeedArea1EndTime=PassTime;//讀取離開第一個低速區的時刻,也就是進入高速區的時刻
  1173.                 if (Area0==3)
  1174.                         HighSpeedAreaEndTime=PassTime;//讀取離開高速區的時刻,也就是進入第二個低速區的時刻
  1175.                 if (Area0==4)
  1176.                         LowSpeedArea2EndTime=PassTime;       //讀取離開第二個低速去的時刻
  1177.                
  1178.                 if(AutoMode==1)                                                            //自動模式
  1179.                 {  
  1180.                            PassLine++;
  1181.                            switch(PassLine)
  1182.                            {
  1183.                                 case 5  :PassLineID=1;break;
  1184.                             case 10 :PassLineID=2;break;
  1185. ……………………

  1186. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
chengxu.docx (38.44 KB, 下載次數: 130)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:203943 發表于 2017-7-27 16:17 | 只看該作者
謝謝分享 再學習中
回復

使用道具 舉報

板凳
ID:223374 發表于 2017-7-30 22:15 | 只看該作者
厲害 哈哈哈
回復

使用道具 舉報

地板
ID:225338 發表于 2017-8-7 04:41 來自觸屏版 | 只看該作者
太高端了
回復

使用道具 舉報

5#
ID:265318 發表于 2018-1-11 13:11 來自觸屏版 | 只看該作者
學習下
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
7#
ID:254856 發表于 2018-1-27 15:16 | 只看該作者
謝謝啊
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
9#
ID:419428 發表于 2018-11-1 22:18 | 只看該作者
厲害,厲害
回復

使用道具 舉報

10#
ID:418342 發表于 2018-11-2 17:28 | 只看該作者
謝謝分享
回復

使用道具 舉報

11#
ID:415420 發表于 2018-11-7 19:34 | 只看該作者
恩,騙子一個,原理圖?在哪?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
久久午夜国产精品| 亚洲三区在线播放| 欧美另类69xxx| 色猫av在线| 免费视频成人| 国产成人精品免费网站| 久久精品无码中文字幕| 精品久久在线播放| 国产精品久久久久久在线| 99视频高清| 国产另类在线| 中文字幕第一区| 97在线视频免费看| 久久久久亚洲av无码网站| 久久夜色邦福利网| 唐人社导航福利精品| 成人性生交大片免费看中文网站| 色哟哟亚洲精品一区二区| 国产免费一区二区三区视频| 国内精品久久久久久久久久| 少女频道在线观看高清| 老司机免费视频一区二区三区| 日韩第一页在线| 国产xxxx振车| 精品国产无码AV| 国产在线拍揄自揄拍视频| 精品亚洲aⅴ乱码一区二区三区| 亚洲欧美日韩国产中文| 午夜精品久久久久久久无码| 人妻一区二区三区| 亚洲黄色网址| 26uuuu精品一区二区| 97国产精品免费视频| av漫画在线观看| 免费黄色网址网站| 国产一区二区三区91| 色婷婷综合激情| 欧美一区2区三区4区公司二百| 日韩 欧美 中文| www.亚洲免费| 久久精品久久综合| 久久久av亚洲男天堂| 中文字幕第22页| 轻轻草在线视频| 精品国产91久久久久久浪潮蜜月| 日本道色综合久久| 婷婷精品国产一区二区三区日韩| 亚洲精品毛片一区二区三区| 中文字幕有码在线观看| 国产白丝精品91爽爽久久| 韩国精品美女www爽爽爽视频| 星空大象在线观看免费播放| 天天天天天天天操| 91高清一区| 亚洲精品在线电影| 不卡影院一区二区| 精品a在线观看| 色婷婷av一区二区三区丝袜美腿| 一本大道久久a久久综合| 水蜜桃一区二区| 精品久久在线观看| 中文字幕系列一区| 一区二区在线观看免费| 亚洲精选一区二区| 日本www在线视频| 一色屋色费精品视频在线观看| 精品国产第一国产综合精品| 亚洲成a人片在线观看中文| 欧美婷婷久久| 国产乱人乱偷精品视频| 欧美极品免费| 亚洲欧美日韩在线不卡| 精品久久久久久一区二区里番| 97人妻一区二区精品视频| 国产污视频在线播放| 国产精品你懂的| 久久久久久精| 国产黄色片网站| 青青在线精品| 色婷婷av一区二区| 99er在线视频| 国产精品18久久久久网站| 日韩一区二区中文| 亚洲精品乱码久久久久久按摩观| 午夜视频在线观| 国产a级网站| 蜜臀久久久久久久| 日韩av快播网址| 国产精品第九页| 国产激情在线播放| 一区二区久久久久久| 视频在线观看成人| 欧美性猛交xxxx乱大交丰满| 欧美老女人另类| 日韩电影中文字幕一区| 99热这里只有精品2| 一个人看的免费视频色| 麻豆精品在线播放| 国产精品 欧美在线| 日韩特黄一级片| 欧美日韩国产观看视频| 亚洲制服丝袜一区| 成人国产在线看| 91视频论坛| 一区二区三区福利| 欧美又大又粗又长| 欧美特黄aaaaaa| 日韩五码电影| 欧美一区二区三区在线视频| 手机免费av片| 宅男视频免费在线观看视频| av日韩在线网站| 精品欧美国产| 亚洲视频在线网| 我不卡影院28| 欧美大片va欧美在线播放| av最新在线观看| 9765激情中文在线| 日韩欧美国产中文字幕| 日本福利视频在线| 超碰超碰97| 日韩av系列| 亚洲国产欧美一区二区三区同亚洲 | 久久免费看视频| 97久久精品人人做人人爽50路| 黑人另类av| 伊人色综合久久久天天蜜桃| 午夜精品免费| 性亚洲最疯狂xxxx高清| 国产区一区二区三| 视频二区欧美| 亚洲国产中文字幕在线观看| aa片在线观看视频在线播放| 麻豆影视国产在线观看| 亚洲蜜臀av乱码久久精品| 日韩国产小视频| 超碰色偷偷男人的天堂| 丰满白嫩尤物一区二区| 免费亚洲一区二区| 国产亚洲精品午夜高清影院| 久久aⅴ国产紧身牛仔裤| 成人精品福利视频| 五月婷婷丁香花| 激情综合中文娱乐网| 国产成人精品在线观看| 国产成人精品亚洲精品色欲| 欧美日韩第一| 午夜精品免费视频| 国产精品国产精品国产专区| 97精品97| 日韩av免费在线看| 好吊视频一二三区| 日韩视频一区| 亚洲mm色国产网站| 亚洲精品自产拍在线观看app| 亚洲在线日韩| 国产精品乱码视频| 欧美黄网站色视频| 久久精品国产999大香线蕉| 国产视频在线观看一区| 国产亚洲精品自在线观看| 蜜臀精品久久久久久蜜臀| 激情小说综合网| 日日夜夜操操操| 国产精品国产亚洲精品| 亚洲欧美自拍一区| 加勒比av在线播放| av动漫精品一区二区| 日韩最新av在线| 日本丰满少妇做爰爽爽| 国产一区二区三区四区五区| 热re99久久精品国产66热| 粉嫩小泬无遮挡久久久久久| 国产精品毛片一区二区三区| 国产日本一区二区三区| 国产精品久久久久久久泡妞 | 四虎影视最新网址| 青椒成人免费视频| 欧美专区一二三| 天天摸天天做天天爽| 26uuu亚洲综合色| 欧美啪啪免费视频| 成人高清在线| 欧美午夜精品一区二区蜜桃| 日本精品在线观看视频| 日韩在线电影| 欧美成人免费网| 国产夫妻自拍av| 99精品久久久| 欧美日韩精品免费看| 精品伦理一区二区| 亚洲综合在线观看视频| 白丝校花扒腿让我c| 伊人久久高清| 日韩中文字幕在线看| 国产草草影院ccyycom| 久久成人在线| 亚洲精品中文综合第一页| 九草视频在线观看| 黄色精品一区二区| 中文字幕在线1| 第一区第二区在线| 国产suv精品一区二区三区88区| 四虎永久成年免费影院| 成人av免费观看| 成人在线观看a| 国产盗摄精品一区二区酒店| 国产偷亚洲偷欧美偷精品| 国产99久久久久久免费看| 亚洲无线一线二线三线区别av| 精品午夜一区二区| 好吊的妞视频这里都有| 黄网动漫久久久| 无码人中文字幕| 蜜臀久久99精品久久一区二区| 国产日韩中文字幕| 黄色大片网站| 一区二区在线观看视频| 熟女俱乐部一区二区| 国产精品一线| 成人伊人精品色xxxx视频| 成年大片免费视频播放二级| 亚洲乱码国产乱码精品精98午夜| 污污内射在线观看一区二区少妇| 日韩在线网址| 国产精品 欧美在线| 黄网站在线观看高清免费| 亚洲精选视频在线| 国产精品无码久久久久久| 欧美变态挠脚心| 精品日韩欧美在线| 午夜影院在线看| 99视频在线精品国自产拍免费观看| 欧美激情国产日韩| 久久综合九色综合久| 亚洲国产精品成人va在线观看| 中文字幕精品无码亚| 蜜桃精品视频在线观看| 欧美aⅴ在线观看| 日韩精品99| 4k岛国日韩精品**专区| 青青青爽在线视频免费观看| 亚洲国产成人porn| 欧美老熟妇一区二区三区| 亚洲天天综合| 最新精品视频| 欧洲性视频在线播放| 久久这里只有精品99| 精品一区二区三区高清免费不卡| |精品福利一区二区三区| 成熟人妻av无码专区| 日韩久久精品网| 亚欧洲精品在线视频免费观看| 岛国大片在线观看| 亚洲色图色老头| 男女啪啪网站| 中文字幕五月欧美| 在线观看日本黄色| 欧美成人高清| 久久香蕉视频网站| 三级在线看中文字幕完整版| 久久99久久亚洲国产| 国产成人精品久久一区二区小说 | 日本japanese极品少妇| 国产精品视频一区二区三区四蜜臂| 国产精品夜夜夜一区二区三区尤| 日韩毛片在线一区二区毛片| 亚洲护士老师的毛茸茸最新章节| 亚洲乱码精品久久久久..| 久久先锋影音av| 综合 欧美 亚洲日本| 亚洲午夜91| 91免费视频网站在线观看| 香蕉成人在线| 99re视频在线| 黑人与亚洲人色ⅹvideos| 亚洲视频999| 欧美高清3dfreexxxx性| 亚洲一区电影777| 亚洲视频免费播放| 久久国产精品99久久人人澡| 成人不卡免费视频| 九九综合久久| 亚洲制服中文| 无遮挡爽大片在线观看视频| 日韩av免费在线| 中文在线√天堂| 国产一区二区三区在线| 国产福利热线视频| 欧美亚洲图片小说| 国内精品久久久久久久久久久| 久久久精品人体av艺术| 波多野结衣喷潮| 日韩在线一区二区三区| 亚洲精品中文字幕乱码无线| 自拍亚洲一区| 自拍另类欧美| 91福利精品在线观看| 91嫩草国产在线观看| 午夜在线播放| 久久久久久成人| 国产特级嫩嫩嫩bbb| 国产视频精品久久久| 国产欧美日韩第一页| 欧美性色欧美a在线播放| 亚洲精品久久久狠狠狠爱| 黑人一区二区| 亚洲熟妇av日韩熟妇在线| 亚洲视频国产精品| 亚洲精品一区国产精品| 超碰这里只有精品| 精品国产乱码久久久久软件| 青草在线视频在线观看| 国产玖玖精品视频| 91大神xh98hx在线播放| 欧美又大又硬又粗bbbbb| 亚洲电影小说图| 欧美理论电影在线播放| 美女在线一区| 日韩中文字幕视频在线| baoyu777.永久免费视频| 夜夜嗨av一区二区三区免费区| 很很鲁在线视频播放影院| 日韩高清有码在线| 美女被黑人40厘米进入| 精品日韩在线一区| 你懂的免费视频| 亚洲国产美女久久久久| 天堂网在线观看| 亚洲国产成人av在线| 一分钟免费观看视频播放www| 日韩欧美一区在线观看| 国产精品剧情一区二区三区| 欧美大片在线观看| 69精品视频| 亚洲丁香婷深爱综合| www.91视频com| 亚洲成av人片在线观看香蕉| 黄色网址免费看| 亚洲色图五月天| 日日躁夜夜躁人人揉av五月天| 久久九九热免费视频| 久草福利资源在线视频| 美女av一区二区三区 | 日韩视频中午一区| 最新天堂网www| 日韩av中文在线| 久草在线资源网站| 欧美乱大交xxxxx| 每日更新在线观看av| 国产精品成熟老女人| 国产区在线观看| 亚洲www在线观看| 亚洲一级少妇| 免费看成人午夜电影| 韩国一区二区三区视频| 青青草综合视频| 国产成人高清| 亚洲xxx在线观看| 亚洲欧美日韩专区| 亚洲精品国产精品国自产网站| 韩国视频一区二区| 国产一级片播放| 国产精品久久久久久户外露出| 国产精品女同一区二区| 一本色道a无线码一区v| 国产在线第一页| 精品偷拍一区二区三区在线看| 国产国产人免费人成免费视频| 色综合久久精品亚洲国产| а√天堂中文在线资源bt在线| 亚洲一区二区三区xxx视频| 蜜臀国产一区| 久草免费福利在线| 在线精品视频在线观看高清| 国产白袜脚足j棉袜在线观看| 日本视频一区二区三区| 欧美日韩大片在线观看| 亚洲视频在线观看三级| 经典三级一区二区三区视频| 精品国产不卡一区二区三区| 91婷婷韩国| 国产99视频精品免视看7| av资源亚洲| 欧美黄网在线观看| 欧美日韩99| 视频一区二区三区在线观看| 免费观看不卡av| 美女被爆操网站| 国产电影一区二区三区| 欧美日韩a v| 欧美中文字幕一二三区视频| 极度色播免费播放视频| 久久人人爽人人爽人人片av高清| 日本精品600av| 老司机av福利| 亚洲激情中文| 免费中文字幕日韩| 亚洲在线视频一区| 国产精品bbw一区二区三区|