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