本帖最后由 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();
}
/*******************************************************/
|