?? sudu.c
字號(hào):
/**********************************/
/* 汽車轉(zhuǎn)速測(cè)量程序
/* 8.24,2004
/* Writed by Wuxw
/* Automation Depart. of WHUT
/* 芯片:ATMEGA8L
/* 晶振:2MHz
/*
/*
/***********************************/
/* 脈沖輸入接在INT0端口
/*
/* 輸出n,單位r/50ms,可用來(lái)計(jì)算車輪轉(zhuǎn)速
/*
/* num----脈沖計(jì)數(shù),可用來(lái)計(jì)算里程
/*
/* 485輸出格式:FB-86-n-numLL-numLH-numHL-numHH
/*
/* numLL-numLH-numHL-numHH分別為num的四個(gè)字節(jié)(L為低字節(jié),H為高字節(jié))
/*
/* 串口485通訊波特率baud = 9600
/*
/* 在受到正確地址(0x32)和命令(0xc5)后,發(fā)送數(shù)據(jù)
/*
/***********************************/
#include "iom8v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define E2ADDRLL 0x000 //脈沖計(jì)數(shù)存放地址
#define E2ADDRLH 0x001
#define E2ADDRHL 0x002
#define E2ADDRHH 0x003
//#define osccal 0x9d//內(nèi)部RC 校正常數(shù)
//#define osccal 0xa4 //內(nèi)部RC校正常數(shù)
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //串口通訊波特率
#define TIME50ms 0xae //定時(shí)50ms的初裝值
#define osccal_addr 0x1ff
uint m,n,k;
ulong num; //脈沖計(jì)數(shù)
uchar numLL,numLH,numHL,numHH,K,nLL,nLH;
uchar flag_receive,ndata[8]={0xFB,0x86,0x55,0x00,0x00,0x00,0x00,0x00};
uchar i,cx,xxx[3];
uchar data_receive[3];
//最小延時(shí)單位,約16微秒
void delay(uchar x)
{ uchar j;
while(x-->0)
{
for(j=0;j<5;j++)
{;}
}
}
void decompose(void)
{
numLL = num;
num=(num>>8);
numLH= num;
num= (num>>8);
numHL=num;
num=(num>>8);
numHH=num;
//nLL = n;
//n=(n>>8);
//nLH= n;
}
void combination(void)
{
num = 0;
num = numHH;
num = num<<8;
num += numHL;
num = num<<8;
num += numLH;
num = num<<8;
num += numLL;
//n = 0;
//n= nLH;
//n = n<<8;
//n += nLL;
}
void e2rom_write(uint e2addr,uchar e2data) //EEROM寫數(shù)據(jù)
{
while(EECR & (1<<EEWE));
EEAR = e2addr;
EEDR = e2data;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
uchar e2rom_read(uint e2addr) //EEROM讀數(shù)據(jù)
{
while(EECR & (1<<EEWE));
EEAR = e2addr;
EECR |= (1<<EERE);
return EEDR;
}
void num_read(void) //從EEROM讀出num
{
numLL = e2rom_read(E2ADDRLL);
numLH = e2rom_read(E2ADDRLH);
numHL = e2rom_read(E2ADDRHL);
numHH = e2rom_read(E2ADDRHH);
combination();
}
void num_write(void) //將num寫入EEROM
{
decompose();
e2rom_write(E2ADDRLL,numLL);
e2rom_write(E2ADDRLH,numLH);
e2rom_write(E2ADDRHL,numHL);
e2rom_write(E2ADDRHH,numHH);
}
void DataTransmit(void) //串行485數(shù)據(jù)發(fā)送
{
//ndata[2] = nLL;
ndata[3] = n;
ndata[4] = numLL;
ndata[5] = numLH;
ndata[6] = numHL;
ndata[7] = numHH;
UCSRB|=(1<<TXCIE);
UDR = ndata[0];
}
#pragma interrupt_handler uart0_tx_isr:iv_USART_TXC
void uart0_tx_isr(void)
{
if(K<7)
{K=K+1;
UDR=ndata[K];
}
else
{
K=0;
UCSRB&=~(1<<TXCIE); //1?UART ?¤?é?¨a?D??
}
}
void USART_Init(void) //串行初始化
{
UCSRB|=(1<<TXEN);//允許發(fā)送
UBRRL=(fosc/16/(baud+1))%256; //波特率的設(shè)置
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=0x86;//8 位數(shù)據(jù)+1 位STOP 位
}
//定時(shí)器0溢出中斷
#pragma interrupt_handler tim0Ovf:10 // vector #
//測(cè)量時(shí)間定時(shí)
void tim0Ovf(void)
{
TCCR0 = 0x00; //停止TC0
//INT0中斷關(guān)
GICR = 0x00;
m += 1;
TCNT0 = TIME50ms;
TCCR0 = 0x05; // Timer on //1024分頻
//PORTB |= (1<<PORTB1);
//PORTB &= ~(1<<PORTB1);
if(GIFR& 0x40)
GIFR = 0x40; //清除INT0中斷標(biāo)志
SEI();
//INT0中斷開(kāi)
GICR = 0x40;
}
//INT0中斷服務(wù)子程序
#pragma interrupt_handler INT_0:2 // vector #
void INT_0(void)
{
n = m;
/*
while(1)
{
PORTD |= (1<<PORTD3);
PORTD &= ~(1<<PORTD3);
delay(500);
}
*/
num_read(); //從EEROM讀出num
num += m ;
num_write(); //將num寫入EEROM
DataTransmit(); //串行485數(shù)據(jù)發(fā)送
m = 0;
TCNT0 = TIME50ms;
TCCR0 = 0x05; //Timer on //1024分頻
}
void main(void)
{
delay(200);
OSCCAL=e2rom_read(osccal_addr);
//OSCCAL=osccal;
PORTD|=(1<<PORTD3);
MCUCR = 0x02; //INT0下降沿
TIMSK = 0x01; //TC0溢出中斷允許
//定時(shí)器0中斷設(shè)置
TCCR0 = 0x00; //停止TC0
TCNT0 = TIME50ms; //初裝值
USART_Init();
DDRD=0xfb;
SEI();
GICR = 0x40; //INT0中斷開(kāi)
m = 0;
TCCR0 = 0x05; //Timer on //1024分頻
//主循環(huán)...
while(1)
{
/*測(cè)試程序段,已屏蔽*/
/*PORTB &= ~(1<<PORTB2);
delay(1);
PORTB |= (1<<PORTB2);
*/
DataTransmit();
for(k=1;k<100;k++)
delay(200);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -