一、数码管模块的分析
数码管有共阳极和共阴极。
一般先列出下面这种形式,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