您好,欢迎来到华佗养生网。
搜索
您的当前位置:首页超声波测距离加温度显示

超声波测距离加温度显示

来源:华佗养生网
//*******************资源配置***********************// //******计数器0用于超声波记录接收端高电平时长*******// //******计数器1用于记录1s内外部脉冲数目即转速*******// //********定时器2用于精确定时,定时时间50ms*********// //*****************P3^5用于脉冲计数*****************// #include #include

//*************特殊引脚定义*****************// sbit RX = P1^0; sbit TX = P1^1; sbit RS = P2^4; sbit RW = P2^5; sbit EN = P2^6; sbit RES= P2^3; sbit PSB= P2^1;

//超声波接收端 //超声波触发端

//LCD数据/命令控制端 //读写控制端 //使能端

//复位端

//并口/串口选择端

sbit DQ = P3^7; //DS18B20数据端 sbit BEEP=P1^5;

#define DataPort P0 //MCU P0<------> LCM #define uchar unsigned char #define uint unsigned int

//***********Function Definition*********************// //****************函数声明***************************//

//蜂鸣器

void LCD_Write_number(uchar s); void Write_char(bit start, uchar ddata); void Send_byte(uchar bbyte); void Lcd_init(void);

//lcd初始化

//写入某坐标

void Disp_img(uchar *img); //显示图片

void LCD_Write_string(uchar X,uchar Y,uchar*s); //写入某字符串 void LCD_set_xy( uchar x,uchar y ); void Lcd_Mark3(void); //画面3 void Lcd_Mark2(void); //画面2 bit temp_flag; DS18B20_init();

//判断DS18B20正常工作位

//DS18B20初始化 //DS18B20延时函数

//短延时

void delay(uint num); void Delaynms(uint di);

void delayms(uint x); //1ms延时函数 readonebyte(void);

//读一个字节函数

void writeonebyte(uchar dat); //写一个字节函数 void gettemperture(void);

//获取温度值

void temperture_display(); //温度显示函数 void tempconv(); void beep(); void timer_init(); 1,定时器2)

void zhuansu_display();

//转速显示函数

//温度转换 //蜂鸣器响一声函数

//中断初始化函数(计数器0,计数器

void speed_conv(); //速度转换函数 void speed_display();

//速度显示函数

void chaoshengbo_conv(void); //超声波转换 //***************变量定义*****************// uchar data temp_dat[2]={0}; 位

uchar data DQdisp_buf[5]={0}; //温度显示缓冲区 uchar zhuansu_buff[6]={0}; uchar speed_buff[6]={0}; uchar temp_comp;

//转速显示缓存 //速度显示缓存

//temp[0],temp[1]用来存放温度的低、高8

//存放温度整数部分

uchar DS18B20_OK,speed2; //DS18B20_OK=0复位正常 uchar t2=0,T,L,H,WENDU; 整数部分

//H:温度高8位,L:

//t2代表timer2中断次数,T代表温度

温度低8位 uint time=0;

//超声波往返时间

//s表示超声波距离,num1表示发动机

long S=0,num1=0,speed; 转速 速度

bit flag =0;

// speed表示车轮转速=》

//超声波中断溢出标志位

uchar disbuff[4]={0}; //超声波数据显示缓存 uchar code num[]={\"01234567 :.-℃ \uchar code line1_data[]={\"速度: km/h\uchar code line2_data[]={\"转速: r/min\uchar code line3_data[]={\"前方车距: m\uchar code line4_data[]={\"车内温度: \uchar code line5_data[]={\" #**欢迎使用**# \

