一个单片机C51定时器发射程序 调不通
发布网友
发布时间:2022-08-20 03:59
我来回答
共1个回答
热心网友
时间:2023-10-31 00:01
是发40KHz的
方波
吗,那个I有什么用啊??“
//记录
反向
次数
,达到要求后进行延时
”??发方波没这么麻烦吧,直接定时好25us,来一次中断翻转不就行了吗。
/******************************************************************/
根据补充:不知道你的延时时间是多少,以及开通的时间是多少,从你的
代码
中可以简单的看到,你是发了2个
周期
的方波,然后延时了“Delay(1)”(几个us,很短,意义不大)。在这里假设你发2个周期,停止4个周期来写吧。关于延时的时间建议使用
定时器
中断来做,这样方便。
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
sbit
out=P1^0;
sbit
bIsStop;
//判断停止发送
波形
的标志
unsigned
int
rStopCount;//
停止的时间
计数
unsigned
int
rSendCount;//发送的时间计数
void
t0(void)
interrupt
1
using
0
//中断发射40KHZ方波
{
TL0=0xe7;//
初始化
定时器
TH0=0xe7;
if
(bIsStop)//需要停止了?
{
out=0;//
端口
置0
rStopCount++;//停止的时间累计,25us一次
if
(
rStopCount
>=
8
)//4个周期到了?
{
rStopCount
=
0;//复位
累加器
bIsStop
=
0;//清标志,允许发送
}
}
else
//
原理
同上
{
rSendCount++;
out=!out;
if
(rSendCount
>=
4)
{
rSendCount
=
0;
bIsStop
=
1;
}
}
}
void
main(void)
{
TMOD=0x12;
TL0=0xe7;
TH0=0xe7;
EA=1;
//开中断
PT0=1;
//to溢出中断为最高
优先级
ET0=1;
//开to溢出中断
out=0;
TR0=1;
//to开始工作
while(1)
{;}
}
注:时间可以通过调整rSendCount
,rStopCount
的比较值来重新定义,这里借用了你的中断25us,
如果时间
不是25us的
倍数
的话,可以通过再开一个定时器中断来计时间(或者软件延时也可以@@)。原理就是这样了,
数字
对不对自己
调下
吧。为了这20分,真累啊~~
c51的单片机需要有一个低电平的触发做开关用,可是只有脉冲信号怎么办...
编写软件定时程序,在需要的时间翻转端口电平,也就是取反就行,然后重复执行。如果要用51的定时器,那你可以先算出参数,看看用哪种模式好,最好用自动重装方式,时间一到,开中断把欲输出的端口取反就行。
伺服驱动器怎么接线?
伺服驱动器的接线分为电源接线和信号接线两部分:电源接线:1. 将伺服驱动器的供电电源接到电源插座上。2. 确认电源插座的电压是否与伺服驱动器的电压匹配。3. 将电源线接入驱动器的电源输入端子。信号接线:1. 将伺服驱动器的控制信号线接到编码器线,如果使用的是总线编码器,则将编码器线接入总线。2. 将编码器线接入电机的编码器端子。3. 将电机的速度反馈信号线接入电机的速度反馈端子。4. 将速度反馈信号线接入编码器的速度反馈端子。具体接线方式取决于伺服驱动器的型号和使用场合,建议按照驱动器说明书上的接线图进行接线。驱动---电机:动力线:UVW 接地,这是供电用的 是驱动器到电机上的电机反馈回来的是: A + A-B+B- Z 三相 报警, 伺服使能即:S-ON虽然各种驱动器型号不同,但是原理上都是利用这些线,报警可用可不用,看型号而定
一个关于单片机定时器的问题
定时器的初值跟设置的模式有关,就拿定时器0的模式1(即16位模式)来说 ,由于51系列单片机是8位的,所以需要2个寄存器,高8位称为TH0,低8为称为TL0。定时器的工作原理是输入一个脉冲,寄存器计数+1,等到2个寄存器计数到全部位为1(即11111111 11111111,10进制就是65536),这时,再来一个脉冲,...
51单片机定时器总是慢
把定时器设为优先。中断发生,中断响应程序不要长过定时器,或中断程序里只设一个标志就返回,在主程序里判断这个标志再执行。单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。
51单片机定时中断导致主程序数码管显示出问题
改善方法有3个:1,最简单的,在通信可靠的前提下尽可能提高串口波特率,同时降低发送频率(就是增大定时器中断周期),再把要发送的数据弄少点,能用缩写的就别写一大串。。2,串口发送改为中断方式,这个不细说了,网上有资料。。3,舍弃数码管扫描的软件延时,改用硬件延时(就是把数码管的位的切...
51 单片机 程序出错 不执行定时器中断1 同时delay函数也有错 求高手...
1.独立按键的判断在程序中如果没有用sbit定义过不能写为 P2^n 的形式,在程序体内这种写法表示的是异或 2.中断程序里,进入中断程序以后如果不是特殊需要,先关断自身的中断控制位,退出中断的时候再打开 3.在单片机里写程序的时候能省资源就省,52单片机是8位的,如果变量范围不超过255就不要用int...
51单片机写个程序,好像在中断里面出不来了,主程序只运行了一部分,之后...
只能做最基本的操作,比如置标志位,让一个数加一等,与延时有关的操作千万不要做!你10ms进一次中断,在里面又扫描按键,又显示液晶,这里面花的时间远远地超过10ms,它肯定死在中断里出不来啊,因为你不关闭中断的话它一直10ms进去,最好在中断里设置几个标志位,进中断就让标志位置1,然后出中断...
51单片机程序如下,问定时器为啥没工作,求改错。
判断if(TF0==1)是否满足,这里不满足(因为TF0=0),所以 IF里面所有的东西都没有执行(包括定时器的重装),所以定时器只计数了一次,然后程序结束。你这里不能吧定时器0的重装数据放在主函数里面,这个过程要放在中断函数里面取处理,因此用定时器时,要开启定时器0中断。程序应该这么 写:
51单片机 如何用一个定时器 输出两个占空比周期相同,相位可调的pwm?_百...
用一个定时器可以输出低频率的PWM波。例如定时100uS中断一次,中断4次,第一路置低,中断5次第二路置低,中断10次,两路全部置高电平,就产生了两路1KHz的PWM方波。是 4次还是5 次,在主程序里调 。PWM波的频率不能太高,例如定时器中断时间不能太短,太短的话可能中断程序都执行不完,别提干其它...
51单片机 用一个定时器实现两个功能
随便举个例子://定时器中断 10mS中断一次 void timer0_isr(void) interrupt 1 { if(flag == 0){ //这里是第一件事情 flag = 1;//在主程序处理完第一件事,将此标记清除 } if (++ucCount == 100) //累加100次达到1秒 { ucCount = 0; //复位计数 ioLED = !ioLED;//这是第...
一个小弟正在看c8051f020单片机的程序,遇到了问题。定时器中定时器寄存...
因为定时器是加1运行的,当从255变到0时表示定时时间到,所以要用负数。例如,-2就是254,当2个定时脉冲后定时时间到。