?? 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 + -