uchar code line6_data[]={\" 您的安全 \uchar code line7_data[]={\" 是全家人 \uchar code line8_data[]={\" 最大的幸福··· \uchar code picture[]= {

0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00,

0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x00,

0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00,

0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,

0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,

0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,

0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x00,

0x00,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x00,

0x00,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0x81,0xFF,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0xFE,0xF0,0x00,0x00,0x01,0x00,0x00,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xC0,0x07,0x80,0x00,0x03,0xE0,0x07,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0x80,0x03,0x40,0x00,0x03,0xE0,0x0C,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,

0x00,0x07,0x00,0x00,0xC0,0x00,0x00,0x20,0x18,0x00,0x07,0x00,0x00,0x00,0x00,0x00,

0x00,0x09,0x01,0x80,0x60,0x00,0x00,0x20,0x73,0x9F,0x03,0x80,0x00,0x00,0x00,0x00,

0x00,0x1E,0x0F,0xF2,0x20,0x00,0x00,0x20,0x67,0xFF,0xC1,0xC0,0x00,0x00,0x00,0x00,

0x00,0x1E,0x1F,0xF9,0x30,0x00,0x00,0x20,0xEF,0xFF,0xE0,0xE0,0x00,0x00,0x00,0x00,

0x00,0x38,0x3F,0xFC,0x90,0x00,0x00,0x20,0xCB,0xFF,0xF9,0xF0,0x00,0x00,0x00,0x00,

0x00,0x7F,0x7F,0xFE,0x10,0x00,0x00,0x20,0xDB,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,

0x00,0x6E,0xF9,0xBF,0x10,0x00,0x00,0x20,0xF7,0xED,0xFF,0xF0,0x00,0x00,0x00,0x00,

0x00,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x00,

0x00,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x00,

0x00,0x38,0xFC,0x3F,0x18,0x00,0x00,0x20,0x87,0xE0,0xFD,0xC0,0x00,0x00,0x00,0x00,

0x00,0x38,0xF1,0x8F,0x18,0x00,0x1F,0xE7,0x87,0x9C,0x7D,0xC0,0x00,0x00,0x00,0x00,

0x00,0x1C,0xFE,0x1F,0x81,0xFF,0xFF,0xC0,0x0F,0xE0,0xFF,0x80,0x00,0x00,0x00,0x00,

0x00,0x0C,0xFC,0x3F,0x80,0x00,0x00,0x00,0x0F,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xFE,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,

0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

//************************************************// //********** DS18B20 ********//

//************************************************// //************************************************//

//************蜂鸣器响一声函数*******// void beep() { }

//************温度转换***************// void tempconv() { 码

temp_comp=((L&0xf0)>>4|(H&0x0f)<<4); //取温度整数部分 uchar sign=0; uchar temp; if(H>127) { }

temp=L&0x0f;

//取小数位

L=(~L)+1;

//取反加1,将补码变成原码

//

//定义符号标志位

//定义温度数据暂存

BEEP=0;

//开蜂鸣器

delayms(500); BEEP=1;

//延时半秒

//关蜂鸣器

delayms(500); //延时半秒

//大于127,即高4位全为1,即温度为负值

if((~L)>=0xff) H=(~L)+1; else H=~H; sign=1;

//取反加一 //否则只取反

//置符号标志位为1

DQdisp_buf[0]=temp*0.625; //所获得的是四位数,所测温度加大了10倍 DQdisp_buf[0]=DQdisp_buf[0]%1000%100%10;//将小数部分转换成ASCII

DQdisp_buf[3]=temp_comp/100; temp=temp_comp%100;

//温度百位

//温度的十位和

个位一起

DQdisp_buf[2]=temp/10;

//温度十位 //温度个位 //如果温度的百位为0

DQdisp_buf[1]=temp%10; if(DQdisp_buf[3]==0) {

DQdisp_buf[3]=17; if(DQdisp_buf[2]==0)

//则不显示,

//在这种前提下,如果十位也

为0的话, 负号 }

//************温度显示函数**************// void temperture_display() {

LCD_set_xy(4,4);

//从第四行第5列开始显示

}

if(sign)DQdisp_buf[3]=13;

//如果符号标志位为1,则显示

DQdisp_buf[2]=17;

//不显示十位

LCD_Write_number(11);

LCD_Write_number(DQdisp_buf[3]); //显示百位 LCD_Write_number(DQdisp_buf[2]); //显示十位 LCD_Write_number(DQdisp_buf[1]); //显示个位 LCD_Write_number(12);

//小数点

LCD_Write_number(DQdisp_buf[0]); //十分位 LCD_set_xy(4,7); Write_char(1,num[14]);

}

Write_char(1,num[15]);

//************获取温度值*****************// void gettemperture(void) {

uchar i; DS18B20_init();

//DS18B20初始化

if(DS18B20_OK==0) {

//如果正常

writeonebyte(0xcc); writeonebyte(0x44); for(i;i<100;i++)

//跳过读序列号的操作 //启动温度转换

//调用显示函数延时,等待A/D

转换完成,分辨率为12位的需要延时750ms以上 }

//************写一个字节函数*****************//

temperture_display(); }

else temp_flag=0;

//否则接收不正常

DS18B20_init();

//DS18B20初始化

writeonebyte(0xcc); writeonebyte(0xbe);

