单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1652|回复: 3
收起左侧

简易小车简单行驶程序

[复制链接]
daming 发表于 2014-12-30 23:42 | 显示全部楼层 |阅读模式
  1. /* 程序名称:简易小车简单行驶程序
  2. 功    能;用AT89S52、两个步进电机、红外线遥控控制小车的简易行驶
  3. 运行环境:Keil Uvision2.0
  4. 程序说明:红外线数据接受部分的程序未写,变速可用变速箱
  5. 制    作:hankjulianth
  6. */
  7. #include"reg52.h"
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. uint temp=0x88;
  11. uint temp1=0x08;
  12. uint temp2=0x80;
  13. uint temp3=0x11;
  14. sbit A1=P0^0;
  15. sbit B1=P0^1;
  16. sbit C1=P0^2;
  17. sbit D1=P0^3;
  18. sbit A2=P0^4;
  19. sbit B2=P0^5;
  20. sbit C2=P0^6;
  21. sbit D2=P0^7;
  22. void start();//小车启动函数
  23. void Rstart();//启动倒退函数
  24. void timestart();//设计计时函数
  25. sbit CTR1=P3^0;//左电机1停止-左转弯-控制信号
  26. uint T1;//每次左转弯时间   =T1*50ms
  27. sbit CTR2=P3^1;//右电机2停止-右转弯-控制信号
  28. uint T2;//每次右转弯时间   =T2*50ms
  29. uint T3;//每次倒退时间    =T3*50ms
  30. void set(Recieve()); //设置转弯时间函数
  31. sbit CTR=P3^2;//启动信号
  32. sbit RCTR=P3^3;//倒退控制信号
  33. void delay();//延迟函数
  34. void _init_();//转弯中断初始函数
  35. void Recieve();//红外线数据接受函数,包括T1、T2、CRT、CRT1、CRT2的状态
  36. void main()
  37. {
  38. while(1)
  39. {
  40.   while(CTR)
  41.   {
  42.    set(Recieve());
  43.    start();
  44.    while(CRT1)
  45.    {        //t以毫秒为单位
  46.     _init_();
  47.     P0=temp1;
  48.     temp1>>=1;
  49.     if(temp1==0x0)
  50.     {temp1=0x08;}
  51.     delay();
  52.     if(t==T1)
  53.     {CRT1=0;}//中断停止左转弯
  54.    }
  55.    while(CRT2)
  56.    {
  57.     _init_();
  58.     P0=temp2;
  59.     temp2>>=1;
  60.     if(temp2==0x0)
  61.     {temp2=0x80;}
  62.     void delay();
  63.     if(t==T2)
  64.     {CRT2=0;}//中断停止右转弯
  65.    }
  66.    while(RCTR)
  67.    {Rstart();
  68.     if(t==T3)
  69.     {RCTR=0;}//中断停止倒退
  70.    }
  71.   }
  72.   delay();

  73. }
  74. }
  75. void _init_()
  76. {
  77. TMOD=0x01;
  78. TH0=(65536-50000)/256;
  79. TL0=(65536-50000)%256;
  80. TR0=1;
  81. EA=1;
  82. ET0=1;
  83. t=0;

  84. }
  85. void timer0() interrupt 1
  86. {
  87. TMOD=0x01;
  88. TH0=(65536-50000)/256;
  89. TL0=(65536-50000)%256;
  90. TR0=1;
  91. EA=1;
  92. ET0=1;
  93. t++;

  94. }
  95. void set(Recieve())
  96. {
  97. T1=x;
  98. T2=y;
  99. }
  100. void start()
  101. {
  102. P0=temp;
  103. temp>>=1;
  104. if(temp==0x0)
  105. {temp=0x88;}
  106. }
  107. void Rstart()
  108. {
  109. P0=temp3;
  110. temp3<<=1;
  111. if(temp3==0)
  112. {
  113.   temp1=0x11;
  114. }
  115. }
  116. void delay()
  117. {
  118. uint i,j;
  119. for(i=20;i>0;i--)
  120.   for(j=10;j>0;j--);
  121. }
复制代码


回复

使用道具 举报

 楼主| daming 发表于 2014-12-30 23:42 | 显示全部楼层
