久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 23606|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)避障智能小車(chē)原理圖和源程序資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
避障智能小車(chē)電路原理圖如下:


單片機(jī)源程序如下:
  1. 附錄B
  2. 按照預(yù)定的功能,系統(tǒng)實(shí)現(xiàn)預(yù)定的功能的程序如下所示:

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

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

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

  27. /*--------------------------  測(cè)速/測(cè)距/測(cè)時(shí)模塊 -------------------------------*/
  28. #define CircleLength                0.132                                //小車(chē)轉(zhuǎn)一輪的長(zhǎng)度為.132m

  29. /*--------------------------------  控速模塊 -----------------------------------*/
  30. #define P03                                P0_3                                           //后電機(jī)
  31. #define P04                                P0_4                                          //后電機(jī)
  32. #define P01                                  P0_1                                           //前電機(jī)
  33. #define P02                                P0_2                                           //前電機(jī)
  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. **                                                          全局函數(shù)聲明區(qū)                                                        **
  44. \*********************************************************************************/
  45. /*-------------------------------  LCD模塊 -------------------------------------*/
  46. void LCDInit(void);                                                                //LCD初始化
  47. void SetWriteCmd(void);                                                                //設(shè)置寫(xiě)命令模式
  48. void SetReadCmd(void);                                                                //設(shè)置讀命令模式
  49. void SetWriteData(void);                                                        //設(shè)置寫(xiě)數(shù)據(jù)模式
  50. void WriteCmd(char cmd);                                                        //寫(xiě)命令
  51. void WriteData(char ddata);                                                        //寫(xiě)數(shù)據(jù)
  52. void ExecuteCmd(void);                                                                //執(zhí)行命令
  53. void SetXY(char x,char y);                                                        //定位顯示地址
  54. void DisplaySingleChar(char x,char y,char cchar);                //顯示單個(gè)字符
  55. void DisplayString(char x,char y,char *str);                         //顯示一段字符串
  56. void Delay(unsigned int time);                                                //延時(shí)主程序
  57. void DelayUs(unsigned int time);                                                //延時(shí)子程序
  58. bit  IsBusy(void);                                                                        //判斷忙標(biāo)志函數(shù)
  59. void DisplayTime(void);                                                                //顯示時(shí)間
  60. void DisplayAVGSpeed(void);                                                        //顯示平均速度
  61. void DisplayDistance(void);                                                        //顯示路程

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

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

  74. /********************************************************************************\
  75. **                                             全局變量區(qū)                                                                        **
  76. \********************************************************************************/

  77. float  SpeedCount = 0;                                                              //測(cè)速計(jì)數(shù)脈沖
  78. float  Speed = 0.0;                                                       
  79. float  Distance = 0.0;                                        
  80. char   Time1INTCount=0;                                                                //T1中斷時(shí)間計(jì)時(shí)
  81. float  PassTime=0.00;                                                                //小車(chē)行走的時(shí)間
  82. short  IsT0INT=1;                                                                       
  83. bit           IsT1INT;                                                                        //判斷T1是否已經(jīng)響應(yīng)中斷
  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;                                                                        //區(qū)域變量

  98. char   LowSpeedArea1StartTime;
  99. char   LowSpeedArea1EndTime;
  100. char   HighSpeedAreaEndTime;
  101. char   LowSpeedArea2EndTime;
  102. char   LowSpeedArea1PassTime=0;                                                 //第一個(gè)低速區(qū)通過(guò)時(shí)間
  103. char   HighSpeedAreaPassTime=0;                                                //高速區(qū)通過(guò)時(shí)間
  104. char   LowSpeedArea2PassTime=0;                                                //第二個(gè)低速區(qū)通過(guò)時(shí)間
  105. char   ReadyToGo=4;                                                                //倒計(jì)時(shí)

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

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

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

  128. bit    AutoDisplay;                                                                //自動(dòng)顯示標(biāo)志
  129. bit    GoToChoosingDisplay;                                                        //人工選擇標(biāo)志

  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時(shí)的速度
  141. float  Count=4;                                                                        //時(shí)間的倍數(shù)




  142. /********************************************************************************\
  143. **                                             全局函數(shù)實(shí)現(xiàn)區(qū)                                                        **
  144. \********************************************************************************/

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

  153.         Delay(40);                                                                                //延時(shí)等待LCD啟動(dòng)
  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;                                                                                          //開(kāi)總中斷
  161.         EX0=1;                                                                                        //開(kāi)INT0中斷
  162.         IT0=1;                                                                                        //INTO邊沿觸發(fā)
  163.         EX1=1;                                                                                     //開(kāi)INT1中斷
  164.         IT1=1;                                                                                         //INT1邊沿觸發(fā)       

  165.         SelectedAll=False;                                                                       //開(kāi)始模式和速度選擇
  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);                                                                //延時(shí)消除抖動(dòng)

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

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

  203.                         while(1)                                                                //不斷檢測(cè)中斷,直到按確定鍵或是Next鍵
  204.                     {
  205.                                 if (Next==True)                                        //如果再一次按下Next鍵,則跳出
  206.                                         break;
  207.                                 if (ModeSelected==True)                        //如果按下確定鍵,則設(shè)置模式為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鍵,則循環(huán)模式選擇
  221.                 {
  222.                         Next=False;
  223.                         WriteCmd(LCD_CLS);
  224.                         DisplayString(0x0,0,"    AutoMode    ");
  225.                         DisplayString(0x0,1,"Next         Yes");

  226.                         Delay(300);                                                    //延時(shí)消除抖動(dòng)

  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);                                                         //延時(shí)消除抖動(dòng)
  268.                        
  269.                         while(1)
  270.                         {
  271.                                 if (Next==True)                                         //如果按Next鍵則直接跳出
  272.                                         break;
  273.                                 if (SpeedSelected==True)                      //如果按確定鍵則設(shè)置速度為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.                                 }                                                                 //如果什么鍵都沒(méi)有按下,那么一直顯示等待                       
  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);                                             //延時(shí)消除抖動(dòng)

  298.                                 while(1)
  299.                                 {
  300.                                         if (Next==True)                                //如果再一次按下Next鍵,則跳出
  301.                                                 break;
  302.                                         if (SpeedSelected==True)                //如果按下確定鍵,則設(shè)置速度為L(zhǎng)ow,并跳出
  303.                                         {       
  304.                                                 SelectedSpeed=Low;                        //這里沒(méi)有速度設(shè)置,因?yàn)槟J(rèn)速度就是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);                                         //延時(shí)消除抖動(dòng)
  323.        
  324.                                 while(1)
  325.                                 {
  326.                                         if (Next==True)                         //如果再一次按下Next鍵,則跳出
  327.                                                 break;
  328.                                         if (SpeedSelected==True)         //如果按下確定鍵,則設(shè)置速度為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鍵,則循環(huán)速度選擇
  347.                         {
  348.                                 Next=False;
  349.                                 continue;
  350.                         }
  351.        
  352.                 }
  353.         }

  354.         SelectedAll=True;                                 //標(biāo)志模式選擇和速度選擇完畢
  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)                                                                          //自動(dòng)模式
  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.         //補(bǔ)中斷路程,加上最后一次中斷缺失的路程
  520.         ComputeSpeedANDDistance();
  521.         P04=1;P03=0;P01=P02=0;Delay(90);
  522.         P03=0;P04=0;                                                                                //行程結(jié)束,小車(chē)停止
  523.         P31=1;                                                                                            //行程結(jié)束,背光開(kāi)
  524.         ET0=0x0;                                                                            //關(guān)T0中斷
  525.         ET1=0x0;                                                                                       //關(guān)T1中斷
  526.         EX1=0x01;                                                                                          //開(kāi)INT1中斷
  527.         Running=False;
  528.        
  529.        
  530.         AutoDisplay=True;                                                //默認(rèn)情況下直線模式會(huì)自動(dòng)顯示各個(gè)區(qū)域經(jīng)過(guò)的時(shí)間
  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)                        //通過(guò)第一個(gè)低速區(qū)的時(shí)間超過(guò)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)                             //通過(guò)高速區(qū)的時(shí)間超過(guò)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)                             //通過(guò)第二個(gè)低速區(qū)的時(shí)間超過(guò)s
  574.                                 DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);       

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

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

  582.         /*首先顯示主菜單,然后顯示第一個(gè)選項(xiàng)*/
  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);                                                                                //延時(shí)消除抖動(dòng)

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

  603.                 /*按下了確定鍵,顯示第一個(gè)選項(xiàng)的內(nèi)容*/
  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;                                 //按下了確定鍵,那么這個(gè)時(shí)候開(kāi)啟返回鍵的功能               
  614.                         AVGSpeedShow=False;               

  615.                         Delay(250);                                                //延時(shí)消除抖動(dòng)
  616.                 }

  617.                 /**按下了Next鍵,則顯示第二個(gè)選項(xiàng)*/
  618.                 if (Next==True)                                                //按下Next鍵,顯示AVGSpeed菜單項(xiàng)
  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鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能
  626.                         AVGSpeedShow=True;                                         //表明AVGSpeed選項(xiàng)已經(jīng)顯示過(guò)了

  627.                         Delay(250);                                                 //延時(shí)消除抖動(dòng)
  628.                 }

  629.         /*------------------------------------第二次按鍵--------------------------------------*/
  630.                 /*顯示第一個(gè)選項(xiàng)的內(nèi)容后又不斷檢測(cè)返回鍵(確定鍵)和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鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能       
  644.                         if (AVGSpeedShow==False)                     //還沒(méi)有顯示AVGSpeed選項(xiàng),顯示它
  645.                         {                                                                //即第一次選擇了確定鍵
  646.                                 WriteCmd(LCD_CLS);
  647.                                 DisplayString(0x0,0,"    AVGSpeed    ");
  648.                                 DisplayString(0x0,1,"Next        Show");
  649.                                 TotalDistanceShow=False;        //顯示了AVGSpeed,則表明TotalDistance還沒(méi)有顯示
  650.                                
  651.                                 Delay(250);                                //延時(shí)消除抖動(dòng)                                                                       
  652.                         }       
  653.                         if (AVGSpeedShow==True)                        //已經(jīng)顯示過(guò)AVGSpeed選項(xiàng)了,則顯示下一個(gè)選項(xiàng)
  654.                         {                                                        //即第一次選擇了Next鍵
  655.                                 WriteCmd(LCD_CLS);
  656.                                 DisplayString(0x0,0," Total Distance ");
  657.                                 DisplayString(0x0,1,"Next        Show");
  658.                                 TotalDistanceShow=True;                                    //表明顯示了TotalDistance選項(xiàng)       

  659.                                 Delay(250);                                                        //延時(shí)消除抖動(dòng)
  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;                         //按下了確定鍵,那么這個(gè)時(shí)候開(kāi)啟返回鍵的功能
  676.                                
  677.                                 Delay(250);                                        //延時(shí)消除抖動(dòng)                               
  678.                         }
  679.                         TotalDistanceShow=False;                                       
  680.                 }

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

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

  687.                 /*如果沒(méi)有返回主菜單,則繼續(xù)檢測(cè)Next鍵和確定鍵*/
  688.         
  689.                 while(1)
  690.                 {                            
  691.                         if (Next==True)
  692.                                 break;
  693.                         if (SelectedShow==True)
  694.                                 break;
  695.                 }
  696.                
  697.                 /*按下Next鍵,顯示下一個(gè)選項(xiàng)*/
  698.                 if (Next==True)
  699.                 {
  700.                         Next=False;
  701.                         ReturnMain=False;
  702.                         ReturnSelection=False;                             //按下了Next鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能       
  703.                         if (TotalDistanceShow==True)
  704.                                 ReturnMain=True;
  705.                         if (TotalDistanceShow==False)                //還沒(méi)有顯示TotalDistance選項(xiàng),顯示它
  706.                         {                                                                               
  707.                                 WriteCmd(LCD_CLS);
  708.                                 DisplayString(0x0,0," Total Distance ");
  709.                                 DisplayString(0x0,1,"Next        Show");
  710.                                 TotalDistanceShow=True;                                        
  711.                                
  712.                                 Delay(250);                                                //延時(shí)消除抖動(dòng)                                               
  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選項(xiàng)的內(nèi)容還沒(méi)有顯示
  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);                                        //延時(shí)消除抖動(dòng)
  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;                 //按下了確定鍵,那么這個(gè)時(shí)候開(kāi)啟返回鍵的功能

  740.                                         Delay(250);                                        //延時(shí)消除抖動(dòng)
  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)                                                            //所有菜單項(xiàng)已經(jīng)顯示完畢,返回主菜單
  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);                                                //延時(shí)消除抖動(dòng)                                                       
  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; //按下了確定鍵,那么這個(gè)時(shí)候開(kāi)啟返回鍵的功能

  789.                                         Delay(250);                                        //延時(shí)消除抖動(dòng)
  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)                                                     //所有菜單項(xiàng)已經(jīng)顯示完畢,返回主菜單
  808.                 {
  809.                         Next=False;
  810.                         ReturnMain=False;
  811.                         ReturnSelection=False;
  812.                         if (TotalDistanceShow==True)                        //最后一個(gè)選項(xiàng)已經(jīng)顯示完畢,返回主菜單
  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;                 //按下了確定鍵,那么這個(gè)時(shí)候開(kāi)啟返回鍵的功能

  834.                                         Delay(250);                                        //延時(shí)消除抖動(dòng)
  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驅(qū)動(dòng)模塊                                                                **
  864. \****************************************************************************************/

  865. /*---------------------------------  LCD初始化函數(shù)--------------------------------------*/

  866. void LCDInit(void)
  867. {
  868.     //三次顯示模式設(shè)置
  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);                                                        //關(guān)顯示
  879.         WriteCmd(LCD_CLS);                                                                //清屏幕
  880.         WriteCmd(LCD_EnterSet);                                                        //光標(biāo)移動(dòng)設(shè)置
  881.         WriteCmd(LCD_DispCtr);                                                        //顯示開(kāi)以及光標(biāo)設(shè)置
  882.        
  883. }

  884. /*---------------------------------  LCD模式設(shè)置函數(shù)--------------------------------------*\
  885.        
  886.         SetWriteCmd()                                  設(shè)置LCD為寫(xiě)命令模式
  887.         SetReadCmd()                                       設(shè)置LCD為讀命令模式
  888.         SetWriteData()                                設(shè)置LCD為寫(xiě)數(shù)據(jù)模式
  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功能執(zhí)行函數(shù)--------------------------------------*\
  907.        
  908.         WriteCmd()                                        寫(xiě)命令
  909.         WriteData()                                        寫(xiě)數(shù)據(jù)
  910.         ExecuteCmd()                                        執(zhí)行命令
  911.         SetXY()                                                顯示定位
  912.         DisplaySingleChar()                        顯示單個(gè)字符
  913.         DisplayString()                                顯示一串字符
  914.         IsBusy()                                                忙標(biāo)志檢測(cè)
  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. /*-------------------------------------    延時(shí)函數(shù)  -------------------------------------*/
  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;                                        //計(jì)算瞬時(shí)速度
  988.         Distance+=Speed;                                                                //計(jì)算距離                                               
  989.         SpeedCount=0;
  990.        
  991. }
  992. /*-------------------------------------  顯示時(shí)間 ----------------------------------------*/
  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)                                  //時(shí)間未夠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;                                                                          //開(kāi)總中斷
  1107.         IT0=1;                                                                          //INTO邊沿觸發(fā)
  1108.         PX0=1;                                                                    //INTO優(yōu)先級(jí)為高級(jí)
  1109.         EX1=1;                                                                          //開(kāi)INT1中斷
  1110.         IT1=1;                                                                          //INT1邊沿觸發(fā)
  1111.         PX1=1;                                                                    //INT1優(yōu)先級(jí)為高級(jí)
  1112.         Clock0_Init();                                                   //初始化時(shí)鐘中斷
  1113.         TMOD=0x11;                                                                  //T0/T1定時(shí)方式1
  1114.         ET0=0x01;                                                                //開(kāi)T0中斷
  1115.         ET1=0x01;                                                               //開(kāi)T1中斷
  1116. }

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

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

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

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

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

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




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

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

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

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

  1186. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


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