//跳过读序列号的操作 //读取温度寄存器

temp_dat[0]=readonebyte(); //温度低8位放入temp_dat[0] temp_dat[1]=readonebyte(); //温度高8位放入temp_dat[1] L=temp_dat[0]; H=temp_dat[1]; temp_flag=1;

//温度低8位 //温度高8位

//接收正常

void writeonebyte(uchar dat) { }

//************读一个字节函数***************// readonebyte(void) { }

//***************DS18B20延时函数************//

uchar i=0; uchar dat=0; for(i=8;i>0;i--) { }

return (dat);

DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4);

uchar i=0; for(i=8;i>0;i--) { }

DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1;

void delay(uint num) { }

//***************DS18B20初始化*******************// DS18B20_init(void) {

DQ=1; delay(8); DQ=0; delay(90); DQ=1; delay(8);

//DQ复位 //延时

//单片机将DQ拉低 //等待至少480us的时间 //拉高总线

//等待DS18B20反馈存在低脉冲,单片

while(--num);

机检测

DS18B20_OK=DQ;

//如果为0,则初始化成功,为1,初始

化失败

delay(100); DQ=1;

return (DS18B20_OK);

//返回信号,若DS18B20_OK为0,则存在,若

DS18B20_OK=1;则不存在 }

//************************************************// //********** LCD 128 ********//

//************************************************// //************************************************/

