51单片机学习C语言_第1页
51单片机学习C语言_第2页
51单片机学习C语言_第3页
51单片机学习C语言_第4页
51单片机学习C语言_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二课C51的数据和数据类型(P55)2.1KEIL51数据类型位型(bit)字符型(char)有符号(signedchar)基本类型无符号(unsignedchar)数整型(int)有符号(signedint)无符号(unsignedint)据长整型(long)有符号(signedlong)无符号(unsignedlong)类浮点型(float)双精度浮点型(double)型数组类型(array)构造类型结构类型(struct)共同体(union)枚举(enum)指针类型空类型2.2KEIL51数据类型数据类型长度/bit长度/byte值域charunsignedchar810〜255signedchar81-128〜+127intunsignedint1620〜65535signedint162-32768〜+32767longunsignedlong3240〜4294967295signedlong324-2147483648〜+2147483647float324±1.175494E-38〜±3.402823E+38(6位数字)double648±1.175494E-38〜±3.402823E+38(10位数字)一般指针*1〜3bit10或1sbit10或1sfr810〜255sfr161620〜655352.3KEIL51数据的存储类型与存储空间的对应关系数据存储器存储类型长度byte与存储空间的对应关系片内数据存储器data1片内RAM区低128字节,访问速度快bdata1片内RAM位寻址区(20H〜2FH),允许位与字节混合访问idata1片内间接寻址区,可访问片内所有RAM地址空间(256字节)

片外数据存储器xdata2片外数据存储区(64KB字节)空间,由MOVX@DPTR访问pdata2分页寻址片外数据存储区(256字节)由MOVX@R0访问片外程序存储器code代码存储区(64KB字节)由MOVC@DPTR访问第三课KEIL51数据的存储类型与存储器结构(P59)3.1Cx51系列单片机在物理上有四个存储空间(见图3-1)片内程序存储器空间片外程序存储器空间片内数据存储器空间片外数据存储器空间地址地址晶址地址FFFFH片外ROMFFHSFRFFH180HRAMFFH80HSFRrrrrn片外RAMFLASH80H30HRAM130HRAM164KB空间64KB空间20H位寻址区|20H位寻址区10000H00H工作寄存器口一3蛆!00H工作寄存嚣口--3组|0000H89C5189C5289C51189C5289C5189C52h)、片内数据存储器靛、程序存储器c).片外数据存储器图3-1既51单片机存储器结构注:使用片外程序存储器时,单片机引^PEA接地。即EA河3.2通用寄存器区:地址(00H〜1FH)(P60)组号PSW.4/RS1PSW.3/RS0地址00000H〜07H10108H〜0FH21010H〜17H31118H〜1FH3.3可位寻址区(20H〜2FH)位地址:00H〜7FH共128位(P61)RAM地址位地址2F7F7E7D7C7B7A79782E77767574737271702D6F6E6D6C6B6A69682C67666564636261602B5F5E5D5C5B5A59582A5756555453525150294F4E4D4C4B4A4948

284746454443424140273F3E3D3C3B3A3938263736353433323130252F2E2D2C2B2A2928242726252423222120231F1E1D1C1B1A1918221716151413121110210F0E0D0C0B0A09082007060504030201003.4、用户RAM区Cx51单片机用户RAM区(30H〜7FH);Cx52单片机用户RAM区(30H〜FFH)。注:上电复位时,堆栈指针SP指向07H,C51单片机的栈顶和栈底是从小到大在使用汇编语言时,通常将栈顶定位在30H(MOVSP,#30H),在使用C语言编程时堆栈是系统自动分配的,不需用户考虑。3.5特殊功能寄存器(SFR)(P64)SFRMSB位地址/位定义LSB字节地址*BF0H*ACCE0H*PSWD7D6D5D4D3D2D1D0D0HCYACF0RS1RS0OVF1P*t2conCFCECDCCCBCAC9C8C8HTF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2*IPBFBEBDBCBBBAB9B8B8H---PSPT1PX1PT0PX0*P3B7B6B5B4B3B2B1B0B0HP3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXD*IEAFAEADACABAAA9A8A8HEA--ESET1EX1ET0EX0*P2A7A6A5A4A3A2A1A0A0HP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0SBUF99H*SCON9F9E9D9C9B9A999898HSM0SM1SM2RENTB8RB8TIRI*P1979695949392919090HP1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0TH18DHTH08CHTL18BHTL08AHTMODGATEC/flM1M0GATEC/TOM1M089H*TCON8F8E8D8C8B8A898888HTF1TR1TF0TR0IE1IT1IE0IT0PCON87HDPH83HDPL82HSP81H*P0878685848382818080HP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0注1:*表示可以进行位操作注2:KEILCx51提供了一种自主形式的定义方法。这种定义引入关键字“sfr”,语法如下:sfrSCON=0x98;sfrTMOD=0x89;/*见头文件reg51.h*/注3:定义datacharx与定义chardatax是等价的,但应该尽量使用后一种方法。第四课常量和变量(P56)4.1、常量---在程序运行的过程中,其值不能改变的量。与变量一样,常量可以有不同的数据类型,可以用一个标识符代表一个常量,习惯上常量标识符用大写字母,例:#defineCONST60/*即:CONST=60*/#definePAI3.1416/*即:PAI=3.1416*/4.2、变量---在程序运行的过程中,其值可以改变的量。例:#defineCONST60main()(intvar1,result;var1=2;result=var1*CONST;while(1)}运行结果result=1204.3、变量在存储器中的物理排列(图4-1)1)、位变量2)、整型变量3)、浮点型变量(1位符号位,8位指数位,23位尾数位)地址+0+1+2+3内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM其中,S符号位,1表示负,0表示正;E:阶码(在两个字节中)偏移为127;M:23位尾数,最高位为“1”。一个整型变量值为0x1234,一个长整型变量值为0x12345678,一个浮点变量值为-12.5的十六进制为0xC1480000,它们在内存的排列分别表示在4-1中(书2P52)

图4-1变星存储方式注1:AT89C51芯片中RAM只有低128位,而AT89C52芯片中RAM另外还有高128位,地址为80H到FFH,并和特殊寄存器SFR地址重叠。图4-1变星存储方式注2:在编写程序时,如是使用signed和unsigned两种数据类型,那么就得使用两种格式类型的库函数,这将使占用的存储空间成倍增长,因此在编程时,如是只强调程序的运算速度而又不进行负数运算,最好采用无符号(unsigned)格式。注3:尽量使用位变量。注4:缩写形式定义:typedefunsignedcharuchatypedefunsigneduintuint4.4存储模式及说明(P63)存储模式说明SMALL小模式参数及局部变量放入可直接寻址的片内存储器(最大128字节,默认存储类型是data)COMPACT紧凑模式参数及局部变量分页外存储器(最大256字节,默认存储类型是pdata),通过寄存器R0和R1间接寻址,橙空间位于单片机内部RAM。LARGE大模式参数及局部变量直接放入片外数据存储器(最大64KB,默认存储类型是xdata),通过数据指针DPTR来寻址,访问效率低。第五课8051并行接口及其Cx51定义(P66)P0-P3口,32根I/O线;输入缓冲器;输出缓冲器;引至芯片外的端口引脚;P0、P1、P3为准双向口;?0为双向三态口;向外扩展存储器要用P0口和P2口,P2口输出地址高8位(A15〜A8),P0口数据和地址复用;P0〜P3可以字节寻址,也可以位寻址;标准8051的端口没有数据方向寄存器。P1、P2、和P3都有内部上拉,都可以作为输入或输出。写端口就是写一个要送端口的值;读端口,必须先向端口写“1”(单片机复位时口线的初值是全“1”)第六课位变量(P68)6.1、位变量的Cx51的语法及语义如下:bitdir_bit;/*将dir_bit定义为位变量*/6.2、函数可包含类型为bit的参数,也可以将其作为返回值。例:bitfunc(bitb0,bitb1){/**/Return(b1);}6.3、对位变量定义的限制:位变量不能定义成一个指针,如不能定义bit*bit_point;不存在位数组,如不能定义bitb_array[];6.4、可位寻址对象:是指可以字节或位寻址的对象。位于8051内部RAM中,因此存储类型为idata.6.5、sbit位变量名=位地址sbitP1_1=Ox91;这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。6.6、sbit位变量名=特殊功能寄存器名人位位置sftP1=0x90;sbitP1_1=P1人1;//先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方法6.7、sbit位变量名=字节地址人位位置sbitP1_1=0x90A1;sbitP1_0=P1a0;//而是自己定义特殊寄存器sfrP1=0x90;//这里没有使用预定义文件,sbitP1_7=0x90a7;//之前我们使用的预定义文件其实就是这个作用sbitP1_1=0x91;//这里分别定义P1端口和P10,P11,P17弓|脚第七课算术运算符及其表达式(P69)7.1、Cx51算术运算符及其表达式算术运算符表达式含义+a+b加法运算符,或正值符号_a-b减法运算符,或负值符号*a*b乘法运算符,/a/b除法运算符,%9%5余4模(求余)运算符,或正值符号7.2、Cx51关系运算符及其表达式算术运算符表达式含义〈a〈b小于〉a>b大于〈二a<=b小于或等于〉=a>=b大于或等于==a==b测试等于!=a!=b测试不等于7.3、Cx51逻辑运算符及其表达式

算术运算符表达式含义&&a&&b逻辑“与”(AND)||a||b逻辑"或”(OR)!a!b逻辑“非”(NOT)7.4、Cx51位操作及其表达式算术运算符表达式含义&a&b按位与ab按位或"a"b按位异或'a~b按位取反<<a<<7左移7位>>a>>8右移8位注:左移或右移,空出位补“0”,移出位丢掉。7.5、Cx51自增减运算符及其表达式自增减运算符含义++i,--i在使用i之前,先使i值加(减)1i++,i--在使用i之后,再使i值加(减)17.6、Cx51复合运算符及其表达式算术运算符表达式含义+=a+=ba=a+b加法-=a-=ba=a-b减法*二a*=ba=a*b乘法/=a/=ba=a/b除法%=a%=ba=a%b求余<<=a<<=8a=a<<8左移>>=a>>=8a=a>>8右移&=a&=ba=a&b按位与a"=ba=a"b按位异或|=a|=ba=a|b按位或~=a~=ba=a~b按位取反注:优先级说明优先级illdoublelongunsigned低irttr—chair自动数据类型转换规则!(非)优先级算术运算符高关系运算符"位&和||赋值运算符低忧先次序第八课Cx51控制语句(P80)8.1、循环语句whiledowhileif/elseswitch/case(P90)for语句for(表达式1;表达式2;表达式3)for(i=0;i<50;i++)特例1:for(;i<50;i++)缺省表达式1,不对1设初值特例2:for(i=1;;i++){sum=sum+i}不判断循环条件,无休止地进行下去。相当于i=1;while(1){sum=sum+1;i++;}特例3:for(;i<100;){sum=sum+1;i++}相当于while(i<100){sum=sum+1;i++;}特例4:for(i=1;i<100;i++);没有循环体,起延时作用特例5:for(;;){/*循环体*/}相当于while(1){/*循环体*/}/*死循环体*/为了使程序具有可读性,不主张使用for语句的特例第九课Cx51T0中断(P182)9.1、T0定时器/计数器操作模式112分频TH1tlithi(8位)(8位〉、TF1广中断tC\T=OT1引脚己侦=1TR11-112分频TH1tlithi(8位)(8位〉、TF1广中断tC\T=OT1引脚己侦=1TR11-而1引脚一定时器/■计数器T1(或TO)操作模式1:16位计数器T1模式T0模式GATEC仃M1M0GATEC/fM1M2GATE=0或INT0(INT1)引脚高电平,与TR0(或TR1)二1打开控制门C/T=1计数器模式;WT=0定时器模式M1M2=00,01,10,11分别对应模式0、1、2、3

9.3、控制寄存器TCON(可位寻址)TF1TR1TF0TR0IE1IT1IE0IT0TCON.7TCON.6TCON.5TCON.4TCON.3TCON.2TCON.1TCON.0定时器1定时器定时器0定时器外部中断外部中断1类外部中断外部中断0类溢出标1运行溢出标0运行1请求标型控制位。由0请求标型控制位。由志,由硬控制志,由硬控制志。由硬软件置位或志。由硬软件置位或件置位,位。靠件置位,位。靠件置位,清除。IT1=1件置位,清除。IT0=1进入中断软件置进入中断软件置进入中断下降沿触发,进入中断下降沿触发,后被硬件“1”或后被硬件“1”或后被硬件IT1=1低电平后被硬件IT0=0低电平自动清除清“0”自动清除清“0”自动清除触发;自动清除触发;9.4、允许中断寄存器IE(可位寻址)EA-ET2ESET1EX1ET0EX0总允许保留定时器2串行口定时器1外中断1定时器0外中断01:开中断;0:关中断9.5、中断请求9.6、中断优先级寄存器IP(可位寻址)PSPT1PX1PT0PX0串行口定时器1外中断1定时器0外中断01:高优先级0:低优先级第十课串行移位寄存器HC595功能及编程外中断(INT0或INT1)及编程修改原理图:将P13与INT1管脚连接在一起,主程序条件:P14=0;IT1=1;/*下降沿触发*/EX1=1;/*外中断1允许*/EA=1;/*总中断允许*/按下“设定”键,进中断1服务程序,进入中断程序后,再进行键盘扫描,求出键位值如果发现按下“确认”键,则退出中断1服务程序。第十一课KeliC控制流程:以温度控制器为例画流程图第十二课伟福仿真器支持51单片机的汇编语言ORG0000HLJMPSTART;主程序开始ORG000BHLJMPT0PRG;T0中断程序ORG0023H;串行口中断程序LJMPUARTORG0100H;主程序入口地址START:MOVSP,#5FHMOVR0,#08HMOVR1,#5FHCLRAT0PRG:CLRES;T0中断程序入口地址MOVTL0,#0E0HMOVTH0,#0B1HRETI;中断返回UART:MOVR3,#8;串行口中断程序入口地址movA,#5TCNT:RRADJNZR3,TCNTRETI;中断返回END;汇编程序结束伟福仿真器编译汇编程序与编译C语言程序的过程是相同的,导入程序后按F9自动编译,连接,运行。第十三课Cx51数组(P94)13.1、一维数组的定义方法类型说明符数组名[整型表达式]charch[10];13.2、一维数组初始化1、在定义数组时给数组的全部元素赋值ucharidatach[6]={0,1,2,3,4,5};ch[0]=0,ch[1]=1,ch[2]=2,ch[3]=3,ch[4]=4,ch[5]=52、在定义数组时给数组的部分元素赋值ucharidatach[6]={0,1,2,};ch[0]=0,ch[1]=1,ch[2]=2,ch[3]=0,ch[4]=0,ch[5]=03、在定义数组时,若不对数组的全部元素赋值,则数组的全部元素被赋值为“0”intidatach[6];4、可以在程序运行过程中,用循环或键盘输入语句给数组赋值。13.3、二维数组的定义方法类型说明符数组名[整型表达式][整型表达式]intch[3][5];13.4、二维数组的存取顺序ch[0][0]->ch[0][1]->ch[0][2]->ch[0][3]->ch[0][4]->ch[1][0]->ch[1][1]->ch[1][2]->ch[1][3]->ch[1][4]->ch[2][0]->ch[2][1]->ch[2][2]->ch[2][3]->ch[2][4]13.5、二维数组初始化1、在定义数组时给数组的全部元素赋值intidatach[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};intidatach[3][4]={1,2,3,4},{5,6,7,8},{9,10,11,12};2、在定义数组时给数组的部分元素赋值inta[3][4]={{1},{5},{9}};/*赋值后数组元素如下*/["1000s5000摆QQL13.6、字符数组的定义方法类型说明符数组名[整型表达式]charch[10];13.7、字符数组置初值1、charch[10]={B,E,I,,J,I,N,G,\0};/*‘\0是结束符,如果定义时未加结束符,C编译器自动在其后面加入,所以定义字符数组的长度要比字符串中最长的串多一个字符,用于装入字符串的结束符\0*/2、charch[10]={“BEIJING”};3、charch[10]=“BEIJING;/*字符串常量*/13.8、数组的应用:查表数码管的段码表,传感器的非线性补偿表等都可以用数组的方法写到单片机的程序存储器中。使用查表法对温度传感器进行非线性修正。第十四课Cx51函数(P125)14.1、函数的分类:主函数和普通函数普通函数:标准库函数和用户自定义函数14.2、标准库函数标准库函数是由C编译系统的函数库提供的。14.3、用户自定义函数用户根据自己的需要编写的函数。14.4、函数的定义1、无参数函数的定义方法(既无返回参数,也无输入参数)void函数名(void)/*例子****************************/voidrst(void)//发复位脉冲{dat_1820=0;dl_us(80);//延时公式=30+(i-1)*13usdat_1820=1;dl_us(1);}*****************************2、有返回参数,无输入参数的函数的定义方法返回值类型标识符函数名(void){函数体语句}/*例子****************************/bitrdbit(void)//读一个位,bit返回值类型声明{uchari;bitdat_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,){函数体语句}/—//个S个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voiddl_ms(uintcount){uchari;while(count--){for(i=0;i<125;i++){;}}}/"""""""""""""""""""""""""""""""""""""""""""""""//个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/4、空函数的定义方法返回值类型标识符函数名(void){}/个〃I_个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/Floatmin(){}/"""""""""""""""""""""""""""""""""""""""""""""""/***********************************************调用空函数时。什么工作也不做,此函数只是模块化设计时占位需要,为以后程序扩充用。14.5、函数的参数和函数值1、形式参数在定义函数时,函数名后面括号中的变量名称为“形式参数”,简称“形数”///个〃II**********************************************/voiddl_ms(uintcount)/*在函数名dl_ms后面括号中的变量uintcount为“形式参数”,只是说明了参数的数据类型,没有实际的数值*/{uchari;while(count—){for(i=0;i<125;i++){;}}}/"""""""""""""""""""""""""""""""""""""""""""""""//个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/2、实际参数在函数调用时,主调用函数名后面括号中的表达式称为“实际参数”,简称“实参”。main(){dl_ms(500);/*主调用函数直接将数值500传递给dl_ms()函数*/}3、函数的返回值(P128)**************************************/*文件名:study3.C2008.4.6*/#include<reg52.h>typedefunsignedcharuchar;typedefunsignedintuint;uintmin(uintk1,uintk2);/*子函数声明。函数的形参k1,k2*/main()/*主函数开始*/{intresult;result=min(35,25);/*函数的实参k1=35,k2=25*/}intmin(intk1,intk2)/*子函数开始*/{intk3;k3=(k1+k2)/2;return(k3);/*计算结果送到k3*/}/""""""""""""""""""""""""""""""""""""""/**************************************mainO①ICDresult=mirL(35J25);1一斗①ICDintminfintkl^intk2)^return(k3);第①步:主调用函数main()在调用有参数min()函数时,将实际参数35,25分别传递给被调用函数的形参k1,k2第②步:被调用函数min()使用实参35,25作为输入变量进行运算,所得结果通过返回语句return(k3)返回给主函数第③步:在主函数result=min(35,25)中,通过等号赋值给变量resulto这个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、一般形式:被调函数声明;主调用函数***************************************voiddisp(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校验码48位产品序列号8位产品系列编码MSBLSBMSBLSBMSBLSBDS18B20的存储器结构(中间结果RAM)温度值低位字节温度值高位字节TH/用户使用字节1(TH的易失性拷贝,上电时被除数刷新)TL/用户使用字节2(TL的易失性拷贝,上电时被除数刷新)配置字节(配置寄存器易失性拷贝,上电时被除数刷新)保留字节(内部计算用)保留字节(内部计算用)保留字节(内部计算用)CRC字节非易失性电可擦除RAMTH/用户使用字节1(存储高温触发器)TL/用户使用字节2(存储低温触发器)配置字节(配置寄存器)配置寄存器0R1R011111MSBLSB其中R1和R0是温度分辨率,配置表如下:R1R0分辨率最大转换时间温度值分辨率

009位93.75(t/8)0.5°C0110位conv187.50((t/4)0.25°C1011位conv375((t/2)0.125C1112位conv750((t…)0.0625C出厂默认设置是12位分辨率MSB高位字节LSBMSB低位字节LSBSSSSS26252423222i202-i2-22-32-250.0625S是符号位温度值分辨率配置表温度数字输出(二进制)数字输出(十六进制)+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100010191H+10.125000000001010001000A2H+0.500000000000010000008H000000000000000000000H-0.51111111111111000FFF8H-10.1251111111101011110FF5EH-25.06251111111001101111FF6FH-551111110010010000FC90H15.4、DS18B20的单线协议,必须遵循下面的顺序:初始化:主机拉低单线480ps以上,产生复位脉冲,然后释放该线,进入Rx接收模式。主机释放总线时,会产生一个上升沿,DS18B20检测到这个是升沿后,延迟15-603,通过拉低总线'60-2403来产生应答脉冲,主机接收到从机的应答脉冲后说明有单线器件在线。(见下列时序)主机|》住Qus从机应答L(ACK);I60~240us15.5、DS18B20的命令1、ROM操作命令命令类型命令字节功能说明ReadRom(读ROM)33H此命令读激光ROM中的64位,只能用于总线上单个DS18B20器件的情况,多挂则会发生数据冲突。MatchRom(匹配ROM)55H此命令后跟64位ROM序列号,寻址多挂接总线上的对应DS18B20O只有序列号完全匹配的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲,此命令可用于单挂或多挂接总线。

SkipRom(跳过ROM)CCH用于单挂总线系统时,可以无须提供64位ROM序列号即可运行内存操作命令。如果总线上挂接多个DS18B20,并且在此命令后执行读命令,将会发生数据冲突。SearchRom(搜索ROM)F0H主机调用此命令,通过一个排除法过程,可以识别出总线上所有器件的ROM序列号AlarmSearch(告警ROM)ECH此命令流程和SearchRom命令相同,但是DS18B20只有在最近的一次温度测量时满足了告警触发条件,才会响应此命令。2、内存操作命令命令类型命令字节功能说明WriteScratchpad(写暂存器)4EH此命令写暂存器中地址2-地址4的3个字节(TH、TL和配寄存器)在发起复位脉冲之前,3个字节都必须要写。ReadScratchpad(读暂存器)BEH此命令读取暂存器内容,从字节0一直读取到字节8(第9个字节)。主机可以随时发起复位脉冲以停止此操作。CopyScratchpad(复制暂存器)48H此命令将暂存器中的内容复制到E2RAM,以便将温度告警触发字节存入非易失内存,如果在此命令后主机产生读时隙,那么只要器件在进行复制就会输出0,复制完成后,再输出1。ConvertT(温度转换)44H此命令开始温度转换操作。如果此命令后主机产生时隙,那么只要器件进行了温度转换就会输出0,转换完成后再输出1。RecallE2(重调E2存储器)B8H此命令将存储在E2RAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中。此重调操作在DS18B20加电时自动产生。ReadPowerSupply(读供电方式)B4H主机发此命令后的每个读数据时隙内,DS18B20会发信号通知它的供电方式:0为寄生电源方式,1为外部供电方式15.6、数据处理15.7、程序设计实例//温度计子程序ds18b20voidmrd1820(void)//18b20的主读程序{ucharidatalast;ucharlsb,msb;ET0=0;//读18b20时关T0中断tempst();//写18b20dl_us(150);//延时last=rdtemp();dl_us(50);//延时msb=last/10;lsb=last%10;buffer[0]=msb;buffer[1]=lsb;ET0=1;//读完18b20打开T0中断}voidrst(void)//发复位脉冲{dat_1820=0;dl_us(80);//延时公式=30+(i-1)*13usdat_1820=1;dl_us(1);}voidackp(void)//等待存在脉冲应答{uchari=0;while(dat_1820);while(~dat_1820);dl_us(1);}bitrdbit(void)//读一个位{uchari;bitdat_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);}ucharrdbyte(void)//读一个字节{uchari,j,dat;for(i=1;i<=8;i++){j=rdbit();dat=(j<<7)|(dat>>1);}

return(dat);}〃写1//写一个字节voidwtbyte(uchar〃写1//写一个字节{unsignedinti;ucharj;bittestb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){dat_1820=0;i++;i++;dat_1820=1;i=7;while(i>0){i--;}}else//写0{dat_1820=0;i=7;while(i>0){i--;}dat_1820=1;i++;i++;}}}voidtempst(void)//开始温度转换sssss{rst();ackp();rst();ackp();wtbyte(0xcc);//跳过rom检测wtbyte(0x44);//开始读温度dl_ms(8);}ucharrdtemp(void)//开始读温度{uchara,b,y1,y2,y3;rst();ackp();dl_ms(2);wtbyte(0xcc);//跳过rom检测wtbyte(0xbe);//开始读温度暂存器a=rdbyte();//读温度暂存器低字节b=rdbyte();//读温度暂存器高字节y1=a>>4;y2=b<<4;y3=y1|y2;buffer[2]=buffer1[a&0x0f];return(y3);}第十六课串行口及串行口中断(P193)16.1、串行口控制寄存器SCON(地址98H,可以位寻址)SM0SM1SM2RENTB8RB8TIRI16.2、串行口工作方式SM0SM1说明波特率00方式0同步移位寄存器fosc/1201方式18位UART可变10位异步收发由定时器控制10方式29位UART11位异步收发fosc/32或fosc/6411方式39位UART可变12位异步收发由定时器控制16.3、串行口RS232数据格式以方式1为例:起始位总是“0”(低电平),停止位总是“1”(高电平)1位起始位1位停止位-L-8位数据位卜■-二二二丁二二JI16.4、串行口RS232与主机通讯线连接16.5、串行口数据缓冲寄存器SBUFSBUF是一个可以直接寻址的串行口专用寄存器。实际上SBUF包含了两个独立的寄存器,个是发送寄存器,另一个是接收寄存器,但它们都共同使用同一个寻址地址一99H。CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。16.5、串行口RS232方式1:UART为(UniversalAsynchronousReceiver)、SCON中的REN为允许接收位,REN置1时串口允许接收,置0时禁止接收。REN是由软件置位或清零。、TB8发送数据位8,在模式2和3是要发送的第9位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。、RB8接收数据位8,在模式2和3是已接收数据的第9位。该位可能是奇偶位,地址数据标识位。在模式0中,RB8为保留位没有被使用。在模式1中,当SM2=0,RB8是已接收数据的停止位。、TI发送中断标识位。由硬件置位。TI置位后,申请中断,CPU响应中断后,发送下一帧数据。TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。、RI接收中断标识位。由硬件置位。RI=1,申请中断,要求CPU取走数据。但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。同样RI也必须要靠软件清除。、常用的串口模式1是传输10个位的,1位起始位(0),8位数据位,低位在先,1位停止位(1)。它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。、波特率:串行端口每秒内可以传输的波特位数。只有上下位机的波特率一样时才可以进行正常通讯。如标准9600模式1加上起始位和停止位,每个数据字节就要占用10个二进位,每秒传输的字节数是9600^10=960字节。模式1的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。计算模式1的波特率:波特率=(2SMO厚32)X定时器1溢出速率上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下:溢出速率=(计数速率)/(256-TH1)上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,通常用11.0592M晶体是为了得到标准的无误差的波特率定时器1为模式2,SMOD设为1:9600=(2:32)X((11.0592M/12)/(256-TH1))TH1=250、串行口常用波特率串行口工作方式波特率Fosc=6MHzFosc=12MHzFosc=11.0592MHzSMODTMODTH1SMODTMODTH1SMODTMODTH1方式01MXXX方式1或方式362.5K120FFH19.2K120FDH9.6K020FDH4.8K120F3H020FAH2.4K120F3H020F3H020F4AH1.2K120E6H020E6H020E8H600020CCH020CCH020D0H300120CCH02098H0202EH137.502072H020EFEBH020FEFFH16.6、串行口初始化(在主程序里)、确定定时器工作方式:编程TMOD、计算定时器1的初值:装载TH1、启动定时器1:编程TCON中的TR1、确定串行口的控制方式:编程SCON、串行口在中断方式工作时,须开源中断(ES=1)和总中断(EA=1)例:main(){TMOD=0x20;//定时器1定时方式2TH1=0xFD;//11.0592MHz晶振时,波特率9600TR1=1;//启动定时器1开始计数(TCON=0x40)SCON=0x50;〃串口方式1,允许接收位REN=1PCON=0x00;//PCON.7置位时可获得2倍的UART的波特率ES=1;//允许串行口中断EA=1;//打开总中断//RI=0;//清收发标志//TI=0;//}16.7、串行口接收、查询接收(在主程序里)for(i=0;i<32;i++)//准备接收32个数据{while(!RI);//等待接收标志RI变1RI=0;〃收到数据后RI标志变1,用软件清除number[i]=SBUF;//接收到的数据在SBUF中,存到数组number[i]是}、中断接收(在主程序里)在串行口中断服务程序中建立一个已进中断的标志,例如F_ri=1;serial()interrupt4//串行口中断服务子程序{if(RI==1){F_ri=1;//说明已经接收到一个数据,read=SBUF;//将接收到SBUF中的数据送到read中暂存RI=0;/用软件清除接收RI中断标志number[rd]=read;//数据送数组rd++;if(rd>60){rd=60;

在主程序里等待标志变“1”,while(1)在主程序里等待标志变“1”,while(1)即:F_ri=1{ES=1;while(F_ri==0);F_ri=0;dl_us(10);}16.8、串行口发送、不用中断发送一个字节(在主程序里):SBUF=0x5a;//向SBUF送一个数据0x5awhile(TI==0);//等待TI变"1”,while(!TI);TI=0;〃发送过程结束后,用软件清0、用中断发送一个字节在主程序里执行SBUF=0x5a;//向SBUF送一个数据0x5a的语句在子程序里判断是接收中断还是发送中断,进行相应的处理,一定要用软件清除相应的中断标志(RI或TI)16.9、通信协议(见附5:一个串行口通讯协议例子)、通讯协议即网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。、RS232通信协议基本结构波特率9600bit/s,8bit,1位停止,无校验位格式0EBH,地址,命令,长度(n),数据1,---数据n,冗余说明:0EBH为帧起始位长度小于输出端口数冗余=地址+命令+长度+数1+---+数n如果冗余=0EBH,为防止与帧起始位相同,则发送反码,即冗余=14H当接收正确时,1)在命令1,2,5,6时,回送0EBH,地址,命令,01H,0FAH,冗余,并执行命令。2)在命令3,4,7时,回送相应信息。当接收不正确时,1)地址正确,冗余不正确,回送0EBH,地址,命令,01H,0F5H,冗余。2)地址不正确,不回送任何信息。附1:KEILC51程序例子1/*文件名:study2.C2008.2.19*/#pragmaDEBUGCODE#include<reg52.h>/*define8052registers*/#include<stdio.h>/*defineI/Ofunctions*/typedefunsignedcharuchar;typedefunsignedintuint;ucharbdataFLAG;sbitFLAG1=FLAG';sbitFLAG2=FLAG"2;sbitP1_1=P1"1;uchardatatime,Dtime;#defineLAMPP00/*输出绿灯P00=1绿灯亮;P00=0绿灯灭*/#defineKEY_INP10/*输入单键按下P10=0,不按键P10=1*/ucharB_T50ms=200,B_T100ms=2,B_T200ms=4,B_T500ms=10;ucharB_TT1s=20,B_T30s=60,B_T120s=240;bitFLAG_ERRON;bitFLAG_SIGN;ucharJFLAG;uchardatabuffer[8];uchardataTemper[4];ucharidatabuffer0[150];//这条语句若用data定义,buffer。的长度就只能小于ucharcodebuffer1[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};voiddl_us(uintcount);voiddl_ms(uintcount);voidext_1(void);//interrupt2;voidTimer_0(void);//interrupt1;main(){ucharJFLAG,i;P1=0xFF;FLAG=P1;JFLAG=FLAG>>6;JFLAG=JFLAG&0x03;switch(JFLAG){case0:time=2;Dtime=20;break;case1:time=4;Dtime=40;break;case2:time=6;Dtime=60;break;case3:time=8;Dtime=80;break;}for(i=1;i<180;i++){buffer0[i]=0;}for(i=1;i<150;i++)(buffer0[i]=i;}while(1)//单键没按下P10=1执行下列语句,上电时灯就亮,{if(P10==1){LAMP=1;}else{LAMP=0;dl_ms(500);}}}voiddl_us(uintcount){uinti;for(i=0;i<count;i++){;}}voiddl_ms(uintcount){uchari;while(count--){for(i=0;i<125;i++){;}}}ext_1()interrupt2{EX1=0;//进中断程序后就关掉外中断1,改为查询方式ET0=1;}Timer_0()interrupt1{}附2:KEILC51程序例子2#pragmaDEBUGCODE#include<reg52.h>/*define8052registers*/#include<stdio.h>/*defineI/Ofunctions*/typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void)(uchavar1,var2,result1,result2;var1=3;var2=5;result1=var1+var2;result2=var1*var2;while(1)}注:其中reg51.h或reg52.h是头文件,C语言系统自带的。这是关于单片机资源的定义文件。如果选用89C51单片机,则头文件选reg51.h;如果选用89C52单片机,则头文件选reg52.h;系统带的头文件可能不全时,应由用户自已修改。例如打开reg52.h文件只有对口地址的定义,而没有口的各位的定义附3:表5-1常用转义字符表转义字符含义ASCII码(16/10进制)\o空字符(NULL)00H/0\n换行符(LF)0AH/10\r回车符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f换页符(FF)0CH/12\'单引号27H/39\"双引号22H/34\\反斜杠5CH/92附4:51单片机中断源中断源矢量单元中断编号外部中断00003H0定时器0溢出000BH1外部中断10013H2定时器1溢出001BH3串行口0023H4附5:—个串行口通讯协议例子;通讯协议;PC发送的命令;1、回送出错命令变址量=4;命令格式起始DE=01**CRCCR

TOC\o"1-5"\h\z;PC发送码@01**01CR;仪表接收码ERR:DB40H,30H,31H,2AH,2AH,30H,31H,0DH;2、回送正确命令变址量=4;命令格式起始DE=01##CRCCR;PC发送码@01##01CR;仪表接收码RIG:DB40H,30H,31H,23H,23H,30H,31H,0DH;3、读0010H内的时间参数(两个字节)变址量=11;命令格式起始DE=01RE地址=0010H长度CRCCR;PC发送码@0152450010234CR;仪表接收码RE210:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,32H,33H,34H,0DH;4、读0012H内的功率参数(两个字节)变址量=11;命令格式起始DE=01RE地址=0012H长度CRCCR;PC发送码@0152450012236CR;仪表接收码RE212:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,32H,32H,33H,36H,0DH;5、读0010H时间参数(两个字节)和功率参数(两个字节)变址量=11;命令格式起始DE=01RE地址=0010H长度CRCCR;PC发送码@0152450010432CR;仪表接收码变址量=RE410:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,34H,33H,32H,0DH;6、往仪表内写时间参数(两个字节)假设写34分00秒变址量=10;命令格式起始DE=01W2地址=0010时间CRCCR;PC发送码@0157320010

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论