📄 cscj_io.c
字号:
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler int2:4
#pragma interrupt_handler timer1:15
uchar flag=0,a=10,csin;
uint turn_flag=1,aa=0;
uint s=0,cscj=34;// cscj是超声的传播速度为 34mm/100us
/*******************************************
函数名称: delayus
功 能: 延时指定微秒(8.31M晶振)
参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
/********************************************/
void delayus(uint us)
{
uint i;
us=us*13/10; //13/10是在8.31MHz晶振下,通过反复实验得到的数值
for( i=0;i<us;i++);
}
/*******************************************
函数名称: delay()
功 能: 8.31MHz晶振下延时 z ms
参 数: z
返回值 : 无
/********************************************/
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1185;y>0;y--);
}
/*******************************************
函数名称: int0()
功 能: 进入中断后让发光二极管点亮
检测是否收到超声波
返回值 : 无
/******************************************
void TIMER2_COMP()
{
TCNT2=0Xa0;
}
*/
/*******************************************
函数名称: int0()
功 能: 进入中断后置标志位,表示收到超声波
并计算距离
返回值 : 无
/********************************************/
void int2()
{
DDRB&=~BIT(PB4);
TIMSK&=~BIT(2);
flag=1;
s=aa*cscj/20-8;//距离计算公式 -8是校准后的数值
}
/*******************************************
函数名称: timer1()
功 能: 进入定时器中断后aa加1,用于距离的计算
返回值 : 无
/********************************************/
void timer1()
{
TCNT1H=0xff;
TCNT1L=0xac;
aa++;
}
/*******************************************
函数名称: int2_init()
功 能: 外部中断2初始化
参 数: 无
返回值 : 无
/********************************************/
void int2_init()
{
DDRD&=~BIT(2);
PORTD|=BIT(2); //设置输出口上拉
EICRA=0X20;
EIMSK|=BIT(2);
SREG|=BIT(7);
}
/*******************************************
函数名称: timer0_init()
功 能: 定时器0初始化 配置输出40khz占空比50%的方波
参 数: 无
返回值 : 无
/********************************************/
void timer0_init()
{
DDRB&=~BIT(PB4);//关闭发送超声 在下面和定时器1一起打开 可提高测距准确性
ASSR&=~BIT(3);
TCCR0=0X19;
OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
}
/*******************************************
函数名称: timer1_init()
功 能: 定时器1初始化 用于测量距离
参 数: 无
返回值 : 无
/********************************************/
void timer1_init()
{
TCCR1B=0X01;// 设置分频数为1 计数频率为8.31MHZ
TCNT1H=0xFF;// 设置计数初值 每一微秒进入定时器中断处理子函数 使aa加1
TCNT1L=0xAC;
TIMSK&=~BIT(2);//关闭定时器1 在下面和超声发射一起打开 可提高测距准确性
SREG|=BIT(7);
}
/*******************************************
函数名称: timer2_init()
功 能: 定时器2初始化 配置输出周期为32ms 输出31.35hz方波
占空比=OCR2/256
参 数: 无
返回值 : 无
/*******************************************
void timer2_init()
{
DDRB|=0X80; // 设置PWM口(PB7)为输出
TIMSK|=0X80;
TCCR2=0X6d;// 设置OC2为快速PWM模式 设置时钟源为64分频
TCNT2=0Xa0;
OCR2=10;// 设置输出周期为32ms 输出31.35hz方波 占空比=OCR2/256
//OCR1B=97;//设置占空比 输出50hzPWM
}*/
void main()
{
uint i;
DDRA=0XFF;
PORTA=0X00;
DDRD&=~BIT(2);//设置超声信号接收管脚为输入
PORTD|=BIT(2);//设置输入口上拉
// int2_init();
timer0_init();
timer1_init();
//timer2_init();
lcd12864_init();
line1 = "检测到障碍物";
line2 = " 距离:";
delayms(100);
// DDRB&=~0X80;
DDRB|=BIT(PB4);
TIMSK|=BIT(2);
while(1)
{
if(flag==1)
{
flag=0;
line1 = "检测到障碍物";
line2 = " 距离:";
display();
PORTA=0xcc;
write_com(0x94);
write_data((s%1000/100)+0x30);
write_data((s%100/10)+0x30);
write_data((s%10)+0x30);
lcd_write("mm");
//OCR2=a;
delayms(500);
PORTA=0X00;
aa=0;
TCNT1H=0xff;//
TCNT1L=0xac;//
DDRB|=BIT(PB4);
TIMSK|=BIT(2);
}
csin=PIND&BIT(2);
if(csin==0x00)
{
DDRB|=0X80;
TIMSK&=~BIT(2);
DDRB&=~BIT(PB4);
flag=1;
s=aa*cscj/20;
/* if(turn_flag==1)
{
a++;
a++;
// a++;
// a++;
if(a>=16)
{
a=10;
turn_flag=0;
}
}
else
{
a--;
a--;
// a--;
// a--;
if(a<=4)
{
a=10;
turn_flag=1;
}
}
delayms(50);*/
}
if(flag==0)
{
clear_dis();
/*i++;
delayms(10);
if(i==40)
{
i=0;
DDRB|=0X80;
OCR2=10;
delayms(300);
DDRB&=~0X80;
}*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -