51单片机学习C语言 下载本文

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 typedef unsigned char uchar; typedef unsigned int uint;

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 分辨率 最大转换时间 温度值分辨率