📄 1超声波程序.c
字号:
/********************************************************
功能:超声波测距
测量范围:30~100cm
测量误差:1cm
时间;2008-10-4
********************************************************/
#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
uchar T0ocr=0x91;
unsigned long int icdata=0;
uchar count=0;
uchar flag=0,flag1=0;
uchar ledbuf[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9
uchar ledbufd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//数字0.~9.
uchar scanline[]={0x10,0x20,0x40};
/********************延时函数**************************/
void delay(int n) //延时n(0.45us)
{
while(n--);
}
/****************************************************
功能:显示函数
函数的参数:Data是显示的数据 dot是小数点的位置
*****************************************************/
void display1(uint Data,uchar dot)
{
uchar i,k;
uchar dData[4];
dData[0]=Data%1000%100%10;
dData[1]=Data%1000%100/10;
dData[2]=Data%1000/100;
for(i=0;i<3;i++)
{
k=dData[i];
if(i!=dot)
{
PORTC=scanline[i];
PORTA=ledbuf[k];
}
else
{
PORTC=scanline[i];
PORTA=ledbufd[k];
}
delay(1000);
}
}
/****************************************************
功能:显示小数
函数的参数:led是显示的数值
显示的范围:0.00~9.99
***************************************************/
void displays(uint led)
{
int n;
if(led<1000)
n=3;
if(led<100)
n=2;
if(led<10)
n=1;
switch(n)
{
case 1: display1(led,2);
break;
case 2: display1(led,2);
break;
case 3:display1(led,2);
break;
default :display1(999,5);
}
}
/*******************38k脉冲发射***********************/
void sent()
{
PORTD &=0XDf;
OCR0=0X67; //T0设置
TCCR0=0X19; //比较输出模式 无分频 OC0取反
TCCR1B=TCCR1B|0X81;
delay(400);
TCCR0=0x00;
delay(50);
count=0;
TIMSK |=0X04; //T1 溢出中断
TIFR |=(1<<ICF1);
TIMSK=TIMSK|0X20; //开输入捕获中断
}
/****************************************************
功能:向EEPROM写一字节数据
参数:Data是写入的的数据 address是写入数据的地址
***************************************************/
void write_EEPROM(uchar Data,uint address)
{
if(EECR&0X02)
delay(10000);
EEARH=address>>8;
EEARL=address&0x00ff;
EEDR=Data;
EECR=EECR|0X04;
EECR=EECR|0X02;
delay(10000);
}
/**************************************************
功能:读一字节EEPROM数据
参数:addess是数据的地址
**************************************************/
uchar read_EEPROM(uint address)
{
uchar i;
if(EECR&0X01)
delay(10000);
EEARH=address>>8;
EEARL=address&0x00ff;
EECR=EECR|0X01;
delay(10000);
i=EEDR;
return(i);
}
/*************************************************
功能:写4字节数据
参数:Data是要写入的数据
************************************************/
void write_4data( unsigned long int Data)
{uchar i;
uchar write_data[4];
write_data[0]=Data>>24;
write_data[1]=Data>>16;
write_data[2]=Data>>8;
write_data[3]=Data&0xff;
for(i=0;i<4;i++)
write_EEPROM(write_data[i],i);
}
/**********************************************
功能:读四字节数据
参数;
*********************************************/
unsigned long int read_4data()
{
uchar i;
unsigned long int ICdata;
uchar read_data[4];
for(i=0;i<4;i++){
read_data[i]=read_EEPROM(i);
ICdata=(ICdata<<8)|read_data[i];
}
return(ICdata);
}
#pragma interrupt_handler catch:6
void catch()
{
uint ct1;
SREG &=0X7f; //关总中断
TIMSK &=0XDF; //关输入捕获中断
TIMSK &=0Xfb; // T1 溢出中断
icdata=65536*count+ICR1;
TCCR1B=0X00; //关定时器T1
TCNT1=0X0000;
TCNT2=0X00;
PORTD |=0X20;
SREG |=0x80;
}
#pragma interrupt_handler function1:2
void function1() //功能选择
{
delay(1000);
flag=1;
TCCR2=0X00;
TIMSK &=0Xbf;
}
#pragma interrupt_handler function2:3
void function2()
{
delay(1000);
flag=2;
TCCR2=0X07;
TIMSK |=0X40;
}
#pragma interrupt_handler counter:9
void counter()
{
count++;
}
#pragma interrupt_handler repeat:5
void repeat() //T2中断
{
flag1++;
if(flag1==100)
{
flag1=0;
sent();
}
}
void init()
{
DDRA=0XFF; //端口初始化
PORTA=0XFF;
DDRB |=0x88;
PORTB=0xff;
DDRC=0xf0;
PORTC |=0xf0;
DDRD |=0X3C;
PORTD=0xFF;
PORTD &=0XEF;
SREG |=0x80; //开总中断
MCUCR &=0XF0; // 开INT0 INT1 低电平有效
GICR |=0XC0;
GIFR |=0XC0;
}
void main()
{
unsigned long int DATA;
init();
if(PINB==(PINB&~(1<<PINB7)))
{
sent();
delay(15000);
write_4data(icdata);
}
while(PINB==(PINB&~(1<<PINB7)))
{
displays(100);
}
DATA=read_4data();
while(1)
{
while(flag==0) //显示模式
{
displays(100*icdata/DATA);
}
if(flag==1) //手动模式
{
sent();
flag=0;
}
while(flag==2) //自动模式
{
displays(100*icdata/DATA);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -