dl_us(80); //延时公式= 30 + (i-1)*13us dat_1820=1; dl_us(1); }
/*****************************/
2、 有返回参数,无输入参数的函数的定义方法
返回值类型标识符 函数名(void) {函数体语句}
/*例子****************************/
bit rdbit(void) //读一个位,bit返回值类型声明 { uchar i;
bit dat_bit;/* dat_bit 数据类型声明*/
dat_1820=0;i++; dat_1820=1;i++;i++; dat_bit=dat_1820;
dat_1820=0;
i=8; //i=3,4,5,7,8分别延时30,39,47,62,70微妙
while(i>0) {i--;}
dat_1820=1;i++;i++;
return(dat_bit);
}/*返回的位变量dat_bit,不仅要在函数定义时声明,在函数体内部也要说明*/ /*****************************/
3、 无返回参数,有输入参数的函数的定义方法
void 函数名(数据类型 形式参数1,数据类型 形式参数2,…….) {函数体语句}
/*例子**********************************************/ void dl_ms(uint count) { uchar i;
while(count--)
{ for(i=0;i<125;i++) { ; } } }
/***********************************************/ 4、 空函数的定义方法
返回值类型标识符 函数名(void) { }
/*例子**********************************************/ Float min() {}
/***********************************************/
调用空函数时。什么工作也不做,此函数只是模块化设计时占位需要,为以后程序扩充用。
14.5、函数的参数和函数值
1、形式参数 在定义函数时,函数名后面括号中的变量名称为“形式参数”,简称“形数”
/*例子**********************************************/
void dl_ms(uint count)/*在函数名dl_ms后面括号中的变量uint count为“形式参
数”,只是说明了参数的数据类型,没有实际的数值*/
{ uchar i;
while(count--)
{ for(i=0;i<125;i++) { ; } } }
/***********************************************/
2、实际参数 在函数调用时,主调用函数名后面括号中的表达式称为“实际参数”,“实参”。
main()
{ dl_ms(500);/* 主调用函数直接将数值500传递给dl_ms()函数*/
}
3、函数的返回值(P128)
/*例子*************************************/ /*文件名:study3.C 2008.4.6 */ #include
uint min(uint k1,uint k2); /*子函数声明。函数的形参k1,k2*/
main ()/*主函数开始*/ {int result;
result=min(35,25);/* 函数的实参k1=35,k2=25*/ }
int min(int k1,int k2)/*子函数开始*/ {int k3;
k3=(k1+k2)/2;
return (k3);/*计算结果送到k3*/ }
/**************************************/
简称
第①步:主调用函数main()在调用有参数min()函数时,将实际参数35,25分别传递给被调用函数的形参k1,k2
第②步:被调用函数min()使用实参35,25作为输入变量进行运算,所得结果通过返回语句return(k3) 返回给主函数 第③步:在主函数result= min(35,25)中,通过等号赋值给变量result。这个return(k3)中变量k3就是被调用函数的返回值,简称函数的返回值。
一个函数可以有一个以上的return语句,但多于一个的return语句必须在在选择结构(if或
do/case)中使用,因为被调用函数一次只能返回一个变量值。 14.6、函数的调用
1、函数调用的一般形式
函数名(实际参数表列);
函数名(实参1,实参2,…);//一个以上实参之间用“,” 2、函数调用的方式(P130)
①、把被调用函数名作为主调用函数中的一个语句 disp();
②、函数结果作为表达式的一个运算对象 result=min(35,25)*3.1416 ③、作为另一个函数的参数 m = max (a,min(k1,k2)) 14.7、对被调用函数的说明
1、被调用函数必须是已存在的函数(库函数或用户自定义函数) 2、如果在程序中使用了库函数,或使用了不在同一程序中的用户自定义函数,要使用#include语句
3、一般形式:
被调函数声明; 主调用函数
/*例子***************************************/ void disp(void); main() {…. disp();
}
/*例子***************************************/
14.8、函数的嵌套(P132)
在调用一个函数的过程中允许调用另一个函数。由于51单片机RAM空间的限制,注意嵌套深度 14.9、函数的递归调用(P132)
在调用一个函数的过程中又直接或间接调用该函数本身,这种情况称为函数的递归调用。递 归调用主要用于问题的求解,求阶乘等。
第十五课 温度传感器DS18B20工作原理及编程
15.1、单线(1-wire)技术。只有一根数据线;数据传输是双向的;单主机能控制一个或多个从
机设备
15.2、主机和从机通信过程:
初始化单线器件,识别单线器件和单线数据传输。只有主机呼叫从机时,从机才能应答 单线(1-wire)协议由复位脉冲,应答脉冲、写0、写1、读0、和读1这几种信号类型组成。这些信号,除了应答脉冲,其他均由主机发出,并且所有命令和数据都是字节的低位在前。 15.3、DS18B20的主要技术指标:
每个DS18B20都有唯一的64位ROM编码,它存放在64位激光ROM中 64位激光ROM内容 8位CRC校验码 MSB LSB 48位产品序列号 8位产品系列编码 MSB LSB MSB LSB DS18B20的存储器结构(中间结果RAM) 温度值低位字节 温度值高位字节 TH/用户使用字节1(TH的易失性拷贝,上电时被除数刷新) TL/用户使用字节2(TL的易失性拷贝,上电时被除数刷新) 配置字节(配置寄存器易失性拷贝,上电时被除数刷新) 保留字节(内部计算用) 保留字节(内部计算用) 保留字节(内部计算用) CRC字节 非易失性电可擦除RAM TH/用户使用字节1(存储高温触发器) TL/用户使用字节2(存储低温触发器) 配置字节(配置寄存器)
配置寄存器 0 R1 R0 1 1 1 1 1 MSB LSB 其中R1和R0是温度分辨率,配置表如下: R1 R0 分辨率 最大转换时间 温度值分辨率