是‘0’,不是"0",意思是取数字0的ASCII码值0x30
因为U8T_data_H是表示湿度整数部分,是实际值,比如湿度为89%,U8T_data_H的值即为0x59,拆分为个十位即8和9,就是说U8T_data_H/10%10=8,U8T_data_H%10=9。但是如果要显示出来就要转为ASCII码,否则就会显示ASCII里第八和第九个字符就是退格和制表符,也可能显示不支持则为乱码。而ASCII里数字0~9的码位应该是0x30~0x39,所以要得某数字ASCII值只要把数字值加0x30即可,比如上面DATA[44] = U8T_data_H/10%10 + '0' = 0x08 + 0x30 = 0x38,DATA[45] = U8T_data_H%10 + '0' = 0x09 + 0x30 = 0x39,就是8和9的ASCII码值
易车讯 近日,我们从哈弗官方获悉,赤兔DHT将于12月27日上市,新车在外观内饰上与燃油版车型基本保持一致,采用了哈弗家族式的设计语言,动力方面,车辆将基于柠檬混动DHT平台打造。
外观方面,赤兔DHT版本沿袭燃油版风格,整体设计时尚,在车尾部分,轿跑式的设计应该是赤兔的亮点所在,并且还采用了贯穿式的尾灯设计。车身尺寸方面,新车的长宽高分别为4470mm/1898mm/1625mm,轴距为2700mm。
内饰方面,DHT版本也沿袭了燃油版本的设计,采用了简洁的风格,仅在悬浮式中控屏幕下方设置了空调的控制按键,亮色饰条点缀更加年轻,车辆还配备了液晶仪表、水晶挡把、电子手刹和自动驻车等科技配备。
动力方面,该车将基于柠檬混动DHT架构打造,搭载GW4G15H 15L发动机,最大功率为74kW,匹配的是DHT100混动变速箱,系统综合最大功率为140kW,电池方面,该架构的HEV电池包为18kWh。
sbit DQ1= P3^7 ; //车内探头
sbit DQ2= P1^1 ; //车外探头
sbit AC_CTRL = P2^2; //AC空调控制端。1为开启
/------------------------------------------------
定义区
------------------------------------------------/
xdata signed int Memory_buf2[5]={0,0,0,0,0};//xdata 前2分钟记忆值:车外湿度,车外温度,车内湿度,车内温度,电压
xdata signed int Memory_buf1[5]={0,0,0,0,0};//xdata 前1分钟记忆值:车外湿度,车外温度,车内湿度,车内温度,电压
unsigned int U16RH_data1,U16T_data1, U16RH_data2,U16T_data2,Voltage;
bit Minus_Flag1,Minus_Flag2,TIMEshow; //定义温度符号位 时间闪烁的:
/
串行总线 收发信号检测,数据读取 车内探头
/
unsigned char COM1(void)
{unsigned char i,U8temp,U8comdata,U8FLAG;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DQ1)&&U8FLAG++);
delay40us();
U8temp=0;
if(DQ1)U8temp=1; //延时40us后 如果仍为高电平则数据为1 否则为0
U8FLAG=2;
while((DQ1)&&U8FLAG++);
if(U8FLAG==1)break;
U8comdata<<=1; U8comdata|=U8temp; //整合数据
}
return(U8comdata);
}
/------------------------------------------------
读取温、湿度 车内探头
------------------------------------------------/
void RH1(void)
{
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8temp,U8FLAG;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
DQ1=0; delay100us(5); //主机拉低总线 至少500us
DQ1=1; delay40us(); //总线由上拉电阻拉高 主机延时20us-40us
if(!DQ1) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
U8FLAG=2;
while((!DQ1)&&U8FLAG++); //判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((DQ1)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
//数据接收状态
U8RH_data_H_temp=COM1(); //读湿度高8位
U8RH_data_L_temp=COM1(); //读湿度低8位
U8T_data_H_temp =COM1(); //读温度高8位
U8T_data_L_temp =COM1(); //读温度低8位
U8checkdata_temp=COM1(); //读校验数据
DQ1=1; //释放总线
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); //数据校验
if(U8temp==U8checkdata_temp) //如果数据读取无误
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H = U8T_data_H_temp;
U8T_data_L = U8T_data_L_temp;
if(U8T_data_H&0x80) //如果温度高8位首位为1 则为负温度
{Minus_Flag1=1;U8T_data_H = U8T_data_H-0x80;}
else
{Minus_Flag1=0;U8T_data_H = U8T_data_H;}
U16RH_data1=(U8RH_data_H256)|U8RH_data_L;
U16T_data1 = (U8T_data_H256)|U8T_data_L;
}
}
}
}
这是我正在用的程序的一部分,用的是1T的单片机,给你参考一下吧。晶体是12M的,别的地方你基本可以不改,主要注意好延时的时间一定要参照备注
org 0000h
sjmp main
_mDelay:
; SOURCE LINE # 9
;---- Variable 'Delay040' assigned to Register 'R6/R7' ----
; { unsigned int i;
; SOURCE LINE # 10
; for(;Delay>0;Delay--)
; SOURCE LINE # 11
C0001:
SETB C
MOV A,R7
SUBB A,#00H
MOV A,R6
SUBB A,#00H
JC C0007
; {for(i=0;i<10000;i++);}//200ms
; SOURCE LINE # 12
;---- Variable 'i041' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
C0004:
INC R5
CJNE R5,#00H,C0013
INC R4
C0013:
CJNE R4,#027H,C0004
CJNE R5,#010H,C0004
C0003:
MOV A,R7
DEC R7
JNZ C0001
DEC R6
C0014:
SJMP C0001
; }
; SOURCE LINE # 13
C0007:
RET
; END OF _mDelay
; void main()
main:
USING 0
; SOURCE LINE # 14
; {
; SOURCE LINE # 15
C0008:
; unsigned int x;
; while(1) /while语句,后面括号里1,表示无终止执行循环语句/
; SOURCE LINE # 17
; {
; SOURCE LINE # 18
; P1=0xFF;//P1口作为输入口省 /把0xFF这个数赋值给P1这个变量/
; SOURCE LINE # 19
MOV P1,#0FFH
; x=P1&&0x0F; /P1&&0x0F的运算结果是1,再把1赋值给x /
; SOURCE LINE # 20
MOV A,P1
MOV R6,#00H
JZ C0010
MOV R7,#01H
SJMP C0011
C0010:
MOV R7,#00H
C0011:
;---- Variable 'x142' assigned to Register 'R2/R3' ----
MOV R3,AR7
MOV R2,AR6
; P1=0x00; /把0赋值给P1,这时P1的值就变成0啦/
; SOURCE LINE # 21
CLR A
MOV P1,A
; //P0=0xFF;//P0口的特殊之处就是需要先初始化然后再读入正确的值
; P1_7=1; /电磁阀2开启/
; SOURCE LINE # 23
SETB P1^7
; P1_6=0; /电磁阀1关闭/
; SOURCE LINE # 24
CLR P1^6
; mDelay(x+1); /调用mDelay这个函数,相当于把这边括号里的x+1代入到上面mDelay函数里的Delay变量/
; SOURCE LINE # 25
MOV A,R3
ADD A,#01H
MOV R7,A
CLR A
ADDC A,R2
MOV R6,A
LCALL _mDelay
; P1_7=0; /电磁阀2关闭/
; SOURCE LINE # 26
CLR P1^7
; mDelay(16-x); /又一次调用mDelay函数/
; SOURCE LINE # 27
CLR C
MOV A,#010H
SUBB A,R3
MOV R7,A
CLR A
SUBB A,R2
MOV R6,A
LCALL _mDelay
; P1_6=1; /电磁阀1开启/
; SOURCE LINE # 28
SETB P1^6
; mDelay(16); /再一次调用mDelay函数/
; SOURCE LINE # 29
MOV R7,#010H
MOV R6,#00H
LCALL _mDelay
; P1_7=1; /电磁阀2开启/
; SOURCE LINE # 30
SETB P1^7
; P1_6=0; /电磁阀1关闭/
; SOURCE LINE # 31
CLR P1^6
; }
; SOURCE LINE # 32
SJMP C0008
; END OF main
END
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定义数组
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//温湿度传感器DHT11数据接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}
void sendwd()
{
//send wen du
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}
void sendsd()
{
//send shi du
SBUF=RH_data;
while(!TI);
TI=0;
}
//
void delayNOP() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//
//
// 毫秒级延时子程序
//
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//
//
//5us级延时程序
//
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//
//
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
//
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
//
//
// 写入指令数据到LCD
//
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//
//
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
//
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//
//
//LCD初始化设定
//
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //162显示,57点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
//
//
//设定LCD显示位置
//
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
//
//
//收发信号检测,数据读取
//
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
//
//
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
//
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小数点
//湿度小数部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//温度整数部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小数点
//温度小数部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
//
//冬天适宜温湿度 夏天适宜温湿度
//湿度:30%--80% 30%--60%
//温度:18℃--25℃ 23℃--28℃
//
void baoj()//报警函数
{
if(RH_data>=80) //湿度上限80%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(RH_data<=30) //湿度下限30%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data>=25) //温度上限25℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data<=18) //温度下限18℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else
{
buz=1;
}
}
//
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
//
void main()
{
lcd_init();
initcom();
delay_us();
while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//写字符
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //显示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //显示字符
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//写温度数据
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延时
delay_ms(500);
baoj();//报警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}
以上就是关于DHT11.c程序疑问,U8T_data_H/10%10 + '0' 这的+“0”是什么意思全部的内容,包括:DHT11.c程序疑问,U8T_data_H/10%10 + '0' 这的+“0”是什么意思、哈弗赤兔DHT将于12月27日上市 搭载混动系统、52单片机万年历把18b20换成dht11 程序怎么改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)