第10章mcs-51单片机控制与c语言_第1页
第10章mcs-51单片机控制与c语言_第2页
第10章mcs-51单片机控制与c语言_第3页
第10章mcs-51单片机控制与c语言_第4页
第10章mcs-51单片机控制与c语言_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

第10章 MCS51单片机控制与C语言,下页,10.1 C语言与MCS5110.2 C51数据类型及在MCS-51中的存储方式10.3 C51数据的存储类型与MCS-51存储结构10.4 MCS-51特殊功能寄存器(SFR)的C51定义10.5 MCS-51并行接口的C51定义10.6 位变量的C51定义10.7 用C语言写51单片机软件的一般方法10.8 常用C51软件设计,10.1 C语言与MCS51,C语言是一种编译型语言,兼顾了多种高级语言的特点,并具有汇编语言的某些特征.,用C语言开发单片机应注意以下几点:,必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器结构,以按实际地址处理端口数据,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。,上页,下页,回目录,寄存器的分配和存储器的管理可由C编译器自动管理,语法规定、程序结构及程序设计方法与标准的C语言程序设计相同。,10.1 C语言与MCS51,用C语言开发单片机应注意以下几点:,上页,下页,回目录,10.1 C语言与MCS51,用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),转换生成单片机可执行的代码程序。支持MCS51系列单片机的C语言编译器有很多种。其中KEIL/Franklin以它的代码紧凑和使用方便等特点优于其它编译器。本章是针对这种编译器介绍 MCS51单片机C语言程序设计。,10.2 C51数据类型及在MCS-51中的存储方式,.C51的数据类型 Franklin C51编译器具体支持的数据类型有:位型(bit)、无符号字符(unsigned char)、有符号字符(singed char)、无符号整型(unsigned int )、有符号整型(signed int )、无符号长整型(unsigned long )、有符号长整型(signed long )、浮点型(float)和指针类型等。,表10.1 Franklin C51的数据类型,. C51数据在MCS-51中的存储方式,位变量(bit):与MCS-51硬件特性操作有关的可以定义成位变量。位变量必须定位在MCS-51单片机片内RAM的位寻址空间中。 字符变量(char):字符变量的长度为1 byte即8位。这很合适MCS-51单片机,因为MCS-51单片机每次可处理8位数据。对于无符号变量(unsigned char)的值域范围是0255。,. C51数据在MCS-51中的存储方式,对于有符号字符变量(signed char),最具有重要意义的位是最高位上的符号标志位(msb)。此位为1代表负,为0代表正。有符号字符变量和无符号字符变量在表示0127的数值时,其含义是一样的,都是00x7F。负数一般用补码表示,即用11111111表示-1, 用11111110表示-2。当进行乘除法运算时,符号问题就变得十分复杂,而C51编译器会自动地将相应的库函数调入程序中来解决这个问题。,整型变量(int): 整型变量的长度为16位。MCS-51系列单片机将int型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字节中。有符号整型变量(signed int)也使用msb位作符号标志位,并使用二进制补码表示数值。可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。整型变量值0x1234以图10.1所示的方式存放在内存中。,. C51数据在MCS-51中的存储方式,图10.1 整型数的存储结构,+0+1,地址,+0+1+2+3,地址,图10.2 长整型变量的存储结构,. C51数据在MCS-51中的存储方式,在编程时,如果只强调运算速度而不进行负数运算时,最好采用无符号(unsigned)格式。 无符号字符类型的使用:无论何时,应尽可能使用无符号字符变量,因为它能直接被MCS-51所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量虽然也只占用一个字节,但需要进行额外的操作来进行测试代码的符号位。这无疑会降低代码效率。,. C51数据在MCS-51中的存储方式,10.3 C51数据的存储类型与MCS-51存储结构,表 10.2 C51存储类型与MCS-51存储空间的对应关系,表10.3 C51存储类型及其数据长度和值域,10.3 C51数据的存储类型与MCS-51存储结构,带存储类型的变量的定义的一般格式为: 数据类型 存储类型 变量名,带存储类型的变量定义举例:char data var1;bit bdata flags;unsigned int pdata var2;unsigned char vector34;,10.3 C51数据的存储类型与MCS-51存储结构,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H0FFH。SFR中有11个寄存器具有位寻址能力. 为了能直接访问这些SFR,Franklin C51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C语言编程。这些定义在头文件reg51.h中.,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,#ifndef _REG51_H_#define _REG51_H_/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;,sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* BIT Register */* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* TCON */sbit TF1 = 0x8F;sbit TR1 = 0x8E;sbit TF0 = 0x8D;sbit TR0 = 0x8C;sbit IE1 = 0x8B;sbit IT1 = 0x8A;sbit IE0 = 0x89;sbit IT0 = 0x88;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* IE */sbit EA = 0xAF;sbit ES = 0xAC;sbit ET1 = 0xAB;sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* IP */ sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* P3 */sbit RD = 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;,10.4 MCS-51特殊功能寄存器(SFR)的C51定义,.头文件 reg51.h,/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;,#endif,10.5 MCS-51并行接口的C51定义,MCS-51系列单片机并行I/O接口除了芯片上的4个I/O口(P0P3)外,还可以在片外扩展I/O口。MCS-51单片机I/O口与数据存储器统一编址,即把一个I/O口当作数据存储器中的一个单元来看待。 使用C51进行编程时,MCS-51片外扩展的I/O可以在一个头文件中定义,absacc.h就是这个头文件.,10.5 MCS-51并行接口的C51定义,absacc.h头文件,#ifndef _ABSACC_H_#define _ABSACC_H_#define CBYTE (unsigned char volatile code *) 0)#define DBYTE (unsigned char volatile data *) 0)#define PBYTE (unsigned char volatile pdata *) 0)#define XBYTE (unsigned char volatile xdata *) 0),#define CWORD (unsigned int volatile code *) 0)#define DWORD (unsigned int volatile data *) 0)#define PWORD (unsigned int volatile pdata *) 0)#define XWORD (unsigned int volatile xdata *) 0),10.5 MCS-51并行接口的C51定义,#ifdef _CX51_#define FVAR(object, addr) (*(object volatile far *) (addr)#define FARRAY(object, base) (object volatile far *) (base)#define FCVAR(object, addr) (*(object const far *) (addr)#define FCARRAY(object, base) (object const far *) (base)#else#define FVAR(object, addr) (*(object volatile far *) (addr)+0x10000L)#define FCVAR(object, addr) (*(object const far *) (addr)+0x810000L)#define FARRAY(object, base) (object volatile far *) (base)+0x10000L)#define FCARRAY(object, base) (object const far *) (base)+0x810000L)#endif#endif,absacc.h头文件,对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。例如#include #define PORTA XBYTE 0xFFC0 将PORTA定义为外部I/O口,地址为 FFC0H,长度为8位。 一旦在头文件或程序中对这些片外I/O口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系。,10.5 MCS-51并行接口的C51定义,.位变量C51定义。使用C51编程时,定义了位变量后,就可以用定义了的变量来表示MCS-51的位寻址单元。 位变量的C51定义的一般语法格式如下: 位类型标识符(bit) 位变量名; 例如:bit direction_bit ;/* 把direction_bit定义为位变量 */bit look_pointer ;/* 把look_pointer定义为位变量 */,10.6 位变量的C51定义,.函数可包含类型为“bit”的参数,也可以将其作为返回值。例如: bit func(bit b0, bit b1) /* 变量b0,b1作为函数的参数 */ return (b1); /* 变量b1作为函数的返回值 */ ,10.6 位变量的C51定义,.对位变量定义的限制。位变量不能定义成一个指针,如不能定义:bit * bit_pointer。不存在位数组,如不能定义:bit b_array 。 在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于MCS-51片内的RAM区中。因此,存储类型限制为data和idata,如果将位变量的存储类型定义成其它存储类型都将编译出错。,10.6 位变量的C51定义,例1 先定义变量的数据类型和存储类型:bdata int ibase; /* 定义ibase为bdata整型变量 */bdata char bary4;/* bary4定义为bdata字符型数组 */然后可使用sbit定义可独立寻址访问的对象位:sbit mybit0 = ibase0 ;/* mybit0定义为ibase的第0位 */sbit mybit15 = ibase15;/* mybit0定义为ibase的第15位 */sbit Ary07 = bary07 ;/* Ary07定义为abry0的第7位 */sbit Ary37 = bary37 ;/* Ary37定义为abry3的第7位 */,10.6 位变量的C51定义,10.7 用C语言写51单片机软件的一般方法,.C语言控制8051单片机的I/O口例:编写程序使P1.3上接的LED发光管每隔约0.3秒闪烁一次.,/文件名:LED1.C#include /标准头文件sbit LED=P13; /LED接于P1.3void main(void) /主函数无返回值, int j; /整型变量j while(1) /死循环 LED=0; /亮 for(j=0;j30000;j+);/延时 LED=1; /灭 for(j=0;j30000;j+); /延时 ,10.7 用C语言写51单片机软件的一般方法,.C语言控制8051单片机的I/O口,.C语言对MCS-51单片机位处理器的应用,如:sbit spcialbit=0xe1; /spcialbit为ACC.1bit bitval; /定义bitval为位变量bit button;bitval=spcialbit; /bitval=ACC.1If(bitval)button=0;else button=1; /butoon与bitval相反button=!bitval; /butoon与bitval相反,.C语言管理MCS-51单片机内部定时器,例:用查询方法在LED口上输出10Hz的方波.晶振频率11.0592Hz.#include sbit LED=P13;Void INIT_TMR1(void) TMOD=0x11; /T1方式1 TH1=0x4C; /定时0.05S初值 TL1=0; TR1=1; /启动T1,Void main(void) INIT_TMR1(); while(1) /死循环 if(TF1=1) /溢出 LED=LED; /取反 TF1=0; /清TF1 TH1=0x4C; /重置初值 TL1=0; ,.C语言管理MCS-51单片机中断系统,例:用中断方法在LED口上输出10Hz的方波.晶振频率11.0592Hz./文件名:TINT.C#includeSbit LED=P13;Void INIT_TMR1(void); TMOD=0x11; TH1=0x4C; TL1=0; TR1=1;,void INIT_TMRINT(void) ET1=1;EA=1:void TMR1_INT_SRV(void) interrupt 3 /interrupt3 T1中断关键字 TH1=0x4C; LED=LED;void main(void) /中断由硬件自动调用 INIT_TMR1(); INIT_TMR1INT(); while(1) ,.C语言管理MCS-51单片机中断系统,例:将一个键接到外部中断0的端口线上,按键接通将引起INT0中断.中断服务程序将LED点亮(“0”)一会,然后熄灭,等待下次中断.,/文件名:EXTINT.C#includesbit LED=P13;void EXT0_INIT(void); EX0=1;IT0=1;EA=1; /开INT0中断,下降沿触发Void EXT0_INT_SRV(void) interrupt 0 data int j; /整型j在片内RAM区,LED=0; /亮 for(j=0;j30000;j+); /延时 for(j=0;j30000;j+); LED=1; /灭void main(void) EXT0_INIT(); while(1);,.C语言管理MCS-51单片机中断系统,10.8 常用C51软件设计,/ 软件实验一 存储器块清零xdata unsigned char Buffer256 _at_ 0x8000;void main() unsigned int index; unsigned char xdata * ptr; ptr = / 清0, 地址加一 ,/软件实验二 将 Number 拆为三个 BCD 码, 并存入 Result 数组void main() unsigned char Result3; unsigned char Number; Number = 123; Result0 = Number / 100; / 除以 100, 得百位数 Result1 = (Number % 100) / 10; / 余数除以 10, 得十位数 Result2 = Number % 10; / 余数为个位数,10.8 常用C51软件设计,10.8 常用C51软件设计,/软件实验三将 两位十六进制数变为二个 ASCII 码, 并存入 Result 数组code unsigned char ASCIITable16 = 0123456789ABCDEF; / 定义数字对应的ASCII表void main() unsigned char Result2; unsigned char Number; Number = 0x1a; /两位十六进制数 Result0 = ASCIITableNumber / 16; / 高四位 Result1 = ASCIITableNumber / 低四位,10.8 常用C51软件设计,/软件实验四 内存块移动xdata unsigned char Buffer1256 _at_ 0x8000;xdata unsigned char Buffer2256 _at_ 0x8800;void main() unsigned int index; unsigned char xdata * ptr1; unsigned char xdata * ptr2; ptr1 = ,10.8 常用C51软件设计,void Func0() void Func1() void Func2() void Func3() void FuncEnter(unsigned char FuncID) switch (FuncID) case 0: Func0(); break; case 1: Func1(); break; case 2: Func2(); break; case 3: Func3(); break; default: break; void main() FuncEnter(0); FuncEnter(1); FuncEnter(2); FuncEnter(3); while(1);,/软件实验五 程序跳转表,10.8 常用C51软件设计,#define Size 10unsigned char ArraySize;void main () bit Change; unsigned char index; unsigned char Temp; do Change = 0; for (index = 0; index Arrayindex+1) Change = 1; Temp = Arrayindex; Arrayindex = Arrayindex+1; Arrayindex+1 = Temp; while (Change);,/软件实验六 数据排序,10.8 常用C51软件设计,#include void delay() unsigned int i; for (i=0; i20000; i+) void main() unsigned char index; unsigned char LED; while (1) LED = 1; /初值为1,点亮最低位 for (index=0; index 8; index+) P1 = LED;/点亮位某位 LED = 1;/按位左移一位 delay(); ,P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。,硬件实验一 P1口输入、输出实验,10.8 常用C51软件设计,#include sbit Output = P10;void Delay() unsigned int i; for (i=0; i20000; i+) ;void main() while (1) Output = 0; Delay(); Output = 1; Delay(); ,用单片机的端口,输出电平控制继电器的吸合和断开,实现对外部装置的控制。,硬件实验二 继电器控制实验,10.8 常用C51软件设计,xdata unsigned char CS245 _at_ 0x8000;void main() unsigned char b; while (1) b = CS245; /输入状态在b中 ,硬件实验三 用74LS245读入数据,扩展一片74LS245,来读入开关状态。,10.8 常用C51软件设计,xdata unsigned char CS273 _at_ 0x8000;void main() unsigned char i, b; b = 1; for (i=0; i8; i+) CS273 = b; b = 1; ,扩展一片74LS273作为输出口,控制八个LED灯。,硬件实验四 用74LS273输出数据,10.8 常用C51软件设计,/ 输出 50% (5:5) 占空比 PWM#include sbit OUTPUT = P10;void Delay(unsigned char CNT) unsigned char i; while (CNT-) for (i=0; i50; i+) ; void main() while (1) OUTPUT = 0; Delay(5); OUTPUT = 1; Delay(5); ,硬件实验五 PWM转换电压实验,用P1端口输出不同占空比的脉冲,通过PWM转换电压电路转换成电压。,10.8 常用C51软件设计,#include sbit Speaker = P10;void Delay() unsigned char i; for (i=0; i= 1; / 移位 delay(1); / 延时 ; dd = PortB; / PB输入 PortA = dd; / 再输出到PA delay(2); ,10.8 常用C51软件设计,#include void Send164(unsigned char b) SCON = 0; / 串口方式0 SBUF = b; / 输出 bvoid main() Send164(0x55);/输出#01010101 while(1);,利用单片机的串行口输出,利用74LS164移位转换成并行数据,接在LED灯上显示。,硬件实验八 串行数转换并行数实验,10.8 常用C51软件设计,#include sbit LD = P10;unsigned char Read165() LD = 0; LD = 1; SCON = 0x10;/串口方式0 while (!RI) ; return(SBUF);void main() unsigned char b; b = Read165();,硬件实验九 并行数转换串行数实验,将外接的并行数利用74LS165读入,并且移位转换成串行数,利用单片机串行口读入。,10.8 常用C51软件设计,#include void main() TMOD = 0x05; / 方式1,记数器 TH0 = 0; TL0 = 0; TR0 = 1; / 开始记数 while (1) P1 = TL0; / 将记数结果送P1口,硬件实验十 计数器实验,8031内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。,10.8 常用C51软件设计,#include sbit LED = P10;bit LEDBuf;void ExtInt0() interrupt 0 LEDBuf = !LEDBuf; LED = LEDBuf;void main() LEDBuf = 0; LED = 0; TCON = 0x01; / INT0下降沿触发 IE = 0x81; / 打开外部中断允许位(EX0)及总中断允许位(EA) while (1) ;,用单次脉冲申请中断,在中断处理程序中对输出信号进行反转。,硬件实验十一 外部中断实验,10.8 常用C51软件设计,#include #define Tick 10000 / 10000 x 100us = 1s#define T100us (256-50) / 100us时间常数(6M)unsigned int C100us; / 100us记数单元bit LEDBuf;sbit LED = P10;void T0Int() interrupt 1 C100us-; if (C100us = 0) C100us = Tick; / 100us 记数器为0, 重置记数器 LEDBuf = !LEDBuf; / 取反LED ,硬件实验十二 定时器实验,用内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转.,10.8 常用C51软件设计,void main() TMOD = 0x02; / 方式2, 定时器 TH0 = T100us; TL0 = T100us; IE = 0x82; / EA=1, IT0 = 1 LEDBuf = 0; LED = 0; C100us = Tick; TR0 = 1; / 开始定时 while (1) LED = LEDBuf; ,10.8 常用C51软件设计,硬件实验十六 八段数码管显示,动态显示一行数据.,10.8 常用C51软件设计,/ 硬件实验十六 八段数码管显示#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; / 位控制口xdata unsigned char OUTSEG _at_ 0x8004; / 段控制口xdata unsigned char IN _at_ 0x8001; / 键盘读入口unsigned char LEDBufLEDLen; / 显示缓冲code unsigned char LEDMAP = / 八段管显示码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;,void Delay(unsigned char CNT) unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);,10.8 常用C51软件设计,void DisplayLED() unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; / 从左边开始显示 for (i = 0; i = 1; / 显示下一位 OUTBIT = 0; / 关所有八段管,10.8 常用C

温馨提示

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

评论

0/150

提交评论