找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5706|回复: 4
收起左侧

基于STC12C5A60S2的电磁循迹小车源码

[复制链接]
ID:254433 发表于 2018-6-16 17:57 | 显示全部楼层 |阅读模式
采用STC12C5A60S2采集AD信号小车循迹

单片机源程序如下:
  1. #include <STC12C5A60S2.H>
  2. #include "intrins.h"
  3. #include "Common.h"         //通用宏定义
  4. #include "delay.h"         //通用延时程序
  5. #include "PWM_TIME.h" //模拟PWM
  6. #include "ADC.H"

  7. #define k1 0.1
  8. #define k2 0.1

  9. void AD_send();

  10. fp32 AD_chuli(uchar *s1, uchar *s2);

  11. fp32 Engine_PWM = Engine_Left;
  12. uchar a1 = 100, a2 = 100;
  13. int error;
  14. uchar flag;
  15. uchar flag1 = 0;
  16. uchar flag2;
  17. extern INT32 kk;

  18. void Init0_Init()
  19. {
  20.         
  21.     IT0 = 1;                        //set INT0 int type (1:Falling 0:Low level)
  22.     EX0 = 1;                        //enable INT0 interrupt
  23.     EA = 1;                         //open global interrupt switch
  24. }
  25. void main(void)
  26. {
  27.         InitADC();
  28.         InitUart();
  29.         Init_PWM_TIME();
  30.         Init0_Init();
  31.         while(1)
  32.         {
  33.                
  34.                
  35.                         if(flag == 1)
  36.                         {
  37.                                 a1 = 0, a2 = 0;
  38.                                 Engine_PWM = Engine_Mid;
  39.                                 error = -150;
  40.                         }
  41.                
  42.                 Engine_PWM = AD_chuli(&a1, &a2);
  43.                 //AD_send();
  44.             change_Motor(a1,a2);
  45.             change_Engine(Engine_PWM);

  46.         }
  47. }

  48. void AD_send()
  49. {
  50.         ShowResult(1); //show ChabneP10
  51.         ShowResult(2); //P11
  52.         ShowResult(3); //P12
  53.         //ShowResult(4);
  54.         //ShowResult(7);
  55.         //ShowResult(6);
  56.         Delay(30);
  57.         
  58. }

  59. fp32 AD_chuli(uchar *s1, uchar *s2)
  60. {
  61.         fp32 temp;
  62.         error = GetADCResult(2) - GetADCResult(1);
  63.         if(flag != 1)
  64.         {
  65.                 if(GetADCResult(1) > GetADCResult(2))
  66.                 {
  67.                         

  68.                                 Engine_PWM = k2 * error + Engine_Mid;
  69.                                 *s1 = 100, *s2 = 100;
  70.                                 flag2 = 1;
  71.                         if(error < -60)
  72.                         {
  73.                                 //Engine_PWM = k2 * error + Engine_Mid;
  74.                                 flag1 = 1;
  75.                                 temp = Engine_PWM;
  76.                                 *s1 = 100, *s2 = 100;
  77.                         }
  78.                         
  79.                         
  80.                 }
  81.                
  82.                 else if(GetADCResult(2) > GetADCResult(1))
  83.                 {
  84.                         
  85.                                 
  86.                                 Engine_PWM = k2 * error + Engine_Mid;
  87.                                 *s1 = 100, *s2 = 100;
  88.                                 flag2 = 2;
  89.                         if(error > 60)
  90.                         {
  91.                                 //Engine_PWM = k2 * error + Engine_Mid;
  92.                                 flag1 = 2;
  93.                                 temp = Engine_PWM;
  94.                                 *s1 = 100, *s2 = 100;
  95.                         }

  96.                 }
  97.         }
  98.         if(GetADCResult(2) == 0  && GetADCResult(1) == 0 && GetADCResult(3) == 0)
  99.         {
  100.                 if(flag != 1)
  101.                 {
  102.                         
  103.                         if(flag2 != 2)
  104.                         {
  105.                                 if(flag1 == 1)
  106.                                 {
  107.                                                 Engine_PWM = temp;*s1 = 100, *s2 = 100;
  108.                                 }
  109.                                 else
  110.                                 {
  111.                                                 Engine_PWM = Engine_Left;
  112.                                 }
  113.                         }
  114.                         else if(flag2 != 1)
  115.                         {
  116.                                 if(flag1 == 2)
  117.                                 {
  118.                                                 Engine_PWM = temp;*s1 = 100, *s2 = 100;
  119.                                 }
  120.                                 else
  121.                                 {
  122.                                         Engine_PWM = Engine_Right;
  123.                                 }
  124.                         }
  125.                         
  126.                 }
  127.         }
  128.         
  129.         
  130.         
  131.         if(Engine_PWM <= Engine_Left)
  132.         {
  133.                         Engine_PWM = Engine_Left;
  134.         }
  135.         else if(Engine_PWM >= Engine_Right)
  136.         {
  137.                         Engine_PWM = Engine_Right;
  138.         }
  139.         
  140.         
  141.         return Engine_PWM;
  142.         
  143. }

  144. void Int0_Routine(void) interrupt 0
  145. {
  146.         
  147.         if(kk >= 100000)
  148.         {
  149.                 flag = 1;
  150.         }
  151.         else
  152.         {
  153.                 flag = 2;
  154.         }
  155.                
  156.         
  157. }

  158. /* 中断服务程序的编号
  159. void Int0_Routine(void) interrupt 0;                 外部中断0(INT0)
  160. void Timer0_Rountine(void) interrupt 1;          定时器0中断
  161. void Int1_Routine(void) interrupt 2;                  外部中断1(INT1)
  162. void Timer1_Rountine(void) interrupt 3;                   定时器1中断
  163. void UART_Routine(void) interrupt 4;                   串口1(UART1)中断
  164. void ADC_Routine(void) interrupt 5;                          A/D转换中断
  165. void LVD_Routine(void) interrupt 6;                        低压检测(LVD)中断
  166. void PCA_Routine(void) interrupt 7;                        PCA中断
  167. void UART2_Routine(void) interrupt 8;                串口2中断
  168. void SPI_Routine(void) interrupt 9                         SPI中断
  169. */
复制代码

所有资料51hei提供下载:
小车控制.zip (119.94 KB, 下载次数: 96)
回复

使用道具 举报

ID:257207 发表于 2019-4-3 23:31 | 显示全部楼层
嘿嘿 学习学习
回复

使用道具 举报

ID:511145 发表于 2019-4-13 14:12 | 显示全部楼层
借鉴一下
回复

使用道具 举报

ID:780742 发表于 2021-3-18 23:38 | 显示全部楼层
问下楼主电磁传感器使用的是什么传感器呢?有没有芯片的中文资料呀?
回复

使用道具 举报

ID:377166 发表于 2022-8-17 11:43 | 显示全部楼层
求分享电路图
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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