超声波测距代码、数码管分析

一、数码管模块的分析

数码管有共阳极和共阴极。

一般先列出下面这种形式,a、b、c、d、e、f、g对应的引脚相对应,引脚不一定是我所列出的,我所列出的对应关系是以蓝桥杯为例。

若以我所设计的超声波测距中的对应关系应该是

二、超声波测距全部代码

注意!!!在keil中的分布,将数码管模块化编程了。

main.c的代码如下:

#include <STC12C5A60S2.H>
#include <stdio.h>
#include <intrins.h>
#include "Nixie.h"
#define ON  0
#define OFF 1
sbit BUZZER = P2^4;
sbit Trig = P1^0;
sbit Echo = P1^1;
unsigned int i=0;
//unsigned int result1,result2,result3,result4;
// 定义定时器1的中断处理函数
void Timer1_ISR() interrupt 3
{
	  i=i+1;
	  TH1 = 0x00;   // 设置定时器1的高8位初值
    TL1 = 0x00;
}
void T1_Init(){
	// 配置定时器1的工作模式和定时器参数
    TMOD = 0x10;  // 设置定时器1为工作模式1
    TH1 = 0x00;   // 设置定时器1的高8位初值
    TL1 = 0x00;   // 设置定时器1的低8位初值
    // 使能定时器1的中断
    ET1 = 1;
    // 启动定时器1
    TR1 = 1;
	  EA = 1;
}
void Time_Init() {
    // 设置定时器0为16位定时器模式
    TMOD &= 0xF0;
    TMOD |= 0x01;
		TH0 = 0;
		TL0 = 0;
	
}
unsigned int RunOnce()  
{
	unsigned int time;
	//10us高电平发送触发信号
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
	//等待高电平信号接收
	while(!Echo);
	
	TR0 = 1;
	//等待高电平信号接收结束
	while(Echo==1);
	//关闭T0计数
	TR0 = 0;
	//高电平时间赋值,单位us
	time = TH0*256 + TL0;	// TH0<<8 | TL0
	TH0 = 0;
	TL0 = 0;
	return time;
}

//超声波检测到的距离
float GetDistance(unsigned int time)  
{
	float distance;
	distance = (float)time / (float)58;
	return distance;
}
void main()
{
	unsigned int time = 0;
	unsigned int integerPart, decimalPart;
	unsigned int result1,result2,result3,result4;
	float distance;
	P0 = 0xFF; // 先将P0口的输出设置为高电平
	// 设置P0口为推挽输出模式
	P0M0 = 0xFF; // P0口的模式寄存器低字节
	P0M1 = 0x00; // P0口的模式寄存器高字节
	P2 = 0X00;
	P2M0 = 0XFF;
	P2M1 = 0X00;
	while(1)
	{
		Time_Init();
		time = RunOnce();
		distance = GetDistance(time);
		integerPart = (unsigned int)distance;      // 获取整数部分
		decimalPart = (unsigned int)((distance - integerPart) * 100);   // 获取小数部分并扩大 100 倍
		result3 = integerPart % 10;                 // 取个位
		result4 = (integerPart / 10) % 10;           // 取十位
		result2 = decimalPart % 10;          // 取小数部分的个位
		result1 = (decimalPart / 10) % 10;    // 取小数部分的十位
		T1_Init();
		while(1)
		{  
			if(distance < 10)
			{
				BUZZER = OFF; //距离小于10报警
				Nixie(1,result1);
				Nixie(2,result2);
				Nixie(3,result3);
				Nixie(4,0);
			}
			else
			{ Nixie(1,result1);
				Nixie(2,result2);
				Nixie(3,result3);
				Nixie(4,result4);}
			if(i==20)
			{
				i=0;
				EA = 0;
				ET1 = 0;
				TR1 = 0;	
				break;
			}
		}
		BUZZER = ON;
	}
}

数码管代码:NIxie.c

#include <STC12C5A60S2.H>
#include "Nixie.h"
#include <intrins.h>

//软件毫秒延时函数
void delay_ms(unsigned int t)		//@12.000MHz
{   
	unsigned char i, j;
    while(t--)
	{
		_nop_();
		_nop_();
		i = 12;
		j = 168;
		do
		{
			while (--j);
		} while (--i);
	}
}

void Delay10us()		//@12.000MHz
{
	unsigned char i;

	i = 27;
	while (--i);
}

//Nixie display function
void Nixie(int LED, int number) {
    char NixieTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
		char NixieTable1[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
    P0=0xFF;
		switch (LED) {  //CBA
        case 1: P2 = (P2 & 0xF0) | 0x01; break;
        case 2: P2 = (P2 & 0xF0) | 0x02; break;
        case 3: P2 = (P2 & 0xF0) | 0x04; break;
        case 4: P2 = (P2 & 0xF0) | 0x08; break;
    }
		if (LED == 3)
		{P0 &= NixieTable1[number];
		  delay_ms(5);}
		else
		{P0 &= NixieTable[number];
      delay_ms(5);}
}

Nixie.h代码如下:

#ifndef __Nixie_H_
#define __Nixie_H_

void Nixie(int LED,int number);
void delay_ms(unsigned int t);
void Delay10us();

#endif

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值