Beruflich Dokumente
Kultur Dokumente
Programacin en C
del uC 8051
Sebastin Tornil
Octubre 2007
Informtica Industrial
Informtica Industrial
Informtica Industrial
Informtica Industrial
Informtica Industrial
Informtica Industrial
EQU 20h
INICIO
MOV LEDS,#00H
MOV P6,LEDS
LOOP
JB P4.7,CONTAR
DEC LEDS
SJMP VISUAL
CONTAR INC LEDS
VISUAL
MOV P6,LEDS
MOV R1,#0AH
ACALL RETARDO
AJMP LOOP
RETARDO MOV R2,#0FFH
RETARD2 MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,RETARD2
DJNZ R1,RETARDO
RET
END
#include <reg80537.h>
sbit SWITCH = P4^7;
void retardo (unsigned int n);
void main()
{
unsigned char leds=0;
while (1)
{
if (SWITCH==1)
leds++;
else
leds--;
P6 = leds;
retardo(0x0A);
}
}
void retardo (unsigned int n)
{
unsigned int i,j;
for (i=0;i<n;i++)
for(j=0;j<0xFFFF;j++);
}
ubicacin de
cdigo y datos
normalmente
no explcita en
el cdigo
(opciones del
compilador)
Informtica Industrial
ANSI C
Informtica Industrial
/* ... */
...
los comentarios
pueden aparecer en
cualquier punto del
programa
la programacin de
funciones puede
aparecer junto con
la declaracin
void main(void)
{
variables
...
instrucciones
}
programacin
funciones
Programacin en C del uC 8051
Informtica Industrial
10
Informtica Industrial
11
Informtica Industrial
no existe el
tipo booleano
identificadores bsicos
char entero de 8 bits
int entero de 16/32 bits, depende de y compilador
float real de simple precisin, normalm. 32 bits
double real de doble precisin, normalm. 64 bits
modificadores
unsigned entero sin signo, aplicable a char e int
short tamao pequeo, aplicable a int
long tamao grande, aplicable a int y double
short int <= int <= long int
12
Informtica Industrial
valor
declaracin de variables
id_tipo id_var_1, ..., id_var_n;
identificador
de tipo
+ modificador
nombres de
las variables
ejemplo
#define PI 3.1416
void main(void)
{
unsigned int a;
char b = 0;
float x,y;
...
inicializacin
}
de la variable
13
Informtica Industrial
14
Informtica Industrial
a = a+1;
a++;
a+=1;
b = b%2;
x = (float)(b/2);
Programacin en C del uC 8051
15
Informtica Industrial
16
Informtica Industrial
utilizados en
control de flujo
el compilador de C interpreta
que 0 es falso y cualquier otra
cosa cierto; devuelve 0 cuando
el resultado de una operacin
relacional o lgica es falso y 1
cuando es cierto
operadores lgicos
! negacin lgica (NOT)
&& producto lgico (AND)
|| suma lgica (OR)
Programacin en C del uC 8051
17
Informtica Industrial
+
prioridad
18
Informtica Industrial
Entrada/Salida
Salida estndar: pantalla
declaracin en stdio.h
sintaxis: printf(cadena_control,lista_argumentos);
la cadena de control especifica el formato y nmero de
argumentos (valores a mostrar) y el texto asociado
formato de un argumento: %c carcter
%d entero
%u entero sin signo
%f float/double
%s cadena de carcteres
19
Informtica Industrial
Entrada/Salida
ejemplos
#include <stdio.h>
unsigned int a=2;
char car=a;
float x=1.0;
printf(El valor de a es %u,a);
printf(El valor de a es %u y el de car es %c,a,car);
printf(El doble del valor de x es %f \n,2*x);
salto de lnea
Programacin en C del uC 8051
20
Informtica Industrial
Entrada/Salida
Entrada estndar: teclado
declaracin - stdio.h
sintaxis: scanf(lista_argumentos)
los argumentos son los nombres variables en que se han
de almacenar los valores leidos; cada nombre debe ir
precedido por el smbolo &
ejemplo
int num;
printf(Introduce un valor entero:);
scanf(%d,&num);
Programacin en C del uC 8051
21
Informtica Industrial
Control de flujo
Estructura if-else:
sintaxis
condicin
22
Informtica Industrial
Control de flujo
Estructura switch:
variable/expresin
sintaxis
de tipo entero
ejemplo
switch (expresion) valor/sec.
switch (a)
{
valores
{
separados
case valor_1:
case 1,2:
sec_instr_1; por comas
b=1;
break;
opcional
ejecutadas si
case 2:
...
la expresin
c=1;
toma uno de
case valor_m:
break;
los valores
default:
sec_instr_m;
opcional
b=3;
break;
salto al
}
default:
fin switch
sec_instr_n
}
ejecutadas si el valor de la expresin no
iguala uno especificado en los casos
Programacin en C del uC 8051
23
Informtica Industrial
Control de flujo
Bucle for:
sintaxis
inicializacin condicin de actualizacin al
iteracin
previa
fin cada iteracin
for (instruccion; expr_logica; instruccion)
{
sec_intrucciones
ejemplo
}
instrucciones ejecutadas
for (i=1;i<=10;i++)
a cada iteracin
{
printf(%u,i);
opcionales si slo
1 instruccin
}
Programacin en C del uC 8051
24
Informtica Industrial
Control de flujo
Bucle while:
ejemplo
sintaxis
while (expr_logica)
{
sec_instrucciones
}
i = 1;
while (i<=10)
{
printf(%u,i);
i++;
}
Bucle do-while:
sintaxis
ejemplo
do
{
sec_instrucciones
} while (expr_logica);
i = 1;
do
{
printf(%u,i);
i++;
}
while (i<=10);
25
Informtica Industrial
Control de flujo
Bucles infinitos: utilizados habitualmente en
aplicaciones industriales
for(;;)
{
sec_instrucciones
}
while(1)
{
sec_instrucciones
}
do
{
sec_instrucciones
} while(1);
26
Informtica Industrial
Datos estructurados
guardar un conjunto
Tablas (arrays): permiten
de datos del mismo tipo
declaracin
2
27
Informtica Industrial
Datos estructurados
permiten almacenar
28
Informtica Industrial
Funciones
Declaracin de funciones:
sintaxis
cabecera
id_tipo id_funcion(esp_param_1,...,esp_param_n);
tipo del resultado
nombre de parmetros formales
la funcin
void sin resultado
parmetros
por valor
por referencia
la funcin recibe
un valor,
un dato de entrada
nombre
tipo
id_tipo id_parametro
id_tipo *id_parametro
29
Informtica Industrial
Funciones
ejemplos
resultado
cdigo
de error
entradas
resultado
Programacin de funciones:
sintaxis
acceso a parmetros por valor como a variables
acceso a parmetros por referencia *id_parametro
devolucin de resultados return (expresion);
Programacin en C del uC 8051
30
Informtica Industrial
Funciones
ejemplo
int potencia(float base, int exp, float *pot)
{
unsigned int i;
float result=1;
if (exp<0) return(-1);
else
{
for (i=1;i<=exp;i++)
result=result*base;
*pot=result;
return(0);
}
}
Programacin en C del uC 8051
31
Informtica Industrial
Funciones
Llamada a funciones:
sintaxis
id_var = id_funcion(param_1,...,param_n)
nombre de la variable
que recibe el resultado
nombre de
la funcin
parmetros actuales
parmetros actuales
por valor - valores explcitos, variables, expresiones
nombre de
por referencia &id_var
variable del
programa
Programacin en C del uC 8051
32
Informtica Industrial
Funciones
ejemplo:
int potencia(float base, int exp, float *pot)
{...}
parmetros y variables locales de la
funcin pueden coincidir en nombre
void main()
con variables del programa
{
int err, exponente=-1;
float base=3.0,result;
result 8.0
...
err = potencia(2.0,3,&result); err 0
result 1.0
err = potencia(base,exponente,&result); err -1
}
Programacin en C del uC 8051
33
Informtica Industrial
Funciones
Funcionamiento del ejemplo:
1
void main()
{
0
int err,exponente=3;
float base=2.0,res;
8.0
err = potencia(base,exponente,&res);
}
paso de
parmetros
devolucin
de resultados
2
ejecucin
34
Informtica Industrial
C51
Tipos de datos
Acceso a dispositivos
Interrupciones
Keil entorno de desarrollo
35
Informtica Industrial
Tipos de datos
Tipos de datos en C51:
Identificador
unsigned char
char
unsigned int
int
unsigned long
long
float
Tamao
8 bits
8 bits
16 bits
16 bits
32 bits
32 bits
32 bits
Rango
0 255
-128 127
0 65535
-32768 32767
0 4294967295
-2147483648 2147483648
+/-1.175E-38 +/-3.403E+38
36
Informtica Industrial
Acceso a dispositivos
Acceso a registros:
el tipo de datos sfr permite el acceso a los registros de los
dispositivos del micro
sfr IE = 0xA8;
...
IE = IE|0x80;
la declaracin puede aparecer en el fichero del programa
o en un fichero externo con extensin .h
reg51.h
#include <reg51.h>
...
sfr IE = 0xA8;
IE = IE|0x80;
37
Informtica Industrial
Acceso a dispositivos
Acceso a bits:
el tipo sbit permite el acceso individual a bits de registros
sbit EA = IE^7;
sbit EA = 0xA8^7;
sbit EA = 0xAF;
equivalentes
...
EA = 1;
el registro ha de ser direccionable bit a bit (en caso
contrario utilizar operadores de bits y mscaras sobre el
registro completo, como en transparencia anterior)
no son vlidos:
IE.7 = 1; IE^7 = 1;
Programacin en C del uC 8051
38
Informtica Industrial
Acceso a dispositivos
Ejemplo: coche fantstico en LEDS colgados de P6
sfr P6 = 0xFA;
void retardo (unsigned int n)
{
unsigned int i,j;
for (i=0;i<n;i++)
for(j=0;j<0xFFFF;j++);
}
void main()
{
P6 = 0x01;
while (1)
{
P6 = P6<<1;
if (P6==0x00)
P6 = 0x01;
retardo(10);
}
}
Programacin en C del uC 8051
39
Informtica Industrial
Interrupciones
Programacin de interrupciones:
sintaxis:
40
Informtica Industrial
Interrupciones
el compilador genera cdigo ensamblador
para salvar en la pila los registros utilizados por la
rutina: ACC, B, DPTR, PSW, R0-R7
correspondiente al cdigo C de la funcin
para restaurar de la pila los registros salvados
acaba con RETI
instruccin de salto a la rutina en la entrada
correspondiente del V.I.
void RSI (void) interrupt n
{
....
}
ORG 8*n+3
LJMP RSI
...
RSI: PUSH ACC
...
POP ACC
RETI
41
Informtica Industrial
Interrupciones
Ejemplo: coche fantstico utilizando Timer0
void RSI_Timer0(void) interrupt 1
{
TH0 = 0x00;
TL0 = 0x00;
P6 = P6<<1;
if (P6==0x00)
P6 = 0x01;
}
void main(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
IEN0 = 0x82;
IP0 = 0x02;
TR0 = 1;
for(;;);
}
42
Informtica Industrial
Keil
cmo se obtiene el
Proceso de desarrollo: ejecutable a partir del fuente?
main.lst
main.c
C51
main.obj
?.c
C51
?.obj
?.asm
A51
?.obj
startup.asm
A51
startup.obj
main.m51
BL51
main.bin
main.hex
opciones de
c51*.lib ubicacin de
datos y cdigo
en memoria
43
Informtica Industrial
Keil
C51 compiler
para cada fichero fuente (*.c) genera un fichero objeto
(*.obj) que contiene cdigo mquina reubicable
adicionalmente genera un listado (*.lst) con
informacin del cdigo ensamblador generado
A51 assembler
procesa los ficheros fuente en ensamblador (*.asm)
BL51 linker+locator
enlaza los diferentes objetos y les proporciona una
ubicacin fija en memoria, dando lugar al ejecutable
(*.bin) o al HEX (*.hex)
genera un listado (*.m51) con informacin sobre la
ubicacin de cdigo y datos en memoria
Programacin en C del uC 8051
44
Informtica Industrial
Keil
KEIL entorno de desarrollo
45
Informtica Industrial
Keil
Opciones de configuracin:
suponiendo que el cdigo se ha de ejecutar en las placas
del laboratorio, con variables en memoria interna y
cdigo en RAM externa a partir de la @ 8000h
modificacin del fichero startup.a51
...
CSEG AT 8000h
?C_STARTUP: LJMP STARTUP1
...
sita una
instruccin de
salto al cdigo
de inicializacin
en la direccin
especificada
46
Informtica Industrial
Keil
ubicacin de variables en memoria interna:
47
Informtica Industrial
Keil
ubicacin del vector de interrupciones:
48
Informtica Industrial
Keil
ubicacin de cdigo:
49
Informtica Industrial
Keil
generacin del fichero HEX:
50
Informtica Industrial
Keil
generacin de ficheros lst y m51:
51
52
Informtica Industrial
Ejemplos
Prctica 4
Reloj digital
Informtica Industrial
Prctica 4
Montaje HW:
Objetivo:
contaje sobre display
Posibles soluciones:
1 rutina de incremento BCD
3 incremento en binario y rutina de conversin a BCD
4 utilizacin del Timer0 para temporizacin incremento
Programacin en C del uC 8051
53
54
Informtica Industrial
Prctica 4
Solucin 1
Informtica Industrial
Prctica 4
55
56
Informtica Industrial
Prctica 4
Solucin 2
Informtica Industrial
Prctica 4
57
58
Informtica Industrial
Prctica 4
Solucin 3
Informtica Industrial
Prctica 4
59
Informtica Industrial
Reloj digital
Montaje HW:
trafo
20 ms
comp
87C51
4511
T0
P2.0
P2.1
P2.2
P2.3
+Vcc
4584
A
B
C
D
/INT0
SEL
P2.4
+Vcc
P2.5
P2.6
4584
/INT1
MOD
A
B
1Y0
1Y1
1Y2
1Y3
74156
Funcionamiento:
60
Informtica Industrial
Reloj digital
Solucin:
61
62
Informtica Industrial
Reloj digital
Informtica Industrial
Reloj digital
63
64
Informtica Industrial
Reloj digital
Informtica Industrial
Reloj digital
65