📄 mega48--chaoshengbo2008.3.txt
字号:
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define v 34600 //声速
unsigned long old=0; //距离
unsigned long new=0; // 时间
uint dian; //小数点位
uint led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示符0,1,2,3,4,5,6,7,8,9
uchar led_buff[3]={0,0,0}; //选择显示
/////////////////////////////延时///////////////////////////////////////////
void delay_us(uint t) //us
{
do
t--;
while(t>1);
t++;
NOP();
}
void delay(uint t) //ms
{
while(t!=0)
{
delay_us(1000);
t--;
}
}
///////////////////////// //显示B口接数码管////////////////////////////
void display(void) //////动态扫描///
{
int i;
for(i=0;i<3;i++)
{
PORTB=led_buff[i];
PORTC=(1<<(2-i));//三位位选
delay_us(1500-12);
PORTC|=0X00;
}
}
void to(uint t) //////////将数值变为显示值
{
int i;
for(i=0;i<3;i++)
{
led_buff[i]=led[t%10];
t=t/10;
if(i==dian)led_buff[i]=led_buff[i]|0x80; ////小数点
}
}
////////////////////发射/////////////////////////////
void fa()
{
int i;
for(i=0;i<26;i++) /////////////发谢13个脉冲 40KHZ
{
PORTD^=0X40;//输出脉冲,PD6口
delay_us(11);
}
PORTD=0xbf;
TCNT0=0x00;//计数器置0
TCNT1 = 0x0000; //定时器归零
TCCR1B = 0x04;//定时器开始计时
TCCR0A=0X02;
TCCR0B = 0B00000110;//计数器开始计数
}
/////////////////////////接收计数14个的中断处理//////////////////////////////////
/////////////////////////接收计数//////////////////////////////////
#pragma interrupt_handler timer0:15
void timer0()
{
new=TCNT1;///存时间
TCCR1B=0x00;///定时器停止计时
TCNT1=0x0000;///定时器重新置0
TCCR0A=0X02;
TCCR0B = 0X00; // 计数器置0
old=((unsigned long) v*((32*new)/2)/1000);//计算距离
if(old<10000)old=10000;
if(old>9999&old<100000)
{
dian=1;
old=old/100;
}
if(old>99999&old<1000000)
{
dian=0;
old=old/1000;
} //显示
TCNT0=0x00;////////////计数器重新置0
TCCR0A=0X02;
TCCR0B = 0X00;
TCNT1 = 0x0000; //定时器置0
}
///////////////////////////////计数用///////////////////////////////////////
void timer1_init(void)////////计数用
{
TCCR0A=0X00;
TCCR0B = 0x00;
TCNT0 = 0x00;
OCR0A = 0X0e;
OCR0B = 0x05;
TCCR0A = 0x02;
TCCR0B = 0X00;
TIMSK0 = (1<<OCIE0A);
}
////////////////// ////计时用//////////////////////////////////////
void timer0_init(void)
{
TCCR1B = 0x00;
TCNT1 = 0X0000;
TCCR1A = 0x00;
TCCR1B = 0x00;
TIMSK1=0x00;
SEI();
}
////////////////////////////超过定时归零
#pragma interrupt_handler timer1:14
void timer1()
{
TCNT0 = 0x00;
}
///////////////////////主函数/////////////////////////////////////////
void main()
{
DDRB=0XFF;
DDRC=0Xff;
PORTC=0XFF;
DDRD=0xec;
PORTD=0XFF;
timer1_init();//定时器初始化
timer0_init();//计数器初始化
SEI();
for(;;)
{
fa();//输出40KHZ
to(old);
display();//显示
display();display();display();display();
display();display();display();display();
display();display();display();display();
display();display();display();display();
display();display();display();display();
display();display();display();display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -