智能车制作
标题:
求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
#include<reg52.h>
#define temp P0 //光电管接入口
#define middleline 0xe7 //光电检测中间线
#define startline 0x24 //起跑线
#define outline 0xff //检测不到黑线
unsigned char num0=0; //计数初值
unsigned char round=14; //舵机参数初值,设置为中间位置
unsigned char speedup=8; //电机参数初值,设置为最大速度
unsigned char num1=0; //计数初值
sbit servopwm=P2^0; //舵机PWM输出口
sbit motorpwm1=P2^6; //电机PWM1输出口
sbit motorpwm2=P2^7; //电机PWM2输出口
void init() //中断初始化
{
TMOD=0x11; //定时器方式1
EA=1; //开总中断
ET0=1; //允许定时器0中断
ET1=1; //允许定时器1中断
TH0=(65536-100)/256; //装入初值,高八位取模,100在定时器中12M下表示100us
TL0=(65536-100)%256; //装入初值,低八位取余
TH1=(65536-50)/256;
TL1=(65536-50)%256;
TR0=1; //启动中断
TR1=1; //启动中断
servopwm=1; //舵机初始为高电平
motorpwm1=0; //IN1初始为低电平
motorpwm2=1; //IN2初始为高电平
}
void timer0() interrupt 1 //定时器0方式1
{
TH0=(65536-100)/256; //读初值
TL0=(65536-100)%256;
num0++;
if(num0==round) //高电平持续时间为round
servopwm=0;
if(num0==200) //舵机周期为10ms
{
servopwm=1;
num0=0;
}
}
void timer1() interrupt 3 //定时器1方式3
{
TH1=(65536-50)/256;
TL1=(65536-50)%256;
num1++;
if(num1==speedup)
{
motorpwm1=1;
motorpwm2=0;
}
if(num1==100) //电机周期为1ms
{
motorpwm1=0;
motorpwm2=1;
num1=0;
}
}
void main() //主函数
{
init(); //初始化
while(1)
{
if(temp==0xe7) //检测为中间线
{
round=14;
speedup=8;
}
else
{
switch(temp)
{
case 0xf7:{round=11;speedup=12;};break; //P0:11110111
case 0xf3:{round=11;speedup=16;};break; //P0:11110011
case 0xfb:{round=10;speedup=20;};break; //P0:11111011
case 0xf9:{round=9;speedup=24;};break; //P0:11111001
case 0xfd:{round=8;speedup=28;};break; //P0:11111101
case 0xfc:{round=7;speedup=36;};break; //P0:11111100
case 0xfe:{round=6;speedup=55;};break; //P0:11111110
case 0x7f:{round=19;speedup=55;};break; //P0:01111111
case 0x3f:{round=17;speedup=36;};break; //P0:00111111
case 0xbf:{round=16;speedup=28;};break; //P0:10111111
case 0x9f:{round=15;speedup=24;};break; //P0:10011111
case 0xdf:{round=14;speedup=20;};break; //P0:11011111
case 0xcf:{round=13;speedup=16;};break; //P0:11001111
case 0xef:{round=13;speedup=12;};break; //P0:11101111
default: break;
}
}
}
}
复制代码
作者:
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