智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8397|回复: 18
打印 上一主题 下一主题

[编程类] 求STC89C52程序,光电小车

  [复制链接]

10

主题

46

帖子

0

精华

高级会员

Rank: 4

积分
939
QQ
威望
527
贡献
268
兑换币
28
注册时间
2010-9-7
在线时间
72 小时
跳转到指定楼层
1#
发表于 2010-12-26 16:01:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3贡献
我要做个寻迹小车,单片机是STC89C52,用的是LM2940-5.0的稳压芯片,10个红外光电管(距离36,24.5,24.5,24.5,18.5,24.5,24.5,24.5,36),futaba s3010的舵机,硬件已经弄得差不多了,现在不会弄程序,希望有大虾能帮我解决问题!在下感激不尽!(校内赛,程序不用很复杂,简单点就好)

最佳答案

查看完整内容

回复 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=100) {t=0;} }

7

主题

198

帖子

0

精华

金牌会员

酱油桶

Rank: 6Rank: 6

积分
2286
威望
1661
贡献
253
兑换币
74
注册时间
2010-1-5
在线时间
186 小时
2#
发表于 2010-12-26 16:02:00 | 只看该作者
回复 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;}
}
回复

使用道具 举报

7

主题

198

帖子

0

精华

金牌会员

酱油桶

Rank: 6Rank: 6

积分
2286
威望
1661
贡献
253
兑换币
74
注册时间
2010-1-5
在线时间
186 小时
3#
发表于 2010-12-26 18:39:22 | 只看该作者
换单片机吧,STC有带PWM的,比C52好用多了
回复

使用道具 举报

10

主题

46

帖子

0

精华

高级会员

Rank: 4

积分
939
QQ
威望
527
贡献
268
兑换币
28
注册时间
2010-9-7
在线时间
72 小时
4#
 楼主| 发表于 2010-12-26 21:14:35 | 只看该作者
回复 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. }
复制代码
回复

使用道具 举报

21

主题

348

帖子

0

精华

功勋会员

大将

Rank: 10Rank: 10Rank: 10

积分
9534

资源大师奖章论坛骨干奖章优秀版主奖章

QQ
威望
827
贡献
8337
兑换币
0
注册时间
2009-11-17
在线时间
185 小时
5#
发表于 2010-12-26 21:28:37 | 只看该作者
如果是定时输出方波的办法,就会很不稳定,并且延时也不准,主程序运行也受影响,起码速度是不行的啦
回复

使用道具 举报

22

主题

351

帖子

2

精华

跨届大侠

physicsboy.taobao.com

Rank: 10Rank: 10Rank: 10

积分
9030

论坛元老奖章资源大师奖章活跃会员奖章优秀会员奖章热心会员奖章论坛骨干奖章

QQ
威望
2985
贡献
5441
兑换币
12
注册时间
2010-8-17
在线时间
302 小时
6#
发表于 2010-12-26 22:20:06 | 只看该作者
PWM请用STC自带的PWM模块,写PWM寄存器可以改占空比
回复

使用道具 举报

7

主题

198

帖子

0

精华

金牌会员

酱油桶

Rank: 6Rank: 6

积分
2286
威望
1661
贡献
253
兑换币
74
注册时间
2010-1-5
在线时间
186 小时
7#
发表于 2010-12-26 23:47:59 | 只看该作者
回复 3# sb030706


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

    我把以前写过的一个程序发给你,祝你早日成功!
回复

使用道具 举报

10

主题

46

帖子

0

精华

高级会员

Rank: 4

积分
939
QQ
威望
527
贡献
268
兑换币
28
注册时间
2010-9-7
在线时间
72 小时
8#
 楼主| 发表于 2010-12-26 23:50:49 | 只看该作者
那stc89c52rc到底带不带PWM啊?
回复

使用道具 举报

10

主题

46

帖子

0

精华

高级会员

Rank: 4

积分
939
QQ
威望
527
贡献
268
兑换币
28
注册时间
2010-9-7
在线时间
72 小时
9#
 楼主| 发表于 2010-12-26 23:50:55 | 只看该作者
那stc89c52rc到底带不带PWM啊?
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
威望
190
贡献
53
兑换币
0
注册时间
2010-11-14
在线时间
15 小时
10#
发表于 2010-12-28 12:21:29 | 只看该作者
貌似不带
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-16 19:14 , Processed in 0.053700 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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