void Lcd_init(void) {

//初始化LCD

delayms(40); //大于40MS的延时程序 PSB=1; //设置为8BIT并口工作模式 delayms(1); //延时 RES=0; //复位 delayms(1); //延时 RES=1; //复位置高 delayms(1);

Write_char(0,0x30); //选择基本指令集 delayms(1); //延时大于100us Write_char(0,0x30); //选择8bit数据流 delayms(1); //延时大于37us

Write_char(0,0x0c); //开显示(无游标、不反白) delayms(1); //延时大于100us

Write_char(0,0x01); //清除显示,并且设定地址指针为00H delayms(1); //延时大于10ms

Write_char(0,0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动 delayms(1); //延时大于100us }

/******************************************************************************/

/*------------------------------------------------ 检测忙位

------------------------------------------------*/ void Check_Busy()

{ RS=0; RW=1; EN=1; DataPort=0xff;

while((DataPort&0x80)==0x80);//忙则等待 EN=0; }

void Write_char(bit start, uchar ddata) //start=0写指令,start=1写数据 {

if(start==0) { }

//如果start==1,即可以开始 //再次检查,进行些数据操作

//如果start==0,检查忙碌位后写指令

Check_Busy(); //忙碌则等待 RS=0; RW=0; EN=0;

DataPort=ddata; _nop_(); _nop_(); EN=1; _nop_(); _nop_(); _nop_(); _nop_(); EN=0;

//发送指令

else

{

Check_Busy(); RS=1;

}

}

RW=0; EN=1;

DataPort=ddata; EN=0;

/******************************************************************************/

void Delaynms(uint di) //延时0.1ms左右 { }

/******************************************************************************/

void Disp_img(uchar *img) //图形方式128显示字模221 横向取膜 {

uchar i,j; uint k = 0;

Write_char(0,0x34); //图形方式 ,关闭 for(i=0;i<32;i++)

//每行128位。16字节,分两屏,所以是半屏

uint da,db;

for(da=0;dafor(db=0;db<10;db++);

32字节 换

Write_char(0,0x80);

//写入第一行首地址(第一屏的首地址

{

Write_char(0,0x80+i);

//先写入水平坐标值,水平坐标逐渐变

for(j=0;j<16;j++)

{

//再写入两个8位元的数据

}

}

}

Write_char(1,img[k++]); //写数据并指向下一数据

for(i=0;i<32;i++) {

//每屏两行,共32个数据

Write_char(0,0x80+i); //先写入水平坐标值

Write_char(0,0x88); //写入第3行首地址(第二屏的首地址)

for(j=0;j<16;j++) }

{ }

Write_char(1,img[k++]);

Write_char(0,0x36); //写完数据后,打开图形显示

/******************************************************************************/

void LCD_Clr(void)//清屏函数 { }

/******************************************************************************/

void LCD_set_xy( uchar x, uchar y ) {

//设置LCD显示的起始位置,X为行,Y为列 y代表一个字的宽度,16位 Write_char(0,0x01);

uchar address;

switch(x) {

case 0: address = 0x80 + y; break;

case 1: address = 0x80 + y; break; //第一行 }

case 2: address = 0x90 + y; break; //第二行 case 3: address = 0x88 + y; break; //第三行 case 4: address = 0x98 + y; break; //第四行 default:address = 0x80 + y; break;

Write_char(0, address); }

/******************************************************************************/ //

中英文字符串显示函数 ,此方法与之前写的更为简单

void LCD_Write_string(uchar X,uchar Y,uchar *s) {

LCD_set_xy( X, Y );

//设定位置

//只要指针未指向该行结束符,则进

while (*s) 行写循环 { }

Write_char( 1, *s ); //写入数据

//指向下一个字节

s ++; }

delayms(5); //延时

/******************************************************************************/

//************数字显示函数 ,作用仅是调取S经过*******************//

//***********计算后的各位的数值,具体分配到那里******************// //************要看对S的计算中,放到了哪行哪列********************// void LCD_Write_number(uchar s) { }

/******************************************************************************/ void Lcd_Mark2(void) { 延时 }

/******************************************************************************/ void Lcd_Mark3(void) {

LCD_Clr(); //清屏

LCD_Write_string(1,0,line1_data); //\"速度:\" LCD_Write_string(2,0,line2_data); //\"转速\" LCD_Write_string(2,0,line6_data); //\"您的安全\" LCD_Write_string(3,0,line7_data); //\"是全家人\" LCD_Write_string(4,0,line8_data); //\"最大的幸福··\" delayms(25);

LCD_Clr(); //清屏

LCD_Write_string(1,0,line5_data); //\"#***欢迎使用***#\" delayms(75);

//分配各字出现的时间

//画面2

Write_char(1,num[s]); Delaynms(1);

//直接写数据,与S有关,调S

//短延时

}

LCD_Write_string(3,0,line3_data); //\"前方车距\" LCD_Write_string(4,0,line4_data); //\"车内温度:\"

//************************************************// //****************** *********************// //********** 超声波 ********//

//************************************************// //************************************************/ void chaoshengbo_conv(void) {

time=TH0*256+TL0; TH0=0; TL0=0;

//每计算一次,

//计算时间

将计数器重装初值

S=(time*1.742)/10; //算出来是mm ,温度取15°

if((S>=7000)||flag==1) //如果超出测量范围 {

flag=0;

//中断溢出标志

位清零 }

LCD_set_xy( 3, 5 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 3, 6 ); LCD_Write_number(13); LCD_Write_number(13); LCD_Write_number(13);

//设定起始位置,第三行第4列 //显示\"-\" //显示\".\"

//设置显示位置为第三行第五列 //显示\"-\" //显示\"-\" //显示\"-\"

else { m } }

//如果接受正常

disbuff[0]=S/1000; disbuff[1]=S/100%10; disbuff[2]=S/10%10; disbuff[3]=S%10; LCD_set_xy( 3, 5 );

//精确到mm,所以此处单位为

LCD_Write_number(disbuff[0]); LCD_Write_number(12); LCD_set_xy( 3, 6 );

LCD_Write_number(disbuff[1]); LCD_Write_number(disbuff[2]); LCD_Write_number(disbuff[3]);

//写入数据

/********************************************************/ void delayms(uint ms) { }

uchar j,i; for(;ms;ms--) { }

while(--i) { }

j=10; while(--j);

/*****************计数器0服务程序*********************/ void zd0() interrupt 1 { }

//****************超声波时间处理*******************// void Timer_Count(void) {

TR0=1;

//开启计数

flag=1; RX=0;

//中断溢出标志 //超出范围,不接收

//T0中断用来计数器溢出,超过测距范围

while(RX); TR0=0;

//当RX为1计数并等待

//关闭计数

//计算

chaoshengbo_conv(); }

/********************************************************/ void StartModule() { }

TX=1;

//800MS 启动一次模块

//T1中断用来扫描数码管和计800MS启动模块

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;

/**************************************************/ //************************************************// //********** 转速 ********//

//************************************************// //************************************************/ void zhuansu_display() { // }

//****************定时器2服务程序*****************// void timer2() interrupt 5 {

TF2=0;

//置位TF2位,表示计数溢出,向CPU发送中断请求信号,必

LCD_set_xy(2,2);

//从第二行第4列开始显示

//:

LCD_Write_number(11);

LCD_Write_number(zhuansu_buff[0]); LCD_Write_number(zhuansu_buff[1]); LCD_Write_number(17);