改进版:
  1. /* 程序名称:简易小车简单行驶程序
  2. 功    能;用AT89S52、两个步进电机、红外线遥控控制小车的简易行驶
  3. 运行环境:Keil Uvision2.0
  4. 程序说明:红外线数据接受部分的程序补上,变速可用变速箱
  5. 制    作:hankjulianth
  6. */
  7. #include"reg52.h"
  8. #include"stdio.h"
  9. #include"intrins.h"
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. uint temp=0x88;
  13. uint temp1=0x08;
  14. uint temp2=0x80;
  15. uint temp3=0x11;
  16. sbit A1=P0^0;
  17. sbit B1=P0^1;
  18. sbit C1=P0^2;
  19. sbit D1=P0^3;
  20. sbit A2=P0^4;
  21. sbit B2=P0^5;
  22. sbit C2=P0^6;
  23. sbit D2=P0^7;
  24. uint t=0;
  25. void start();//小车启动函数
  26. void Rstart();//启动倒退函数
  27. void timestart();//设计计时函数
  28. sbit CTR1=P3^0;//左电机1停止-左转弯-控制信号
  29. //uint T1=40;//每次左转弯时间   =T1*50ms
  30. sbit CTR2=P3^1;//右电机2停止-右转弯-控制信号
  31. //uint T2=40;//每次右转弯时间   =T2*50ms
  32. //uint T3=40;//每次倒退时间    =T3*50ms
  33. sbit CTR=P3^2;//启动信号
  34. sbit RCTR=P3^3;//倒退控制信号
  35. sbit STOP=P3^4;//停止键控制信号
  36. void delay();//延迟函数
  37. void _init_();//转弯中断初始函数
  38. //*****************************************************************
  39. //红外控制程序段
  40. //*****************************************************************

  41. unsigned char  irtime;//红外用全局变量

  42. bit irpro_ok,irok;
  43. unsigned char IRcord[4];
  44. unsigned char   irdata[33];
  45. sbit IR=P3^2;//红外接口标志
  46. void Ircordpro()//红外码值处理函数
  47. {
  48. uchar i,j,k;
  49. uchar cord,value;
  50. k=1;
  51. for(i=0;i<4;i--)//处理4个字节
  52. {
  53.   for(j=8;j>0;j--)//处理一个字节八位
  54.   {
  55.    cord=irdata[k];
  56.    if(cord>7)//大于某值为1
  57.    {value=value|0x08;}
  58.    else
  59.    {value=value;}
  60.    if(j>0)
  61.    {value=value>>1;}
  62.    k++;
  63.   }
  64. IRcord[i]=value;
  65. value=0;
  66. }
  67. irpro_ok=1;//处理完毕标志位置1
  68. }
  69. //******************************************************************
  70. void Ir_work()//红外键值散转程序
  71. {
  72. switch(IRcord[2])//判断第三个数码值
  73. {
  74.   case 0:CTR=1;break;//各键实现的功能:小车启动键
  75.   case 1:RCTR=1;break;//小车倒退键
  76.   case 3:CTR2=1;break;//小车右转弯键
  77.   case 4:CTR1=1;break;//小车左转弯键
  78.   case 5:STOP=0;break;//小车停止键
  79. }
  80. irpro_ok=0;//处理完成标志
  81. }
  82. //******************************************************************
  83. void ex0 () interrupt 0 using 0//外部中断0服务函数
  84. {
  85. static uchar i;
  86. static bit startflag;
  87. if(startflag)
  88. {
  89.   if(irtime<42&&ritime>=33)//引导码TC9012的头码
  90.   {
  91.    i=0;
  92.    irdata[i]=irtime;//一次存储32位电平宽度
  93.    irtime=0;
  94.    i++;
  95.    if(i=33)
  96.    {
  97.     irok=1;
  98.     i=0;
  99.    }
  100.   }
  101.   else
  102.   {irtime=0;startflag=1;}
  103. }
  104. }
  105. //******************************************************************
  106. void tim1 (void) interrupt 3 //定时器1中断服务函数
  107. {
  108.   irtime++;
  109. }
  110. void RAD_RESERCH();//红外检测函数
  111. {
  112.   IT0=1;//外部0中断开启
  113.   EX0=1;
  114.      EA=1;
  115.   TMOD=0x11;
  116.   ET1=1;//开启定时器1中断
  117.   TH1=0;
  118.      TL1=0;
  119.    

  120. if(irok)
  121.    {  
  122.     Ircordpro();//码值处理
  123.      irok=0;
  124.    }

  125.     if(irpro_ok)//step press key
  126.    {
  127.     Ir_work();//码值识别散转
  128.      }
  129. }
  130. //***************************************************结束
  131. //******************************************************************
  132. void main()
  133. {
  134. while(1)
  135. {//***********************************************红外控制检测
  136.      RAD_RESERCH();
  137.       //红外检测结束
  138.   while(CTR)
  139.   {
  140.    RAD_RESERCH();
  141.    start();
  142.    while(CTR1)
  143.    {        //t以毫秒为单位
  144.     _init_();
  145.     P0=temp1;
  146.     temp1>>=1;
  147.     if(temp1==0x0)
  148.     {temp1=0x08;}
  149.     delay();
  150.     if(t==40)
  151.     {CTR1=0;t=0;}//中断停止左转弯
  152.    }
  153.    while(CTR2)
  154.    {
  155.     _init_();
  156.     P0=temp2;
  157.     temp2>>=1;
  158.     if(temp2==0x0)
  159.     {temp2=0x80;}
  160.     void delay();
  161.     if(t==40)
  162.     {CTR2=0;t=0;}//中断停止右转弯
  163.    }
  164.    while(RCTR)
  165.    {  
  166.     Rstart();
  167.     if(t==40)
  168.     {RCTR=0;t=0;}//中断停止倒退
  169.    }
  170.   }
  171.   delay();

  172. }
  173. }
  174. void _init_()
  175. {
  176. TMOD=0x11;
  177. TH0=(65536-50000)/256;
  178. TL0=(65536-50000)%256;
  179. TR0=1;
  180. EA=1;
  181. ET0=1;
  182. t=0;

  183. }
  184. void timer0() interrupt 1
  185. {
  186. TMOD=0x01;
  187. TH0=(65536-50000)/256;
  188. TL0=(65536-50000)%256;
  189. TR0=1;
  190. EA=1;
  191. ET0=1;
  192. t++;

  193. }
  194. void start()
  195. {
  196. P0=temp;
  197. temp>>=1;
  198. if(temp==0x0)
  199. {temp=0x88;}
  200. }
  201. void Rstart()
  202. {
  203. P0=temp3;
  204. temp3<<=1;
  205. if(temp3==0)
  206. {
  207.   temp1=0x11;
  208. }
  209. }
  210. void delay()
  211. {
  212. uint i,j;
  213. for(i=20;i>0;i--)
  214.   for(j=10;j>0;j--);
  215. }
复制代码
回复

使用道具 举报

whrui5033 发表于 2015-1-12 13:09 | 显示全部楼层
研究研究
回复

使用道具 举报

LHQWELH 发表于 2015-1-18 10:50 | 显示全部楼层
ZHENHAO
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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