#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "1602.h"
typedef unsigned char U8;
typedef signed char S8;
typedef unsigned int U16;
typedef signed int S16;
typedef unsigned long U32;
typedef signed long S32;
typedef float F32;
typedef double F64;
#define SYSTEMCLK 921600
#define T0CLK 921600
#define T1CLK 921600
#define T1PERIOD 1000000/921600
#define TIMER0H 0xFC
#define TIMER0L 0x66
sbit Trig = P1^3;
sbit Echo = P3^2;
sbit LedAlarm = P3^6;
sbit Beep = P3^7;
uint temp;
volatile bit FlagSucceed = 0;
volatile bit FlagDisplay = 0;
U16 DisplayCount = 0;
U16 time = 0;
U32 distance = 0;
void delay_20us();
void Start_Module();
void INT0_Init(void);
void Data_Init();
void Timer0_Init();
void Timer1_Init();
void delay_20us()
{
U16 bt;
for(bt=0;bt<100;bt++);
}
void Data_Init()
{
Trig = 0;
distance = 0;
DisplayCount = 0;
}
void INT0_Init(void)
{
IT0 = 0;
EX0 = 0;
}
void INT0_ISR(void)interrupt 0
{
time = TH1*256+TL1;
FlagSucceed = 1;
EX0 = 0;
}
void Timer0_Init()
{
TMOD = 0x11;
TH0 = TIMER0H;
TL0 = TIMER0L;
TR0 = 1;
ET0 = 1;
}
void Timer0_ISR(void)interrupt 1
{
TH0 = TIMER0H;
TL0 = TIMER0L;
DisplayCount++;
if(DisplayCount>=1000)
{
FlagDisplay = 1;
DisplayCount = 0;
}
}
void Timer1_Init()
{
TMOD = 0x11;
TH1 = 0;
TL1 = 0;
ET1 = 1;
}
void Start_Module()
{
Trig = 1;
delay_20us();
Trig = 0;
}
void main()
{
U16 i,j;
EA = 0;
INT0_Init();
Timer0_Init();
Timer1_Init();
Data_Init();
EA = 1;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
{;}
L1602_init();
L1602_string(1,1,"Welcome to my ");
L1602_string(2,1,"distance meter!!");
while(1)
{
EA = 0;
Start_Module();
while(Echo==0);
FlagSucceed = 0;
EX0 = 1;
TH1 = 0;
TL1 = 0;
TF1 = 0;
TR1 = 1;
EA = 1;
while(TH1<80);
TR1 = 0;
EX0 = 0;
if(FlagSucceed==1)
{
distance = time*1.085;
distance /= 58;
if((FlagSucceed == 1)&&(distance<20))
{
LedAlarm = 0;
Beep = 0;
}else{
LedAlarm = 1;
Beep = 1;
}
}
if(FlagDisplay == 1){
if(FlagSucceed == 0){
L1602_string(1,1,"Out Of Range(0-4m)");
L1602_string(2,1," ------- ");
}else{
L1602_string(1,1,"Distance Result:");
L1602_string(2,1," cm ");
L1602_int(2,5,distance);
}
FlagDisplay = 0;
}
}
}
sbit E = P2^5;
sbit RW = P2^6;
sbit RS = P2^7;
void delay(){
int i,j;
for(i=0;i<=10;i++)
for(j=0;j<=2;j++);
}
uchar Convert(uchar In_Data)
{
uchar i, Out_Data = 0,temp = 0;
for(i=0;i<8;i++){
temp = (In_Data>>i)&0x01;
Out_Data |= (temp<<(7-i));
}
return Out_Data;
return In_Data;
}
void enable(uchar del)
{
P0 = Convert(del);
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void write(uchar del)
{
P0 = Convert(del);
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a=0x80;
if(hang == 2) a=0xc0;
a=a+lie-1;
enable(a);
write(sign);
}
void L1602_string(uchar hang,uchar lie,uchar *P)
{
uchar a;
if(hang == 1)a = 0x80;
if(hang == 2)a = 0xc0;
a = a+lie-1;
enable(a);
while(1){
if(*P == '\0') break;
write(*P);
P++;
}
}
void L1602_int(uchar hang,uchar lie, int num)
{
uint temp;
uint gewei,shiwei,baiwei,sign;
if(num>=0)
{
sign = 0;
}else{
sign = 1;
}
temp = abs(num);
baiwei = temp/100;
temp = temp-baiwei*100;
shiwei = temp/10;
gewei = temp-shiwei*10;
num = abs(num);
if(num>=100){
if(sign==1){
L1602_char(hang,lie,'-');
}
L1602_char(hang,lie+1,baiwei+48);
L1602_char(hang,lie+2,baiwei+48);
L1602_char(hang,lie+3,gewei+48);
}else if(num>=10){
if(sign == 1){
L1602_char(hang,lie+1,'-');
}
L1602_char(hang,lie+2,shiwei+48);
L1602_char(hang,lie+3,gewei+48);
}else{
if(sign == 1){
L1602_char(hang,lie+2,'-');
}
L1602_char(hang,lie+3,gewei+48);
}
#endif
}
|