LCD_Write_number(zhuansu_buff[2]); LCD_Write_number(12);

//显示万位 //显示千位

//显示百位

//小数点

//显示十位 //显示个位

LCD_Write_number(zhuansu_buff[3]); LCD_Write_number(zhuansu_buff[4]);

须由程序清零 }

//******************中断初始化*************************// void timer_init() {

t2++;

TMOD=0x51; TH1=0; TL1=0; TH0=0; TL0=0;

//开计数器1

//计数器1装初值

//计数器0装初值

RCAP2H=(65536-50000)/256;//自动重载模式下,定时器2溢出时,RC2H、RC2L RCAP2L=(65536-50000)%256;//中的16位初始值重新装入定时器的TH2,TL2 // PX0=1; // PX1=0; EA=1; ET0=1; ET1=1; ET2=1; TR2=1; TR1=1; }

//**************************************// void speed_conv() {

speed=speed2*1145.069; //转换成1000倍km/h speed_buff[0]=speed/10000;

//十位 //个位 //十分位 //百分位 //千分位

//启动定时器2 //启动计数器1

//外部中断0为高优先级 //外部中断0为高优先级 //开总中断 //允许T0中断

//允许计数器1中断

speed_buff[1]=speed%10000/1000;

speed_buff[2]=speed%10000%1000/100; speed_buff[3]=speed%10000%1000%100/10; speed_buff[4]=speed%10000%1000%100%10;

}

if(speed_buff[0]==0) { }

speed_display();

speed_buff[0]=17;

//如果速度的十位为0

//则不显示,

void speed_display() { }

/********************************************************/ //************************************************// //********** 主函数 ********//

//************************************************// //************************************************/ void main(void) {

unsigned int valA;

P0=0XFF; P2=0xff;

Lcd_init(); //设置液晶显示器 LCD_set_xy(1,2);

//从第二行第4列开始显示

//:

LCD_Write_number(11);

LCD_Write_number(speed_buff[0]); LCD_Write_number(speed_buff[1]); LCD_Write_number(12);

LCD_Write_number(speed_buff[2]); LCD_Write_number(speed_buff[3]); LCD_Write_number(speed_buff[4]);

//显示十位 //显示千位

//显示十分位位 //显示十位 //显示个位

LCD_Clr(); //清屏 Disp_img(picture); delayms(100);

Lcd_init(); //从图形显示状态下返回

//图标2(画面2)

//显示图片

Lcd_Mark2();

delayms(80);

Lcd_init(); //从图形显示状态下返回

//图标3(画面3)

Lcd_Mark3();

delayms(80);

timer_init(); while(1) {

if(t2==10)

{

t2=0;

//定时器初始化

//0.5s

speed2=(TH1*256+TL1)*2; //获得真实转速 speed_conv(); num1=speed2*60; TH1=0; TL1=0;

zhuansu_buff[0]=num1/10000; zhuansu_buff[1]=num1%10000/1000; zhuansu_buff[2]=num1%10000%1000/100; zhuansu_buff[3]=num1%10000%1000%100/10; zhuansu_buff[4]=num1%10000%1000%100%10; if(zhuansu_buff[0]==0)

//如果转

//进行速度转换

速的万位为0

示,

{

zhuansu_buff[0]=17;

//则不显

if(zhuansu_buff[1]==0) {

//在这种前提下,如果千

位也为0的话, 不显示千位

zhuansu_buff[1]=17;

//

if(zhuansu_buff[2]==0) 在这种前提下,如果百位也为0的话,

{

//

//不显示百位

zhuansu_buff[2]=17;

if(zhuansu_buff[3]==0) //在这种前提下,如果十位也为0的话, //不显示十位

} }

zhuansu_display(); num1=0; gettemperture(); if(temp_flag==1) { }

tempconv();

//读取温度

zhuansu_buff[3]=17;

}

//如果DS18B20工作正常

//启动温度转换

temperture_display(); //进行温度显示

if(temp_flag==0)beep(); //如果DS18B20工作不正常,蜂

鸣器响

//

delayms(10); RX=1;

//先拉高,等待下

次高电平到来进行计数

StartModule();

//启动超声波模块

for(valA=7510;valA>0;valA--) //循环,在有效范围内计数

}

}

{

if(RX==1)

{

Timer_Count(); // } }

}

//如果接收头接收到超声波,

启动计数器进行计数

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务