#include <iom16v.h>
#include<macros.h>
#include"xianshi.h"
#include"usrt.h"
//=======宏定义=======
#define uint unsigned int
#define uchar unsigned char
uchar table[]=" 毕业设计 ";
uchar table1[]= "汽车倒车雷达";
uchar table2[]="电气0912班";
uchar table3[]="制作人:白云阁";
uchar table4[]= " 倒车请注意";
uchar table5[]=" 距离0.0 米";
uchar a,fen=0,num1=0,pp=0;
uchar flag,mc,mcz;
uint S=0;
uint time=0;
uchar i,j,z;
#define BUFLEN 255 //文字缓冲区的长度
#define HEADLEN 5 //数据包头的长度
#define LEN_OFFSET 2 //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[] = {0xfd,0x00,0x00,0x01,0x00};
uchar shu[] = {"0123456789"};
//文字(中间有需要变化的内容可在发送前修改)
uchar text1[] = {"倒车请注意"};
uchar text[] = {"距离点米"};
#define CSB0 PORTA&=~BIT(6) //定义超声波的输出端口
#define CSB1 PORTA|=BIT(6) //
/***********************************************
*******************蜂鸣器初始化****************/
#define feng_ming_H PORTD|=BIT(7)
#define feng_ming_L PORTD&=~BIT(7)
/**************定时器*********************************
***********************************************/
void timer1_init(void)
{
TCNT1H = 0x00; //计数器装初值
TCNT1L = 0x00; //计数器装初值
TCCR1A = 0x00; //普通IO口操作
TCCR1B = 0x00; //无时钟源
TIMSK|=(1<<TOIE1); //开T1溢出中断
}
/********中断***********/
#pragma interrupt_handler timer1:10
void timer1() //如果数值加满中断,把初值再附零重新开始
{
flag=1;
a++;
TCNT0=0X00;
}
//延时US
void delay_us( int t) //us
{
do
t--;
while(t>1);
}
//延时MS
void delay_ms(unsigned int t) //ms
{
while(t!=0)
{
delay_us(1142);
t--;
}
}
///IO口设置
void init()
{
DDRD=0XFE;
PORTD=0XFF;
DDRC=0X00; //C定义为输出状态
PORTC=0XFF; //C输出高电平
DDRA=0X7F; //寻线io口输入设置
PORTA=0X7F;
DDRB=0XFF; //寻线io口输入设置
PORTB=0XFF;
}
void Speech(uchar *buf, uchar len)
{
uchar i = 0; //循环计数变量
uchar xor = 0x00; //校验码初始化
head[2] = len + 3; //计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < 5; i++)
{
xor ^= head[i];
Usart_Transmit(head[i]); //数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
delay_ms(2);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf[i]; //发送数据异或
Usart_Transmit(buf[i]); //发送汉字
delay_ms(2);
}
Usart_Transmit(xor); //发送校验位
}
void init_devices(void)
{
CLI(); //禁止所有中断
init();
SEI();//开全局中断
SREG|=BIT(7);//开总中断
GICR=0XE0;//打开外部中断0和1
MCUCR=0X0A;//选择外部中断0和1为下降沿触发方式
}
void csb_io(void)
{
delay_ms(100); //PA6为发送端
CSB1;
delay_us(20);
CSB0;
while((PINA&0X80)==0X00); // 一直为低电平时等待 当变为高电平时,PA7为接收端,跳出此循环
TCCR1B=0x02; //开定时器中断,八分频。
while(((PINA&0X80)==0X80)); //一直为高电平时等待,变低跳出循环
TCCR1B=0x00; //关定时器中断
}
/*************计算******/
void jisuan(void)
{
time=(TCNT1H<<8)+TCNT1L; //算出来的是厘米
S=time/58;
i= S/100;
j= S%100/10;
z= S%100%10/10;
wr_lcd(comm,0x8b); //距离显示
wr_lcd(dat,S/100+0x30);
// chn_disp(2,0,table2); //显示
wr_lcd(comm,0x8c);
wr_lcd(dat,S%100/10+0x30);
wr_lcd(dat,S%100%10/10+0x30);
TCNT1H=0;
TCNT1L=0;
if(flag==1)
{
flag=0; //如果溢出了计数器重新装初值
TCNT1H=0;
TCNT1L=0;
}
}
void fashen (void)
{
//Speech(text,4);
//delay_ms(1000);
Speech(shu+i,1);
delay_ms(500);
Speech(text+4,2);
delay_ms(500);
Speech(shu+j,1);
delay_ms(500);
Speech(shu+z,1);
delay_ms(500);
Speech(text+6,2);
delay_ms(500);
}
//======主函数============
void main()
{
uchar MM=0;
init(); //IO口初始化
// init_devices();
init_lcd (); //液晶初始化
timer1_init(); //定时器初始化
StartUART(); //串口初始化
feng_ming_L; //蜂鸣器初始化
chn_disp(0,0,table); //显示
chn_disp(1,0,table1); //显示
chn_disp(2,0,table2); //显示
chn_disp(3,0,table3); //显示
delay_ms(1000);
delay_ms(500);
while(1)
{
if((PINC&0x01)==0X00)
{
clrram();
chn_disp(2,0,table5); //显示
chn_disp(0,0,table4); //显示
MM=1;
Speech(text1,10);
delay_ms(2000);
Speech(text,4);
delay_ms(1000);
}
if(MM==1)
{
//delay_ms(500);
csb_io(); //启动转化
jisuan(); //计算距离
delay_ms(500);
fashen();
if(S<=10) //如果距离小于10cm车停
{
PORTD=0X55; //蜂鸣器报警
}
}
}
}
daocheleida.rar_倒车雷达
版权申诉
101 浏览量
2022-09-23
17:23:14
上传
评论
收藏 44KB RAR 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+