标题:
怎么用stc89c52rc单片机的两个定时器,一个想用超声波测距,一个用来pwm调速
[打印本页]
作者:
学习小白242人才
时间:
2020-12-19 14:05
标题:
怎么用stc89c52rc单片机的两个定时器,一个想用超声波测距,一个用来pwm调速
这是PWM的程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P3^7;//PWM
uchar time;
void main()
{
TMOD=0x01;
TH0=0xff;
TL0=0xf7;
EA=1;
ET0=1;
TR0=1;
while(1)
{
}
}
void tim0() interrupt 1 //风速调节
{
TR0=0;
TH0=0xff;
TL0=0xf7;
TR0=1;
time++;
if(time>=100) //1khz
time=0;
if(time<=75) //超高20,高45,中60,低75,80以上无
PWM=1;
else if(time>90)
PWM=1;
else
PWM=0;
}
这是超声波测距的程序
#include "reg51.h"
#include "LQ12864.h"
#include "CHAO.h"
/***************************主函数****************************************/
void main(void)
{
InitIRQ(); //定时器的初始化
while(1)
{
int num=0; //数字初值为0
StartModule(); //启动超声波模块
while(!ECH0); //当超声波模块接收口输出低电平则等待
TR0=1; //开启计数
while(ECH0); //当RX为1计数并等待
TR0=0; //关闭计数
num=Conut(); //读取定时器的值,计算
}
}
#include <intrins.h> /*为了使用_nop_()函数而加*/
sbit ECH0=P3^4; //串行数据ECH0 ---- P1.1
sbit TRIG=P3^5; //串行时钟TRIG ---- P1.2
unsigned int time=0;
unsigned int Distance=0;//距离
bit flag =0; //中断溢出标志
/*********** 定时器的初始化 ***********/
void InitIRQ(void)
{
TMOD=0x01;
TH0=0; //定时器T0高八位初始化,用于判断测距溢出,最大65.536 ms
TL0=0; //定时器T0低八位初始化
ET0=1; //T0中断允许
TR0=1; //开启定时器0
EA=1; //开启总中断
}
/*********** 触发超声波模块 ***********/
void StartModule() //超声波模块Trig控制端给大于10us的高电平触发模块测距
{
TRIG=1;
_nop_(); //1_nop_()延迟一个机器周期
_nop_(); //2
_nop_(); //3
_nop_(); //4
_nop_(); //5
_nop_(); //6
_nop_(); //7
_nop_(); //8
_nop_(); //9
_nop_(); //10
_nop_(); //11
_nop_(); //12
_nop_(); //13
_nop_(); //14
_nop_(); //15
_nop_(); //16
_nop_(); //17
_nop_(); //18
_nop_(); //19
_nop_(); //20
TRIG=0;
}
/*********** 定时器T0计数 ***********/
int Conut(void)
{
time=TH0*256+TL0; //定时器T0的低8位加上高八位为计时的时间
TH0=0; //定时器T0高八位初始化,,用于判断测距溢出,最大65.536 ms
TL0=0; //定时器T0低八位初始化
Distance =(time * 1.87)/100; //CM (见代码最后注释) time * 1/58
if(flag==1) //超出测量
{
flag=0;
}
return Distance;
}
/*********** 定时器T0中断服务函数 ***********/
void Timer0IRQ() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1;
}
作者:
易照龙
时间:
2020-12-19 14:05
#include "reg52.h"
sbit PWM=P3^7;
unsigned char time1;
void ConfigTimer1()
{
//TMOD&=0x0F;//清空控制位
TMOD|=0x00;//定时器0工作方式0
TH1=0xff;//(65536-10)/256;//赋初值定时
TL1=0xf7;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
}
void timer0() interrupt 3
{
//TR0=0;//赋初值时,关闭定时器
TH1=0xff;//(65536-10)/256;//赋初值定时
TL1=0xf7;//(65536-10)%256;//0.01ms
//TR0=1;//打开定时器
time1++;
if(time1>=100) //1khz
time1=0;
if(time1<(100-Distance)) //占空比%20,可改
PWM=1;
else if(time1>=99)
PWM=1;
else
PWM=0;
}
用这个定时器试试。
作者:
wwh2382
时间:
2020-12-19 15:43
先用proteus作个仿真看看效果,坛子里有不少实例可参考
作者:
xuanhao
时间:
2021-4-20 22:25
楼主可以分享下程序吗?我这个调了两天了还是没有进展
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1