在上次问过程序问题后的总结

2020-02-02 09:33发布

在上次问过程序问题后,我又检查和编译后改正了许多,我和我的搭档一起搞定了HY-SRF05超声波模块不过,由于我们都是C语言的初学者所以在程序上还是会有很多我们想不到的问题存在,所以想向各位高手请教一下,我的程序可是有现象的哦!
希望在大家的帮助下我会成长的更快,在这里先感谢大家了.......
程序如下:
#include<reg51.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define        uint  unsigned int
sbit Trig=P1^1;                     //超声波控制端      
sbit Echo=P3^2;                     //串行数据接收端
sbit buzz=P2^7;                     //蜂鸣器
long shuju;                         //全局数据控制变量
uchar b;
char code l[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char code ll[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
/*----------延时子程序-----------*/
void delay(uint x)   
{
    uchar a,b;
    for(b=x;b>0;b--)
        for(a=150;a>0;a--);
}
/*---------数码管显示部分---------*/
void xianshi()
{
        uchar a,b,c;
        a=shuju%10;                                //厘米显示计算
    b=(shuju%100)/10;               //分米显示计算
    c=shuju/100;                            //米的显示计算
        P0=l[a];
        P2=0xfe;
        delay(5);
        P0=l[b];
        P2=0xfd;
        delay(5);
        P0=ll[c];
        P2=0xfb;
        delay(5);

}
/*------程序开始前的初始化------*/
void chush()
{
        shuju=0;
        EA=1;                                                //打开中断总开关
        EX0=0;                                                //关闭外部中断0
        IT0=1;                                                //采用低电平触发中断即由高变低视为外部中断请求
        TMOD=0x01;                                        //T0使用定时模式,工作模式1 ,16位
        TH0=0x00;
        TL0=0x00;
        ET0=1;                                                //IE寄存器 允许定时器0中断
        TR0=0;                                                //关闭定时器0
}
/*-----------开启芯片-----------*/
void kaiqi()
{
        uchar a;
        Trig=0;                                                //首先拉低发射端
        TR0=0;                                                //关闭T0定时器
        EX0=0;                                                //关闭外部中断
        TH0=0x00;
        TL0=0x00;
        Trig=1;                                                //开启控制端
        for(a=0;a<11;a++);              //芯片的开启时间
        Trig=0;                                                //关闭控制端等待接收信号
        for(a=0;a<6;a++);                        //接收端关闭时间
        while(Echo==0);                                //接收端等待

        TR0=1;                                                //关闭定时器T0       
        EX0=1;                                                //开启外部中断

}
/*-----------外部中断-----------*/
void Int0(void) interrupt 0 using 1       
{
        b=1;
        TR0=0;
        shuju=TH0*256+TL0;
        shuju=shuju*0.017;
        TH0=0x00;
        TL0=0x00;
        EX0=0;                                                //关闭外中断                               
}
void TF0_() interrupt 1                        //定时器0溢出中断
{
        b=1;
        TH0=0x00;
        TL0=0x00;
        buzz=0;                                                //蜂鸣器用来判断定时是否溢出
        delay(5);
}
/*------------主程序------------*/
void main()
{
        chush();                                                //运行初始化子程序
        while(1)
        {
        b=0;
        kaiqi();                                        //运行开启子程序
        EA=1;                                                //CPU开启中断
        EX0=1;                                                //开启外部中断
        while(b==0);                                //等待接收端置低          
        xianshi();                                        //运行显示子程序
        EX0=0;                                                //关闭外部中断
        TR0=0;
        TH0=0x00;
        TL0=0x00;
        shuju=0;
        }                       
}

超声波的资料也附加上了......
0条回答

一周热门 更多>