单片机-51控制舵机,这样的一段程序怎么让舵机转得慢一点

问题描述

51控制舵机,这样的一段程序怎么让舵机转得慢一点

/*为9克迷你舵机量身打造的精简51程序。开机后舵机有旋转。之后按下按键key1,舵机开始旋转*/
/*欢迎志同道合的朋友私信交流*/
#include
#define uint unsigned int
#define uchar unsigned char

uchar k; //k表示总时间 因为定时器中断要用到k,所以放在程序头

sbit PWM1=P1^0;
sbit key1=P3^7; //舵机启动开关
void init()
{
TMOD=0X01;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
EA=1;
ET0=1;
TR0=1;
}
void jiman20() //51模拟PWM波函数
{
static uchar flag=0,j=0; //flag当做PWM高电平变宽/变窄的标志;
//j表示高电平持续的时间;k表示总时间.因为重复调用该函数
if(k==200) //第一步:判断计时满20ms.
{
k=0; //k归零
if(flag==0) //标志为0时,高电平标志增加
j++;
else //标志为1时,高电平标志减小
j--;

if(j>=25) //当j=25时,高电平持续时间为2.5ms,此时角度为180.
flag=1; //必须改变宽/窄标志。
if(j<=0) //当j=0时,高电平持续时间为0ms,此时角度为0.
flag=0; //必须改变宽/窄标志。
}
if(k<j) //第二步:在20ms判断结束的基础上,输出PWM
PWM1=1; //因为每20ms,k就归0.所以能通过判断k<j,输出高电平
else PWM1=0;
}

void main()
{
uint i=60000;
init();
while(i--) //一开机就让舵机有一个转动
{
jiman20();
}
while(1)
{
while(key1==0) //当开关打开,启动定时器,进入转动程序并循环
{
TR0=1;
jiman20();
}
TR0=0; //当开关关闭,关闭定时器,舵机保持最末时刻状
}
}

void timer() interrupt 1 //定时器计时0.1ms,即模拟PWM是以0.1s为分度,
//高电平逐渐增加/减少
{
TR0=0;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
TR0=1;
k++;
}

解决方案

可能是让计时器计时的时间长一点,及TH0 TL0的数小一点

时间: 2024-10-29 20:58:19

单片机-51控制舵机,这样的一段程序怎么让舵机转得慢一点的相关文章

问一下大神们,51单片机按键控制音乐播放c语言

问题描述 问一下大神们,51单片机按键控制音乐播放c语言 问一下,单片机按键控制音乐播放,上一首,下一首,重复播放,暂停,这四个引脚用P3.0到P3.3口可以吗?具体怎么实现呢,搞了好久,大神有没有类似的程序,有点心塞,不知道哪里出问题,真心跪求!这个按键控制需不需要用到中断,还是纯粹的控制,谢了 解决方案 这里有一篇文件,你去看看,可以参考一下.http://wenku.baidu.com/link?url=rkANtH-OGn0ECyB6A22j2b-fghVSYgpKJoHzX-7KcVU

单片机编程 小车-单片机编程控制小车停车

问题描述 单片机编程控制小车停车 将小车随意放在两条黑线之间,启动后小车前进,红外检测到黑线时倒退,调试开始计时,检测到后面的黑线时计时结束同时小车前进,前进时间为所计时的一半时间后结束,有left-led和right-led检测到黑线led=0;有back()和run()和stop(),计时程序可以参考void timer1()interrupt 3{ TH1=(65535-1000)/256; TL1=(65535-1000)%256; cunt++;}

单片机 c-有段程序求大神帮忙找找哪里有问题

问题描述 有段程序求大神帮忙找找哪里有问题 是有关AT89c51单片机的c语言程序的,程序主要内容是测温显示以及键盘输入显示,使用keil编程,在protues软件上仿真..仿真结果与预想的有很大差别..希望大神能帮帮忙寻找错误....由于程序偏长,热心的大神可以留下QQ等,我会将程序发到你邮箱里面去的 解决方案 906254242我试试i

new-这段程序怎么修改?为什么没有输出结果?

问题描述 这段程序怎么修改?为什么没有输出结果? int[] iArrary = new int[] { 1, 5, 13, 6, 10, 55, 99, 2, 87, 12, 34, 75, 33, 47 }; for (int i = 0; i < iArrary.Length; i++) { for (int j =i+1; j < iArrary.Length; j++) { if (iArrary[i]>iArrary[j]) { int temp = iArrary[i];

面向对象-请问这段程序的输出是什么 为什么

问题描述 请问这段程序的输出是什么 为什么 public class Test { public static void main(String[] args) { Animal a = new Dog(); a.syaHi(); Animal b = new Bulldog(); b.syaHi(); Dog dog = (Dog)b; dog.syaHi(); check(dog); Bulldog bulldog = (Bulldog)b; check(bulldog); } public

输出-求用c语言编写这么一段程序

问题描述 求用c语言编写这么一段程序 1.用随机产生n个整数,赋给a数组 2.从小到大排序 3.计算最小数的阶乘 4.输出数组内容 解决方案 这个不难,就是先随机n个数放到数组再对数组排序,然后对数组第一个数求阶乘输出,最后输出整个排序过的数组,一步步来很简单 解决方案二: 参考代码段:https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c 解决方案三: 你需要什么样的排序方式?最

求大家使用C++编写一段程序,将.dat文件的数据取出,然后放到8个数组中,谢谢!今晚就需要!

问题描述 求大家使用C++编写一段程序,将.dat文件的数据取出,然后放到8个数组中,谢谢!今晚就需要! 具体内容:用VC时候,编写上位机程序,需要将一个我已知的.dat文件的数据取出,隔8个点放到1个数组里,这样就将数据分到8个数组中了,需要在void CtestDlg::OnPaint()下面进行操作,把.dat数据取出.根本不懂啊,求指点 解决方案 没办法通过.dat后缀这个信息知道你的文件格式.再说你也根本不懂,建议还是去威客网站雇一个人帮你.

求助,已知二叉树前序终序号求后序的下面这段程序的递归部分的意义,看不懂啊

问题描述 求助,已知二叉树前序终序号求后序的下面这段程序的递归部分的意义,看不懂啊 public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); return root; } //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,

用单片机写一个接受串口发过来的程序,由于串口可能发的不止一个数据,

问题描述 用单片机写一个接受串口发过来的程序,由于串口可能发的不止一个数据, 肯定要把所有数据都接受,然后显示出来,怎么写才能把所有数据都接受呢 解决方案 http://blog.163.com/zhangmwen@126/blog/static/1134375022014423103449480/ 解决方案二: 考虑单片机显示就收的数据,那你就要考虑通讯报文的问题,因为单片机接受的时候是一个字节一个字节的收,它没有一串数据的概念.如果是上位机,那你配置好串口的波特率,字节之间的最大延时时间,,