找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1910|回复: 3
打印 上一主题 下一主题
收起左侧

怎么用stc89c52rc单片机的两个定时器,一个想用超声波测距,一个用来pwm调速

[复制链接]
跳转到指定楼层
楼主
ID:836885 发表于 2020-12-19 14:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
500黑币
这是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;      
}

最佳答案

查看完整内容

#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=0x ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:833325 发表于 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;
}
用这个定时器试试。
回复

使用道具 举报

板凳
ID:748788 发表于 2020-12-19 15:43 | 只看该作者
先用proteus作个仿真看看效果,坛子里有不少实例可参考
回复

使用道具 举报

地板
ID:762872 发表于 2021-4-20 22:25 来自手机 | 只看该作者
楼主可以分享下程序吗?我这个调了两天了还是没有进展
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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