使用道具 舉報(bào)

沙發(fā)
ID:203943 發(fā)表于 2017-7-27 16:17 | 只看該作者
謝謝分享 再學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

地板
ID:225338 發(fā)表于 2017-8-7 04:41 來(lái)自手機(jī) | 只看該作者
太高端了
回復(fù)

使用道具 舉報(bào)

5#
ID:265318 發(fā)表于 2018-1-11 13:11 來(lái)自手機(jī) | 只看該作者
學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

6#
ID:254856 發(fā)表于 2018-1-27 15:16 | 只看該作者
謝謝啊
回復(fù)

使用道具 舉報(bào)

7#
ID:419428 發(fā)表于 2018-11-1 22:18 | 只看該作者
厲害,厲害
回復(fù)

使用道具 舉報(bào)

8#
ID:418342 發(fā)表于 2018-11-2 17:28 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线一区二区三区 | 日本亚洲精品成人欧美一区 | 日本视频免费观看 | 久久精品99 | 精品三级在线观看 | 成人免费在线视频 | 成人精品久久 | 男女激情网站免费 | 99精品一区二区三区 | 欧美一级欧美三级在线观看 | 欧美国产精品一区二区三区 | 国产精品一区二区在线 | 国产欧美日韩在线一区 | av一区在线 | 二区三区视频 | 国产一二区视频 | 欧美激情一区二区三级高清视频 | 亚洲一区二区久久久 | 国产精品精品久久久 | 成人国产精品色哟哟 | 天天干人人 | 国产精品欧美精品日韩精品 | 成人三级在线观看 | 日韩精品一区二区三区久久 | www.中文字幕av | 97精品一区二区 | 日韩成人免费av | 成人影院av | 麻豆hd | 蜜桃五月天 | 国产精久久久久久 | 中文区中文字幕免费看 | 欧美a级成人淫片免费看 | 激情一区二区三区 | 午夜欧美 | 视频一区二区中文字幕日韩 | 亚洲综合首页 | 蜜桃视频一区二区三区 | 亚洲免费视频网站 | 欧美三级电影在线播放 | 色999视频|