#include <reg52.h>
#include <stdio.h>
#include <math.h>
#include <absacc.h>
unsigned char inte=0 //频率值溢出定时器值
unsigned long int uu=0 //频率卖昌相对应的计数值
unsigned long int ff=0 //实际频率值
typedef unsigned char uchar
typedef unsigned int uint
uchar key1
int m=0,w=0,q=0,b=0,s=0,g=0
#define LEDSEG XBYTE[0xbfff]
#define LEDDAT XBYTE[0xdfff]
/*** 按键 ***/
sbit sl=P1^0
sbit sc=P1^1
sbit sr=P1^2
sbit fw=P3^5
sbit srg=P1^5
sbit srd=P1^6
void delay_5ms()
{
uchar i,j
for(j=0j<5j++)
for(i=0i<125i++){}
}
void delay_50us()
{
uchar i
for (i=0i<6i++){}
}
void display(uchar num,uchar seg)
{
switch(num)
{
case 1:num=0x06break
case 2:num=0x5bbreak
case 3:num=0x4fbreak
case 4:num=0x66break
case 5:num=0x6dbreak
case 6:num=0x7dbreak
case 7:num=0x07break
case 8:num=0x7fbreak
case 9:num=0x6fbreak
case 0:num=0x3fbreak
default :num=0x00break
}
switch(seg)
{
case 1:seg=0x01break
case 2:seg=0x02break
case 3:seg=0x04break
case 4:seg=0x08break
case 5:seg=0x10break
case 6:seg=0x20break
default :seg=0x00break
}
LEDSEG=seg
delay_50us()
LEDDAT=num
delay_50us()
}
void timer1(void) interrupt 3
{
TL1=0x00
TH1=0x00
}
void cafrequent(void) reentrant
{
long int l1=0x00
long int h1=0x00
float tt=0 //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90
TH1=0x00
TL1=0x00
ET1=1
EA=1
while(fw==1)
TR1=1
while(fw==0)
while(fw==1)
TR1=0
l1=TL1
h1=TH1
uu=h1*256+l1+inte*65536
inte=0
tt=uu/(11.0592*1000000.0/12.0)
ff=(unsigned long int)(1.0/tt)//频率值
}
void judgekey()
{
long int R=0,C=0,L=0
cafrequent()
delay_5ms()
while(sr==0)
{
if (srd==0)
{
//R=(6560000.0/(2.0*ff))-(330.0/2.0)
R=(6906343.0/(2.0*ff))-(330.0/2.0)
delay_5ms()
m=R/100000
delay_5ms()
w=(R/10000)%10
delay_5ms()
q=(R/1000)%10
delay_5ms()
b=(R/100)%10
delay_5ms()
s=(R/10)%10
delay_5ms()
g=R%10
}
else (srg==0)
{
R=((1000000.0/(0.693*0.01*ff))-20000.0)/2.0
delay_5ms()
m=R/100000
delay_5ms()
w=(R/10000)%10
delay_5ms()
q=(R/1000)%10
delay_5ms()
b=(R/100)%10
delay_5ms()
s=(R/10)%10
delay_5ms()
g=R%10
}
}
while(sc==0)
{
// C=2790000.0/ff
C=3193333.0/ff
delay_5ms()
m=C/100000
delay_5ms()
w=(C/10000)%10
delay_5ms()
q=(C/1000)%10
delay_5ms()
b=(C/100)%10
delay_5ms()
s=(C/10)%10
delay_5ms()
g=C%10
}
while(sl==0)
{
L=38000000.0/(ff*ff)
delay_5ms()
m=L/100000
delay_5ms()
w=(L/10000)%10
delay_5ms()
q=(L/1000)%10
delay_5ms()
b=(L/100)%10
delay_5ms()
s=(L/10)%10
delay_5ms()
g=L%10
}
while(1)
{
display(m,1)
delay_5ms()
display(w,2)
delay_5ms()
display(q,3)
delay_5ms()
display(b,4)
delay_5ms()
display(s,5)
delay_5ms()
display(g,6)
delay_5ms()
}
}
void main()
{
judgekey()
}
1.51单片机具体型号类型要指灶姿定2.反应速度的精度要指定
3.发光二极管的接法要指定
4.测试方芦槐法要指定
5.串口方式,端陪辩友口号,pc机系统要指定
6.proteus版本要指定
希望对你有帮助//超声波模块显示程序
#include <reg52.h>//包括一个52标准内核的头文件
#define uchar unsigned char //定义一下滚拿方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3//产生脉冲引脚
sbit Rx = P3^2//回波引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}//数码管0-9
uint distance[4] //测距接收缓冲区
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i //自定义寄存器
bit succeed_flag //测量成功标志
//********函数声明
void conversion(uint temp_data)
void delay_20us()
void pai_xu()
void main(void) // 主程序
{ uint distance_data,a,b
uchar CONT_1
i=0
flag=0
Tx=0 //首先拉低脉冲输入引脚
TMOD=0x11 //定时器0,定时器1,16位工作方式
TR0=1 //启动定时器0
IT0=0 //由高电平变低电平,触发外部中断
ET0=1 //打开定时器0中断
EX0=0 //关闭外部中断
EA=1//打开总中断0
while(1) //程序循环
{
EA=0
Tx=1
delay_20us()
Tx=0//产生一个20us的脉冲,在Tx引脚
while(Rx==0)//等待Rx回波引脚变高电平
succeed_flag=0//清测量成功标志
EX0=1 //打开外部中断
TH1=0 //定时器1清零
TL1=0 //定时器1清零
TF1=0 //
TR1=1 //启动定时器1
EA=1
while(TH1 <30)//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0 //关闭定时器1
EX0=0 /液备衫/关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH //测量结果的高8位
distance_data<<=8 //放入16位的高8位
distance_data=distance_data|outcomeL//与低8位合并成为16位结果数据
distance_data*=12 //因为定时器默认为12分频
distance_data/=58 //微秒的单位除以58等于厘米
} //为什么除以58等闹腔于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0 //没有回波则清零
}
distance[i]=distance_data//将测量结果的数据放入缓冲区
i++
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4
pai_xu()
distance_data=distance[1]
a=distance_data
if(b==a) CONT_1=0
if(b!=a) CONT_1++
if(CONT_1>=3)
{ CONT_1=0
b=a
conversion(b)
}
i=0
}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1 //取出定时器的值
outcomeL =TL1 //取出定时器的值
succeed_flag=1 //至成功测量的标志
EX0=0 //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd//写入定时器0初始值
TL0=0x77
switch(flag)
{case 0x00:P0=geP2=0x7fflag++break
case 0x01:P0=shiP2=0xbfflag++break
case 0x02:P0=baiP2=0xdfflag=0break
}
}
//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,bai_data
bai_data=temp_data/100
temp_data=temp_data%100 //取余运算
shi_data=temp_data/10
temp_data=temp_data%10 //取余运算
ge_data=temp_data
bai_data=SEG7[bai_data]
shi_data=SEG7[shi_data]&0x7f
ge_data =SEG7[ge_data]
EA=0
bai = bai_data
shi = shi_data
ge = ge_data
EA=1
}
//******************************************************************
void delay_20us()
{ uchar bt
for(bt=0bt<60bt++)
}
void pai_xu()
{ uint t
if (distance[0]>distance[1])
{t=distance[0]distance[0]=distance[1]distance[1]=t}
if(distance[0]>distance[2])
{t=distance[2]distance[2]=distance[0]distance[0]=t}
if(distance[1]>distance[2])
{t=distance[1]distance[1]=distance[2]distance[2]=t}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)