智能车制作

标题: 求STC89C52程序,光电小车 [打印本页]

作者: sb030706    时间: 2010-12-26 16:01
标题: 求STC89C52程序,光电小车
我要做个寻迹小车,单片机是STC89C52,用的是LM2940-5.0的稳压芯片,10个红外光电管(距离36,24.5,24.5,24.5,18.5,24.5,24.5,24.5,36),futaba s3010的舵机,硬件已经弄得差不多了,现在不会弄程序,希望有大虾能帮我解决问题!在下感激不尽!(校内赛,程序不用很复杂,简单点就好)
作者: kurui365    时间: 2010-12-26 16:02
回复 3# sb030706

既然这样建议你在定时器中断里边写PWM的代码,比如你要产生50%占空比的方波(周期你应该会设置),你可以这样写

void time0(void) interrupt 1 using 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;    //定时器中断周期=100us,PWM频率=10k÷100=100hz
if(t<zkb)       //zkb的值即为占空比,此时应为50
  pwm_out=1;//输出高电平
else
  pwm_out=0;//输出低电平
if(t>=100)
{t=0;}
}
作者: kurui365    时间: 2010-12-26 18:39
换单片机吧,STC有带PWM的,比C52好用多了
作者: sb030706    时间: 2010-12-26 21:14
回复 2# kurui365


    学校要求用这个芯片啊,想请教能否PWM用定时器输出方波,使用占空比调啊???小弟新手,还请大虾帮帮小弟改改啊sb030706@126.com
  1. #include<reg52.h>
  2. #define temp P0 //光电管接入口
  3. #define middleline 0xe7 //光电检测中间线
  4. #define startline 0x24 //起跑线
  5. #define outline 0xff //检测不到黑线
  6. unsigned char num0=0; //计数初值
  7. unsigned char round=14; //舵机参数初值,设置为中间位置
  8. unsigned char speedup=8; //电机参数初值,设置为最大速度
  9. unsigned char num1=0; //计数初值
  10. sbit servopwm=P2^0; //舵机PWM输出口
  11. sbit motorpwm1=P2^6; //电机PWM1输出口
  12. sbit motorpwm2=P2^7; //电机PWM2输出口
  13. void init() //中断初始化
  14. {
  15. TMOD=0x11; //定时器方式1
  16. EA=1; //开总中断
  17. ET0=1; //允许定时器0中断
  18. ET1=1; //允许定时器1中断
  19. TH0=(65536-100)/256; //装入初值,高八位取模,100在定时器中12M下表示100us
  20. TL0=(65536-100)%256; //装入初值,低八位取余
  21. TH1=(65536-50)/256;
  22. TL1=(65536-50)%256;
  23. TR0=1; //启动中断
  24. TR1=1; //启动中断
  25. servopwm=1; //舵机初始为高电平
  26. motorpwm1=0; //IN1初始为低电平
  27. motorpwm2=1; //IN2初始为高电平
  28. }
  29. void timer0() interrupt 1 //定时器0方式1
  30. {
  31. TH0=(65536-100)/256; //读初值
  32. TL0=(65536-100)%256;
  33. num0++;
  34. if(num0==round) //高电平持续时间为round
  35. servopwm=0;
  36. if(num0==200) //舵机周期为10ms
  37. {
  38. servopwm=1;
  39. num0=0;
  40. }
  41. }
  42. void timer1() interrupt 3 //定时器1方式3
  43. {
  44. TH1=(65536-50)/256;
  45. TL1=(65536-50)%256;
  46. num1++;
  47. if(num1==speedup)
  48. {
  49. motorpwm1=1;
  50. motorpwm2=0;
  51. }
  52. if(num1==100) //电机周期为1ms
  53. {
  54. motorpwm1=0;
  55. motorpwm2=1;
  56. num1=0;
  57. }
  58. }
  59. void main() //主函数
  60. {
  61. init(); //初始化
  62. while(1)
  63. {
  64. if(temp==0xe7) //检测为中间线
  65. {
  66. round=14;
  67. speedup=8;
  68. }

  69. else
  70. {
  71. switch(temp)
  72. {
  73. case 0xf7:{round=11;speedup=12;};break; //P0:11110111
  74. case 0xf3:{round=11;speedup=16;};break; //P0:11110011
  75. case 0xfb:{round=10;speedup=20;};break; //P0:11111011
  76. case 0xf9:{round=9;speedup=24;};break; //P0:11111001
  77. case 0xfd:{round=8;speedup=28;};break; //P0:11111101
  78. case 0xfc:{round=7;speedup=36;};break; //P0:11111100
  79. case 0xfe:{round=6;speedup=55;};break; //P0:11111110
  80. case 0x7f:{round=19;speedup=55;};break; //P0:01111111
  81. case 0x3f:{round=17;speedup=36;};break; //P0:00111111
  82. case 0xbf:{round=16;speedup=28;};break; //P0:10111111
  83. case 0x9f:{round=15;speedup=24;};break; //P0:10011111
  84. case 0xdf:{round=14;speedup=20;};break; //P0:11011111
  85. case 0xcf:{round=13;speedup=16;};break; //P0:11001111
  86. case 0xef:{round=13;speedup=12;};break; //P0:11101111
  87. default: break;
  88. }
  89. }
  90. }
  91. }
复制代码

作者: baoge    时间: 2010-12-26 21:28
如果是定时输出方波的办法,就会很不稳定,并且延时也不准,主程序运行也受影响,起码速度是不行的啦
作者: physics_boy    时间: 2010-12-26 22:20
PWM请用STC自带的PWM模块,写PWM寄存器可以改占空比
作者: kurui365    时间: 2010-12-26 23:47
回复 3# sb030706


    要是别人帮你改就没意思了,你可以借鉴别人写的例程然后自己找问题,这样才能真正学到东西,你说是吧?

    我把以前写过的一个程序发给你,祝你早日成功!
作者: sb030706    时间: 2010-12-26 23:50
那stc89c52rc到底带不带PWM啊?
作者: sb030706    时间: 2010-12-26 23:50
那stc89c52rc到底带不带PWM啊?
作者: hemin    时间: 2010-12-28 12:21
貌似不带
作者: 薨莀    时间: 2010-12-29 13:40
肯定地说:不带!12c系列的话就有自带的PWM~
作者: kerrys    时间: 2010-12-30 09:30
用软件延时的方法产生PWM信号,举例:高电平(给1),延时x,低电平(给0),延时y,占空比=x/x+y
作者: anxingle    时间: 2010-12-30 10:28
回复 5# baoge


    STC 有自带的PWM模块吗?不是和定时器在一起吗?
作者: baoge    时间: 2010-12-30 19:34
有的stc单片机有自带pwm功能,常用的单片机就没有,你可以去宏晶公司网站上看看
作者: znfc2    时间: 2010-12-30 20:35
都是高手
作者: hbzhh2008@163    时间: 2011-1-2 14:35
回复 11# 薨莀


    正解
作者: sonwendi    时间: 2011-1-2 15:08
datasheet上写的有嘛,52RC不带,换个单片机吧~
作者: strong    时间: 2016-5-9 13:01
#在这里快速回复#
作者: TTmartin    时间: 2016-12-27 20:57
kurui365 发表于 2010-12-26 23:47
回复 3# sb030706

前辈,给我也发一份51的程序资料吧,我自己看看1216384102@qq.com





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2