//*************特殊引脚定义*****************// 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;da 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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务