找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1495|回复: 3
收起左侧

我封装的超声波传感器HS-SR04的模块,但是想用数码管检验的时候一直用不了

[复制链接]
回帖奖励 15 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:602220 发表于 2020-2-25 22:41 | 显示全部楼层 |阅读模式
本帖最后由 940675854 于 2020-2-25 22:44 编辑

各位大神帮我看看,代码作用是封装后放在一个定时器,跟一些传感器一起,作状态扫描。
检验的时候放在主程序延时800ms不断循环,用一个定时器刷新数码管状态,传感器输出数据放在数组里。但是数码管一直不显示输出.


/************************封装的ultrasonic.c************************/
#include<reg52.h>
#include <intrins.h>
#include"ultrasonic.h"

unsigned int t=0;
unsigned char k=0;
unsigned int sum=0;
unsigned int s=0;


void nops(unsigned int nop)
{
while(nop--)
{
  _nop_();
}
}
unsigned  int getDistance()
{
TH1=TL1=0;//清除计时器,为下一次测距做准备
EX1=1;//打开外部中断INT0
Trig=1;
nops(10);//触发信号延时
Trig=0;
TR1=1;//打开定时器开始计时
return t;//340/2*(t/1000/10)cm
}
unsigned int  getdis()
{
unsigned char N=5;//样本数量
unsigned char k=N;
unsigned int sum=0;
while(k--)
{
  sum+=getDistance();
}
return sum/N;
}
/*************************************************/
void Timer1Init()
{
TMOD &= 0x0F;  //设置定时器模式
TMOD |= 0x10;  //设置定时器模式
TL1 = 0x00;   //设置定时初值
TH1 = 0x00;   //设置定时初值
TF1 = 0;    //清除TF1标志
ET1 = 1;   
TR1 = 0;    //定时器1开始计时
  EA = 1;                     
}
char over=0;
void Interrupt_time1() interrupt 3     //T0中断用来计数器溢出,超过测距范围
{
    over=1;        //中断溢出标志
}
/*******************************************************/
void extern1Init(void)
{
IE1  = 0;             //将INT1中断请求标志位清"0"
EX1 = 1;             //使能INT1中断允许位
IT1 = 1;                   //选择INT1为下降沿触发方式
EA = 1;                     //允许总中断
}


void Interrupt_exter1() interrupt 2
{
TR0=0;//进入外部中断INT0后停止计时
t=(TH1*256+TL1);//计算定时器时间
t=(t*1.87)/100;
if(t>420||over==1)
{
  t=420;
  over=0;
}
TH1=TL1=0;//清除计时器,为下一次测距做准备
}
/*************************************************/

/***************************************主程序*******************/
#include<reg52.h>
#include"main.h"
#include"ultrasonic.h"
#include"smg.h"
void main(void)
{
unsigned char S;
Timer2Init();
Timer1Init();
extern1Init();
while(1)
{
  S = getdis();
  if(S>=4000) //超出测量范围显示“ERR0”
  {  
   disbuff[0]=0x3f;    //“-”
   disbuff[1]=0x50;    //“-”
   disbuff[2]=0x50;    //“-”
   disbuff[3]=0x79;    //“-”
  }
  else
  {
   disbuff[3]=DIG_CODE[S%10000/1000];
   disbuff[2]=DIG_CODE[S%1000/100];
   disbuff[1]=DIG_CODE[S%100/10];
   disbuff[0]=DIG_CODE[S%10/1];
  }
}
}

/*****************************************************/
void Timer2Init(void)
{
T2CON = 0X00;//实现16位自动重装载定时、
RCAP2H = 0XF8;
RCAP2L = 0X30;
//PT2 = 1; //设置中断优先级为高
TH2=0xF8;//定时50ms
TL2=0X30; //定时器2的,写入数值寄存器的低8位
ET2 = 1;//开定时器2中断
EA=1; //总中断打开
TR2 = 1;
}  
void Interrupt_time2() interrupt 5     //T0中断用来计数器溢出,超过测距范围
{
   DigDisplay();
}
/*******************************************************/


回复

使用道具 举报

ID:584814 发表于 2020-2-28 07:35 | 显示全部楼层
先调整数码管可正常显示,然后再调超声波的程序。
回复

使用道具 举报

ID:372579 发表于 2020-2-29 15:59 | 显示全部楼层
是不是数码管没弄好
回复

使用道具 举报

ID:93224 发表于 2020-2-29 17:13 | 显示全部楼层
你封装的电路图展示出来啊 一起分析
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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