/*-----------------------------------------------------------------------------
PB0--Trig
PD2--Echo
------------------------------------------------------------------------------*/
#include<iom16v.h>
#include<macros.h>
#include "usart.h"
#pragma interrupt_handler int0:2
//#pragma data:code
const char table[]="L= . cm"; //整数部分显示三位,小数部分显示两位
const char table1[10]="0123456789";
uchar ge,shi,bai,qian,zh,L;//自定义寄存器 zh=测量成功标志
const char ACSLL[]="0123456789";
//*************************************************************延时函数
//延时ms级
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//1us延时函数
void delay_1us(void)
{
asm("nop");
}
//延时20us
void delay_20us()
{ uchar bt ;
for(bt=0;bt<20;bt++);
}
/*-----------------------------------------------------------液晶显示
//写指令
void write_zl(uchar zl)
{
PORTC&=~BIT(0); //RS写指令
PORTC&=~BIT(1); //写操作
PORTA=zl;
PORTC|=BIT(2); //E抬高
delay(1);
PORTC&=~BIT(2); //E置零
}
//写数据
void write_sj(uchar sj)
{
PORTC|=BIT(0); //RS写指令
PORTC&=~BIT(1); //写操作
PORTA=sj;
PORTC|=BIT(2); //E抬高
delay(1);
PORTC&=~BIT(2); //E置零
}
//初始化
void csh(const char i[])
{
uchar a; //a作为循环计数
PORTC&=~BIT(2); //E置零
write_zl(0X38); //显示模式
delay(5);
write_zl(0x01); //清屏
delay(5);
write_zl(0X0C); //开显示
delay(5);
write_zl(0X06); //指针加一
delay(5);
write_zl(0X80+0X00); //第一行显示位置
delay(5);
for(a=0;a<8;a++)
{
write_sj(i[a]); //显示"L= . cm"
delay(5);
}
}
//1602液晶显示
void yejing()
{
write_zl(0x80+0x02); //测量数据的整数位
delay(5);
write_sj(table1[bai]);
delay(5);
write_zl(0x80+0x03); //测量数据的整数位
delay(5);
write_sj(table1[shi]);
delay(5);
write_zl(0x80+0x05); //测量数据的小数位
delay(5);
write_sj(table1[ge]);
delay(500);
}
----------------------------------------------*/
//**************************外部中断
void int0()
{ uint distance_data;
TIMSK|=(1<<TOIE1); //溢出中断使能
TCNT1=0; //计数初值
SREG&=~BIT(7); //关总中断
while(PIND&0X04);
distance_data=TCNT1H; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|TCNT1L; //与低8位合并成为16位结果数据
/*distance_data*=256; //自己设定分频256
distance_data/=58;
*/
//distance_data=TCNT1L+256*TCNT1H;
//distance_data=distance_data*346/31250/2*100;
// distance_data=distance_data*1.7/150;
qian=(distance_data/1000);
bai=(distance_data%1000/100);
shi=(distance_data%1000%100/10);
ge=(distance_data%10);
L=qian*1000+bai*100+shi*10+ge;
//USART_Transmit(ACSLL[0]);
//delay(50);
//USART_Transmit(ACSLL[0]);
//delay(50);
//USART_Transmit(ACSLL[0]);
//delay(50);
//USART_Transmit('\t');
USART_Transmit(ACSLL[qian]);
//delay(50);
USART_Transmit(ACSLL[bai]);
//delay(50);
USART_Transmit(ACSLL[shi]);
//delay(50);
USART_Transmit(ACSLL[ge]);
//delay(50);
USART_Transmit('\t');
delay(100);
//yejing();
zh=1;
}
//***********************************************************主函数
void main()
{
DDRA=0XFF; //PA0~PA7作为提供显示数据的I/O口
DDRB=0XFF; //PB0作为超声波传感器的Trig端
DDRD=0XFF;
PORTD=0X00;
DDRC=0XFF; //PC0~PC2作为控制显示的I/O口
DDRD=0X00; //PD2(INT0)作为超声波传感器的Echo端 回响信号
//====csh(table); //1602液晶显示初始化
PORTB&=~BIT(0); //首先拉低脉冲输入引脚
MCUCR=0X03; //上升沿产生中断请求-
GICR=0X40; //使能外部中断0-
TCCR1A=0X00; //设置为普通模式
TCCR1B|=(1<<CS12);//|(1<<CS11); //开启输入捕捉口的噪声抑制器,下降沿捕捉;(CS12,CS11,CS10:)
//001无分频;010,8;011,64;100,256;101,1024;
TIMSK|=(1<<TOIE1); //溢出中断使能
usart_Init();
TCNT1=0; //计数初值
while(1)
{ zh=1;
PORTB|=BIT(0);
delay_20us();
PORTB&=~BIT(0); //产生一个20us的脉冲,在Trig引脚
SREG|=BIT(7); //开总中断
while(zh==1); //等待Echo回波引脚变高电平
}
}
#define uchar unsigned char
#define uint unsigned int
#define MCLK 8000000
#pragma interrupt_handler usart_rx:12
//接受中断使能
uchar rdata,flag=0;
void wait_ms(uint msec) //误差 0us
{
uint c,count;
for(count = 0; count < msec; count++)
{
for(c=1333;c>0;c--);/////////////////////////////////////////////
}
}
void USART_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00;
//控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
//选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
baud=MCLK/16/baud-1;
//波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8;
//设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收结束中断使能
DDRD|=0X02;
//配置TX为输出(很重要)
}
void USART_Transmit(uchar data)
{
while(!(UCSRA&(1<<UDRE)) );
//等待发送缓冲器为空
UDR = data;
//将数据放入缓冲器,发送数据*******************
}
void usart_rx()
{
UCSRB&=~BIT(RXCIE);
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void usart_Init()
{
USART_init(9600);//中断??
SREG = BIT(7);
}
#define uchar unsigned char
#define uint unsigned int
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void delay_1us(void)
{
asm("nop");
}
void delay_20us()
{ uchar bt ;
for(bt=0;bt<20;bt++);
}
void delay_us(uint us)
{
int i,j;
us = 2*us;
for(i=0;i<us;i++);
}
|