Professional Documents
Culture Documents
Iniciacin a la programacin
en C del microcontrolador 8051
Organizacin de la memoria
en el 8051
Memoria de datos
-escritura/lectura
-Variables
Interna
Externa
Hasta 64 Kbytes
Interna
Memoria de programa
-slo lectura.
Externa
-Cdigo de programa:
libreras, funciones y constantes.
4 Kbytes de ROM
Hasta 64 Kbytes
Organizacin de la memoria
en el T89C51RD2
- 256 bytes (128 + 128)
Interna
Memoria de datos
Externa
- Hasta 64 Kbytes
Interna
Memoria de programa
Externa - Hasta 64 Kbytes
Tipo y regin de memoria
Especificadores de
memoria de datos interna
Memoria de datos interna de acceso directo y/o indirecto
FFH
Direcc.
Indirecto
128 bytes
Especificador
idata
Direcc. Indirecto
(Hasta 256 bytes)
FFH
7FH
00H
Direcc.
Directo
SFR
128 bytes
Direcc.
Directo
&
Indirecto
128 bytes
7FH
Especificador
data
Direcc. Directo
Accesos rpidos
Especificadores de memoria
de datos externa y de programa
Especificador xdata
Especificador pdata
Especificador code
Ejemplos:
1) char data x, y; /*vbles x, y residen en memoria interna, acceso directo (rapidez) */
2) unsigned int xdata buffer[100]; /* array buffer situado en memoria externa */
3) unsigned char code parametros[]={0x10, 0x20, 0x40, 080}; /*constantes
almacenadas en la memoria de programa (ROM)*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)
Especificadores de
almacenamiento.
En general
data
Modelos de memoria
Especifica el tipo de memoria utilizada por defecto para variables
y argumentos de funciones no declaradas explcitamente.
small Empleado por defecto. Vbles y datos residen en memoria
de datos interna (=data). Es el ms rpido.
compact Vbles y datos residen en una pgina de memoria
de datos externa (=pdata). Velocidad intermedia.
large Vbles y datos residen en la memoria de datos externa (=xdata).
El ms lento y genera cdigo ms largo.
Modelos de memoria
Las variables internas de una funcin se pueden forzar
a residir en un rea de memoria
Ejemplo:
int func (int x, int y) large
{
x=10;
y=20;
printf (la suma es %d \n, x+y);
return (x-y+5);
}
Sita las vbles locales de func en la memoria externa.
&
Constantes, variables
y tipos de datos
C51 soporta 4 nuevos tipos de datos.
Tipo de datos
Bits
Bytes
Rango de valores
signed char
unsigned char
enum
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
float
bit
sbit
sfr
sfr16
8
8
16
16
16
16
16
32
32
32
1
1
8
16
1
1
2
2
2
2
2
4
4
4
-128 a +127
0 a 255
-32768 a +32768
-32768 a +32768
0 a 65535
-32768 a +32768
0 a 65535
-2147483648 a 2147483647
0 a 4294967295
1.175494E-38 a 3.402823E+38
0a1
0a1
0 a 255
0 a 65535
1
2
Ejemplos:
1) bit flag1=0, semaforo; /*define vbles flag y semaforo de tipo bit e inicializa flag1=0*/
2) char bdata valor;
sbit valor_3=valor^3; /* valor en rea direccionable bit a bit; valor_3 = cuarto bit de valor*/
3) unsigned int bdata numero;
sbit num_8=numero^8;
sbit num_0=numero^0;
numero=0x0100; /* num_0 valdr 1 y num_8 valdr 0 */
4) sbit at 0xAF EA; /* establece EA como vble. tipo bit cuya dir es la 0xAF de mem. interna*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)
Ejemplos:
Todos los registros SFR estn definidos en el archivo reg51.h
1) sfr at 0x80 P0 ;
sfr P0 = 0x80; /* dos formas de definir el puerto 0 */
2) sbit P0_7 = P0^7; /* bit 7 del puerto 0 (empezando por el 0)*/
3) sfr16 DPTR = 0x82; /* SFR de 16 bits */
4) P0_7=1; /* pone el bit 7 del puerto 0 a uno */
5) TCON=0x40; /*SFR TCON a 40h*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)
&
Estructuras
Estructuras
datos relacionados
igual o distinto tipo
Ejemplo:
Situacin en memoria
struct coordenadas{
unsigned char punto[10];
unsigned int x;
unsigned int y;
}; /*define la estructura coordenadas*/
punto
x
y
10 bytes
2 bytes
2 bytes
14 bytes
Estructuras
Los miembros de la estructura se acceden mediante el operador .
Ejemplo:
.
.
struct coordenadas coor_robot={R2D2, 10, 5};
printf (El robot %s tiene como coordenadas %d , %d \n,
coor_robot.punto, coor_robot.x, coor_robot.y);
Lo que dar como resultado:
El robot R2D2 tiene como coordenadas 10, 5
&
Estructuras
El especificador bdata permite forzar a una estructura a residir en el
rea de memoria direccionable bit a bit
Ejemplo:
bdata struct Tswithches {
unsigned char sw1;
unsigned char sw2;
} swithches;
sbit sw_read1 = switches.sw1 ^ 0;
sbit sw_read2 = switches.sw2 ^ 4;
Estructuras
Ejemplo:
#include <reg51.h>
struct TDatos
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
};
struct TDatos Datos;
bdata struct TDatos Datos2;
void main ()
{
Datos.bit0 = 0;
Datos.bit1 = 1;
Datos.bit2 = 1;
Datos.bit3 = 0;
Datos.bit4 = 1;
Datos.bit5 = 1;
Datos.bit6 = 1;
Datos.bit7 = 0;
Datos2.bit0 = 0;
Datos2.bit1 = 1;
Datos2.bit2 = 1;
Datos2.bit3 = 0;
Datos2.bit4 = 1;
Datos2.bit5 = 1;
Datos2.bit6 = 1;
Datos2.bit7 = 0;
while (1);
}
Estructuras
Ejemplo:
void main ()
{
Datos.bit0 = 0;
Datos.bit1 = 1;
Datos.bit2 = 1;
Datos.bit3 = 0;
Datos.bit4 = 1;
Datos.bit5 = 1;
Datos.bit6 = 1;
Datos.bit7 = 0;
; SOURCE LINE # 21
MOV A,Datos
ANL A,#0FEH
MOV Datos,A
; SOURCE LINE # 22
MOV A,#001H
RL
A
MOV B,A
MOV A,Datos
ANL A,#0FDH
ORL A,B
MOV Datos,A
; SOURCE LINE # 23
MOV A,#001H
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0FBH
ORL A,B
MOV Datos,A
; SOURCE LINE # 24
CLR A
RL
A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0F7H
ORL A,B
MOV Datos,A
; SOURCE LINE # 25
MOV A,#001H
SWAP A
MOV B,A
MOV A,Datos
ANL A,#0EFH
ORL A,B
MOV Datos,A
; SOURCE LINE # 26
MOV A,#001H
SWAP A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0DFH
ORL A,B
MOV Datos,A
; SOURCE LINE # 27
MOV A,#001H
SWAP A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0BFH
ORL A,B
MOV Datos,A
; SOURCE LINE # 28
CLR A
SWAP A
RL
A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#07FH
ORL A,B
MOV Datos,A
Estructuras
Ejemplo:
Datos2.bit0 = 0;
Datos2.bit1 = 1;
Datos2.bit2 = 1;
Datos2.bit3 = 0;
Datos2.bit4 = 1;
Datos2.bit5 = 1;
Datos2.bit6 = 1;
Datos2.bit7 = 0;
while (1);
}
CLR
SETB
SETB
CLR
SETB
SETB
SETB
CLR
?WHILE1:
SJMP
; SOURCE LINE # 31
Datos2.0
; SOURCE LINE # 32
Datos2.1
; SOURCE LINE # 33
Datos2.2
; SOURCE LINE # 34
Datos2.3
; SOURCE LINE # 35
Datos2.4
; SOURCE LINE # 36
Datos2.5
; SOURCE LINE # 37
Datos2.6
; SOURCE LINE # 38
Datos2.7
; SOURCE LINE # 41
?WHILE1
Uniones
Uniones
datos relacionados
igual o distinto tipo
&
& Tiene sentido cuando los datos se tratan en distinto instante de tiempo
union Ttemporizador{
unsigned int word;
struct {
unsigned char hi;
unsigned char low;
} bytes;
};
union Ttemporizador new_count;
1 byte
new_count.bytes.hi = TH1;
new_count.bytes.low = TL1;
1 byte
old_count = new_count.word;
Ejemplo:
char hi
int word 2 bytes
char lo
Punteros
Guardan las direcciones de otras variables (direccionamiento indirecto)
10
Punteros en C51
En C51 existen dos tipos de punteros:
1) Punteros tipo: en ellos se declara el tipo de memoria a la que apuntan.
2) Punteros genricos: el tipo de memoria a la que apuntan se define
durante la compilacin.
Ejemplo puntero tipo
unsigned char data * xdata x_ptr;
,declara x_ptr como puntero almacenado en memoria xdata,
para apuntar datos almacenados en memoria data de tipo carcter.
& La memoria que ocupa por un puntero tipo depende del dato al que apunte:
punteros a idata, data, bdata, y pdata 1 byte
punteros a code y xdata 2 bytes
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)
11
Punteros en C51
Ejemplo:
unsigned char data * xdata x_ptr;
dato
Tipo de memoria donde reside el puntero
4
4A
4B
4A
x_ptr
xxxxxxxx
49
xdata
data
&
xdata
2
1 byte
pdata
3
1 byte
data/bdata
4
code
5
+ lento
- eficiente
12
Conversin de punteros
Algunas funciones requieren punteros genricos como argumento:
Ej: printf, sprintf, gets
Punteros a arrays
El nombre de un array es un puntero fijo
temp [0]
temp [1]
.
int temp [20]
.
.
.
temp [19]
&
.
.
.
*temp
*(temp+1)
.
.
.
.
*(temp+19)
*(temp+n)
Permite acceder
a los elementos del array
13
Arrays de punteros
Permiten apuntar a diferentes elementos de un grupo de datos
Ejemplo:
*(nombres+i)[n]
char *nombres[]=
{Jose,
Julio,
Antonio,
Ana
};
i=0.
*nombres[0]
Jose
*nombres[1]
Julio
*nombres[2]
Antonio
*nombres[3]
Ana
tiempo
*ptr
retardo
patron
14
cierta (0)sentencia1
Ifelse evala la expresin test
falsa (=0)sentencia2
15
Expresin_inicio
falso
test
Ejemplo
void main (void)
{
int n, factorial=1;
for(n=6;n!=1;n--) factorial*=n;
printf (el factorial de 6 es %d \n,factorial);
}
verdadero
Sentencias
Expresin_rep.
num=1
switch (num)
{
case 1:
Num?
otro
num=2
sentencia_1;
break;
case 2:
sentencia_1
sentencia_2
otras_sent
sentencia_2;
break;
default:
otras_sentencias
}
16
Funciones
Permiten una programacin estructurada.
Realizan tareas especficas y pueden comunicarse entre ellas
a travs de parmetros y resultados.
Despus de su ejecucin el control se devuelve al mdulo que la
llam, para continuar su ejecucin a partir del mismo punto
Declaracin (prototipado)
&
Nombre
Argumentos
Datos que devuelve
Tipo de memoria utilizada
Funciones (II)
Formato de declaracin de una funcin en C51
return_tipo nombre_func(arg) [mem_tipo] [reentrant] [interrupt] [using]
return_tipo: Tipo del valor retornado por la funcin. Si no se especifica, se asume por
defecto el tipo int.
nombre_func: Nombre de la funcin.
args: Es la lista de argumentos de la funcin.
mem_tipo: Especificacin explcita del modelo de memoria (small, compact,o large)
reentrant: Indica que la funcin es recursiva o reentrante.
interrupt: Indica que se trata de una funcin de interrupcin.
using: Especifica el banco de registros utilizado por la funcin (0-3) (ej. Using 2)
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)
17
Funciones (III)
Ejemplo
Vbles i,j,k de main en RAM interna
#pragma small
void main (void)
{
int i=10, j=20, k;
k= xfunc(i, j);
}
Funciones (IV)
Paso de parmetros a una funcin
Debido al pequeo tamao de la pila (128 bytes)
el paso de parmetros se realiza de dos modos:
char/ptr
(1 byte)
int/ptr
(2 bytes)
long/float
ptr
genrico
R7
R6,R7
R4-R7
R1-R3
R5
R4,R5
R4-R7
R1-R3
R3
R2,R3
R1-R3
18
Funciones (V)
Tambin se pueden retornar los valores la funcin a travs de registros
Tipo de dato
char (1 byte)
R4
int (2 bytes)
R4,R5
&
Registro
R0,R2,R3
float (4 bytes)
R4-R7
double (6 bytes)
R2-R7
R1-R7
&
Funciones (VI)
2) Paso de parmetros a travs de memoria
#pragma NOREGPARMS
extern int bfunc(float, int, char)
void main (void)
{
int i=10, j=20, n, k;
float x=3.1416;
char ch=65;
n=bfunc(x, i, ch);
k=xfunc(i, j);
printf (%d, %d , n, k);
}
#pragma REGPARMS
int xfunc(int x, int y)
{
int z;
z=x*y;
return(z-x-y);
}
La directiva NOREGPARAMS
activa el paso a travs de memoria
REGPARAMS
activa el paso a travs de registros
19
Funciones (VI)
Funciones reetrantes
Se declaran mediante la directiva reentrant
Puede ser llamada simultneamente por otras funciones
o recursivamente por ella misma
Sus vbles locales y parmetros se almacenan en una pila
ubicada segn el modelo de memoria de la funcin
No reciben parmetros a travs de registros (REGPARAMS)
Ejemplo
Funciones (VII)
Funciones de interrupcin
Suspenden el programa principal para su ejecucin ante
una peticin externa (hardware, puerto serie) o interna (timers)
Se declaran mediante la directiva interrupt n. siendo, n el
nmero de identificacin de la interrupcin:
Interrupcin
Nmero
Externa 0
Timer 0
Externa 1
Timer 1
P. Serie
Timer 2
PCA
20
Funciones (VII)
Funciones de interrupcin
Cuando se llama a una rutina de interrupcin la CPU:
1.-Salva ACC,B, DPH, DPL, y PSW en la pila si es necesario
2.-Salva los registros de trabajo a utilizar por la func. de interrupcin en la pila
3.-Ejecuta la func. de interrupcin
4.-Restaura todos los registros guardados en la pila
5.-Ejecuta la instruccin RETI
Interrupcin Timer 1
Ejemplo
void tiempo (void) interrupt 3 using 1
{
TH1=-100;
TL1=-100;
ET1=1;
if (dtime=256) P1=1;
dtime++;
}
Programas y mdulos
Un programa consta de varios mdulos.
Estos se desarrollan por separado y pueden ser almacenados
como archivos de programa individuales.
Pueden tener parte en C y parte en ensamblador
La directiva PUBLIC declara una vble accesible por otros mdulos
La directiva EXTERN declara una vble definida en otro mdulo
mod_1.c
mod_2.c
PUBLIC x,y;
int num(int){
...}
EXTERN x,y;
EXTERN int num (int)
21