不懂的咨询我
单片机源程序如下:
- ///////////////////////////////////////////////////////////////
- //Project : 数字循环显示.c
- //版本 : V1.0
- //作者 : 源动力
- //说明 :本函数只适用于南阳理工学院电子系51开发板。
- //用法 : 直接下载到51单片机
- //功能 :和超声波模块HC-SR04相连,检测距离
- //接口说明:超声波接口 —51开发板
- // Trig — P1^0
- // Echo — P3^2
- ///////////////////////////////////////////////////////////////
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit D1=P2^7; //控制数码管亮灭,为低电平时灭
- sbit D2=P1^7; //控制全体二极管的熄灭, 573LE使能端
- sbit send=P1^0;
- sbit receive=P3^2;
- uchar code table[]={0x81,0x42,0x23,0x14};
- uchar code table1[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
- //二进制1000等于十六进制8,此时数码管只有第1位显
- uchar code table2[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
- //二进制1000等于十六进制8,此时数码管只有第2位显
- uchar code table3[]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29};
- //二进制1000等于十六进制8,此时数码管只有第3位显
- uchar code table4[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
- //二进制1000等于十六进制8,此时数码管只有第4位显
- uchar code table1234[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9};
- //二进制1111等于十六进制f;此时数码管全显
- uint num,a=0;
- uint outcomeH=0,outcomeL=0;
- unsigned long distance_data;
- uint temp_data[4];
- uint succeed_flag;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1141;y>0;y--);
- }
- void delay_20us()
- {
- uchar bt ;
- for(bt=0;bt<100;bt++);
- }
- void ExternalInterrupt_Init()
- {
-
- //TCON=0x00; //设定外部中断触发方式为低电平触发方式 两种设置方式一样
- IT0=0; //设定外部中断触发方式为低电平触发方式
- }
- void Timer0_Init()
- {
- TMOD=0x11;//设置定时器0和1为工作方式1
- TH0=0;//对定时器高八位清零
- TL0=0;//对定时器低八位清零
- TF0=0;//定时计数器溢出标志位清零
- ET0=1;//开定时器0中断
- TH1=0;//对定时器高八位清零
- TL1=0;//对定时器低八位清零
- TF1=0;//定时计数器溢出标志位清零
- ET1=1;//开定时器0中断
-
-
- }
- void AllInterrupt_Init()
- {
- IP=0x01;//外部中断0设置为高优先级,其他所有中断为低优先级
-
- }
- void UT_Init() //初始化超声波发射和接收引脚
- {
- send=0;
- receive=0;
- }
- void Send()
- {
- send=1;
- delay_20us();
- send=0;
- }
- void conversion()
- {
- uint ge_data,shi_data,bai_data,qian_data;
- distance_data=outcomeH;
- distance_data <<=8;
- distance_data=(distance_data | outcomeL);
- //distance_data*=(90*12); //这是往返两个路程的时间
- //distance_data现在单位为us
- /*distance_data*=(170); //(340/2=170) distance_data现在单位为微米
- distance_data=distance_data/1000; //distance_data现在单位为毫米 */
- distance_data*=12; //因为定时器默认为12分频
- distance_data/=58; //微秒的单位除以58等于厘米
-
-
- qian_data=distance_data/1000;
- distance_data=distance_data%1000; //取余运算
- bai_data=distance_data/100 ;
- distance_data=distance_data%100; //取余运算
- shi_data=distance_data/10 ;
- distance_data=distance_data%10; //取余运算
- ge_data=distance_data;
- temp_data[0]=qian_data;
- temp_data[1]=bai_data;
- temp_data[2]=shi_data;
- temp_data[3]=ge_data;
- }
- void display()
- {
-
- conversion();
- P0=table1[temp_data[0]];
- delay(1);
- P0=table2[temp_data[1]];
- delay(1);
- P0=table3[temp_data[2]];
- delay(1);
- P0=table4[temp_data[3]];
- //delay(1);
- }
- void display1()
- {
-
- //conversion();
- P0=table1[temp_data[0]];
- delay(1);
- P0=table2[temp_data[1]];
- delay(1);
- P0=table3[temp_data[2]];
- delay(1);
- P0=table4[temp_data[3]];
- //delay(1);
- }
- void main()
- {
- succeed_flag=0;
- D2=0;
- D1=1;
-
- EA=0; //先关闭总中断
- UT_Init(); //初始化超声波发射和接收引脚
- ExternalInterrupt_Init(); //外部中断初始化
- Timer0_Init(); //初始化定时器0
- AllInterrupt_Init();
-
- while(1)
- {
-
-
- TR0=1;//启动定时器0
- TR1=0;//关闭定时器1
- EX0=0;//关闭外部中断0
- EA=1;//打开总中断
- if(a==2)
- {
-
- EA=0; //先关闭总中断
- Send(); //发送脉冲信号
- _nop_();
- while(receive==0); //等待Echo回波引脚变高电平
-
- TH1=0;//对定时器高八位清零
- TL1=0;//对定时器低八位清零
- TF1=0;//定时计数器溢出标志位清零
-
- TR1=1;//启动定时器1
- TR0=1;//启动定时器0
- EX0=1;//打开外部中断0
- EA=1;//打开总中断
- //display1();
- while(TH1 < 30);//等待测量的结果(可用中断实现) //当TH1=60时,则为5.733米 30则为2.913米
- a=0;
- }
-
- }
- }
- void exter0() interrupt 1 //1为定时器0中断
- {
- //EA=0;
- //P0=table1234[1];
- TH0=0; //定时器0清零
- TL0=0; //定时器0清零
- TF0=0; //定时计数器溢出标志位清零
- display1();
- a++;
-
- }
- void dingshi1() interrupt 3 //3为定时器1中断
- {
-
- TH1=0; //定时器0清零
- TL1=0; //定时器0清零
- TF1=0; //定时计数器溢出标志位清零
- }
- void exter1() interrupt 0 //0为外部中断
- {
- outcomeH =TH1; //取出定时器的值
- outcomeL =TL1; //取出定时器的值
- succeed_flag=1; //至成功测量的标志
- //TH0=0;
- //TL0=0;
- EX0=0;//关闭外部中断0
- display();
- }
复制代码
所有资料51hei提供下载:
源动力超声波传感器程序.rar
(18.89 KB, 下载次数: 11)
|