📄 新建 文本文档 (10).txt
字号:
//**********************陆军上将******************************//
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit red=P1^2;
sbit yellow=P1^1;
sbit green=P1^3;
sbit out=P1^0;
sbit DQ=P2^3;
uchar temp_value; //温度值
uchar TempBuffer[5];
unsigned char Tempc[] = {"当前温度:"};
unsigned char dangc[] = {"当前距离:00.00m"};
unsigned char code dis3[] = {"状态——安全距离"};
unsigned char code dis30[] = {"状态——保持距离"};
unsigned char code dis31[] = {"状态——危险距离"};
unsigned char code dis4[] = {"Eubour Scientlg"};
ulong a,b,c,d;
uchar flag;
uchar cdist[6]={"00.00m"};
////////////////////////////////////////////////
/////////////////////////////////////
/////////////////////////发射函数
void send(void){
uint i;
for(i=20;i>0;i--)
{
TH0=(65536-12)/256;
TL0=(65536-12)%256;
TR0=1;
do{}while(!TF0);
out=!out;
TF0=0;
}
TR0=0;
TR1=1;
}
//////////////////////////////////////////////////////////
/////////////////////////////////////////////////
/**********温度计**********************/
void delay_18B20(unsigned int i)
{
while(i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
}
void temp_to_str() //温度数据转换成液晶字符显示
{ if(temp_value<100&temp_value>0){
TempBuffer[0]=temp_value/10+'0'; //十位
TempBuffer[1]=temp_value%10+'0'; //个位
TempBuffer[2]=0xdf; //温度符号
TempBuffer[3]='C';
TempBuffer[4]='\0';
} }
/////////////////////////////////////////////////////////
//////////////////////////////////////////
////////////////////////////////// lcd显示器
sbit rst=P2^0;
sbit rs=P2^1;
sbit rw=P2^2;
sbit ep=P2^4;
sbit psb=P2^5;
void delaym(uint i){
while(--i);}
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//判断LCD是否忙碌
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init()
{
lcd_wcmd(0x00);
delay(1);
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
////////////////////////////////////////////////////////////////////////////////////
}////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////显示温度
void showtemp(void){
unsigned char i=0;
ReadTemp();
temp_to_str();
for(i=0;i<5;i++){
lcd_pos(0x0a+i);// 设置显示位置
lcd_wdat(TempBuffer[i]);// 显示字符
}
}
///////////////////////////////////////////////////////////
/////////////////////////////////////////////
/////////////////////////////////中断接收函数
void dtime(void){
c=256*b+a;
d=65536*(3314+6*temp_value)/200000;
if(d>200)flag=1;
if(d>50&&d<150)flag=2;
if(d>10&&d<50)flag=3;
cdist[0]=d/1000+'0';
cdist[1]=(d/100)%10+'0';
cdist[2]='.';
cdist[3]=(d/10)%10+'0';
cdist[4]=d%10+'0';
cdist[5]='m';
}
void service_int0() interrupt 0 using 1{
uint j;
TR1=0;
IP=0x00;
IE=0x00;
delaym(10);
b=TH1;
a=TL1;
dtime();
for(j=0;j<6;j++){
lcd_pos(j+0x1a);
delaym(10);
lcd_wdat(cdist[j]);
}
IP=0x01;
IE=0x85;
}
void wr(void){
uint i;
lcd_pos(0x00);// 设置显示位置
i = 0;
while(Tempc[i] != '\0')
{
lcd_wdat(Tempc[i]);// 显示字符
i++;
}
lcd_pos(0x10);// 设置显示位置
i = 0;
while(dangc[i] != '\0')
{
lcd_wdat(dangc[i]);// 显示字符
i++;
}
lcd_pos(0x08);// 设置显示位置
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);// 显示字符
i++;
}
lcd_pos(0x18);// 设置显示位置
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);// 显示字符
i++;
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/////////////////////////////////////////主函数
void main(void)
{
TMOD=0X11;
IP=0x01;
IE=0x85;
lcd_init();
wr();
while(1){
send();
showtemp();
switch(flag){
case 0:red=0;green=0;yellow=0;break;
case 1:{
uint i;
green=1;
red=0;
yellow=0;
lcd_pos(0x08);// 设置显示位置
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);// 显示字符
i++;
}
};break;
case 2:{
uint i;
yellow=1;
red=0;
green=0;
lcd_pos(0x08);// 设置显示位置
i = 0;
while(dis30[i] != '\0')
{
lcd_wdat(dis30[i]);// 显示字符
i++;
}
};break;
case 3:{
uint i;
red=1;
yellow=0;
green=0;
lcd_pos(0x08);// 设置显示位置
i = 0;
while(dis31[i] != '\0')
{
lcd_wdat(dis31[i]);// 显示字符
i++;
}
};break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -