最近在做超声波测距,现在还没有效果,我单独产生40khz的方波效果很好,但是加在1602显示里面就有较大的毛刺和跳动,希望大家指出那里不对,在这里不胜感谢!!!!!
#include <reg52.h>
#include <math.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint time, distance, j = 0 ,k = 0, flag = 0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0init(void)
{
P1 = 0; // 清P0口
TMOD = 0x00; // T0使用定时模式,工作模式0,无门控位
TH0 = 0xFF; // 为T0填入初值,定时时间25ms
TL0 = 0xB5;
TR0 = 1; // 启动T0
ET0 = 1; // 允许定时器0中断
EA = 1; // CPU开放中断
}
/********** T0溢出中断处理函数 **********/
void timer0_int () interrupt 1 using 2 // T0溢出中断,使用工作组2
{
TH0 = 0XFF; // 重新填入初值
TL0 = 0xB5;
P1 ^= 0x01; // P1.0取反,产生方波
k++;
if(k>=16) //超声波脉冲个数控制(为赋值的一半)//
{
k=0;
TR1=0;
ET1=0;
for(j=200;j>0;j--); //延时避开盲区//
for(j=200;j>0;j--);
for(j=200;j>0;j--);
EX0=1; //开启外部中断0//
}
}
/***************外部中断0程序************/
void PINT0() interrupt 0
{
TR0=0;
TR1=0;
ET1=0;
EA=0;
EX0=0;
flag=1; //接收成功标志//
time=TH0;
time=time*256+TL0;
time=time-120; //补偿软件或硬件带来的误差//
distance=time*0.017;
}
/****************************** LCD1602 ****************************
*********************************************************************/
#define lcd_data_port P0 //定义与1602LCD 的数据口的单片机口线
sbit lcdrs = P2^0; //定义与1602LCD 的RS(第4脚)连接的口线
sbit lcden = P2^1; //定义与1602LCD 的EN(第6脚)连接的口线,第5脚R/W 端直接接地
uchar code table[]="welcome to";
uchar code table1[]="T:";
uchar code table2[]="m"; //温度符号
uchar code table3[]="0123456789";
uchar code table4[]=".";
void write_data(uchar date);
void write_com(uchar com);
void init();
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
}
void main()
{
uint i, a, b, c, e, total, ta[30];
float t;
timer0init();
init();
write_com(0x80+0x03);
for(i = 0; i < 10; i++)
{
write_data(table[i]);
delay(10);
}
write_com(0xc0+0x02);
for(i = 0; i <2; i++)
{
write_data(table1[i]);
delay(10);
}
while (1)
{
total = 0;
for(i = 0; i <30; i++)
{
ta[i] = distance;
total = total + ta[i];
}
t = total / 30;
// t = 33 - total / 2500 ;
a = (uint)t / 1000 % 10;
b = (uint) t / 100 % 10;
c = (uint) t / 10 %10;
e = (uint) t % 10;
write_com(0xc0+0x06);
write_data(table3[a]);
write_data(table3[b]);
write_data(0xa5);
write_data(table3[c]);
write_data(table3[e]);
write_com(0xc0+0x0d);
write_data(0xdf);
write_data(table2[0]);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>