level 2
stillnova
楼主
将程序写入HJ-2G,声波测距TRIG接PC1,ECHO接PC2。
#include "iom16v.h"
#define F_CPU 11059200UL
#define uint unsigned int
#define uchar unsigned char
#define BIT(X) (1<<X)
#define RS PD4
#define WR PD5
#define EN PD6
uint data;
uchar const Pang[]="juli:.";
uchar const xue[]="cm.";
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//写数据函数
void LCD_Write_Data(unsigned char Data)
{
PORTD&=~BIT(EN);//EN=0;
PORTD|=BIT(RS);//RS=1;
PORTB=Data;//送数据
PORTD|=BIT(EN);//EN=1;
delay(10);
PORTD&=~BIT(EN);//EN=0;
}
//写命令函数
void LCD_Write_Cmd(unsigned char Cmd)
{
PORTD&=~BIT(EN);//EN-0;
PORTD&=~BIT(RS);//RS=0;
PORTB=Cmd;//送命令
PORTD|=BIT(EN);//EN=1;
delay(10);
PORTD&=~BIT(EN);//EN=0;
}
//IO初始化
void LCD_IO_Init()
{
DDRD|=BIT(RS)|BIT(WR)|BIT(EN);//PD4~PD6位输出
DDRB=0xff;//PB口为输出
PORTD&=~BIT(WR);//WR=0;
}
void LCD_display(void)
{
uchar i;
LCD_Write_Cmd(0x38);//Initial 1602
LCD_Write_Cmd(0x0c);//bit3(1),bit2(1)开显示,bit1(1)显示光标,bit0(1)光标闪耀
LCD_Write_Cmd(0x06);//写一个字节后指针地址自动+1
LCD_Write_Cmd(0x01);//清屏
LCD_Write_Cmd(0x80);
for(i=0;Pang[i]!='.';i++)
LCD_Write_Data(Pang[i]);
LCD_Write_Cmd(0x80+12);
for(i=0;xue[i]!='.';i++)
LCD_Write_Data(xue[i]);
}
void display(uint sum)
{
uint a,b,c,d;
a=sum/1000+0x30;
b=sum%1000/100+0x30;
c=sum%100/10+0x30;
d=sum%10+0x30;
if(sum<10){a=0x20;b=0x20;c=0x20;}
if(sum<100){a=0x20;b=0x20;}
if(sum<1000)a=0x20;
LCD_Write_Cmd(0x80+6);//第2行从第5列开始
LCD_Write_Data(a);
LCD_Write_Data(b);
LCD_Write_Data(c);
LCD_Write_Data(d);
}
void start()
{
PORTC&=~(1<<2); //10us的触发信号,顺便把接收口拉低
PORTC|=(1<<1);
delay(15);
PORTC&=~(1<<1);
}
void ceju()
{
while(!(PINC&0X04)) ;
TCNT1H=0; //低电平一过,计时器清零,开始计时
TCNT1L=0;
while(PINC&0x04);
data=TCNT1L+256*TCNT1H; //高电平过后,计时结束,计算距离
data=data*1.7/150; //本来应该是1.7,1.72是修正后的值(声速跟温度有关),
display(data);
}
int main(void)
{
DDRC=0xfb;
PORTC=0xff;
LCD_IO_Init();
LCD_display();
TCCR1A=0X00;
TCCR1B=0X02; //8分频
while(1)
{
start();
ceju();
}
}
2014年07月15日 09点07分
1
#include "iom16v.h"
#define F_CPU 11059200UL
#define uint unsigned int
#define uchar unsigned char
#define BIT(X) (1<<X)
#define RS PD4
#define WR PD5
#define EN PD6
uint data;
uchar const Pang[]="juli:.";
uchar const xue[]="cm.";
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//写数据函数
void LCD_Write_Data(unsigned char Data)
{
PORTD&=~BIT(EN);//EN=0;
PORTD|=BIT(RS);//RS=1;
PORTB=Data;//送数据
PORTD|=BIT(EN);//EN=1;
delay(10);
PORTD&=~BIT(EN);//EN=0;
}
//写命令函数
void LCD_Write_Cmd(unsigned char Cmd)
{
PORTD&=~BIT(EN);//EN-0;
PORTD&=~BIT(RS);//RS=0;
PORTB=Cmd;//送命令
PORTD|=BIT(EN);//EN=1;
delay(10);
PORTD&=~BIT(EN);//EN=0;
}
//IO初始化
void LCD_IO_Init()
{
DDRD|=BIT(RS)|BIT(WR)|BIT(EN);//PD4~PD6位输出
DDRB=0xff;//PB口为输出
PORTD&=~BIT(WR);//WR=0;
}
void LCD_display(void)
{
uchar i;
LCD_Write_Cmd(0x38);//Initial 1602
LCD_Write_Cmd(0x0c);//bit3(1),bit2(1)开显示,bit1(1)显示光标,bit0(1)光标闪耀
LCD_Write_Cmd(0x06);//写一个字节后指针地址自动+1
LCD_Write_Cmd(0x01);//清屏
LCD_Write_Cmd(0x80);
for(i=0;Pang[i]!='.';i++)
LCD_Write_Data(Pang[i]);
LCD_Write_Cmd(0x80+12);
for(i=0;xue[i]!='.';i++)
LCD_Write_Data(xue[i]);
}
void display(uint sum)
{
uint a,b,c,d;
a=sum/1000+0x30;
b=sum%1000/100+0x30;
c=sum%100/10+0x30;
d=sum%10+0x30;
if(sum<10){a=0x20;b=0x20;c=0x20;}
if(sum<100){a=0x20;b=0x20;}
if(sum<1000)a=0x20;
LCD_Write_Cmd(0x80+6);//第2行从第5列开始
LCD_Write_Data(a);
LCD_Write_Data(b);
LCD_Write_Data(c);
LCD_Write_Data(d);
}
void start()
{
PORTC&=~(1<<2); //10us的触发信号,顺便把接收口拉低
PORTC|=(1<<1);
delay(15);
PORTC&=~(1<<1);
}
void ceju()
{
while(!(PINC&0X04)) ;
TCNT1H=0; //低电平一过,计时器清零,开始计时
TCNT1L=0;
while(PINC&0x04);
data=TCNT1L+256*TCNT1H; //高电平过后,计时结束,计算距离
data=data*1.7/150; //本来应该是1.7,1.72是修正后的值(声速跟温度有关),
display(data);
}
int main(void)
{
DDRC=0xfb;
PORTC=0xff;
LCD_IO_Init();
LCD_display();
TCCR1A=0X00;
TCCR1B=0X02; //8分频
while(1)
{
start();
ceju();
}
}
