Download - Programacion en C
-
Programacin en Cdel uC 8051
Informtica Industrial
Sebastin TornilOctubre 2007
2Programacin en C del uC 8051
Programacin en C del uC 8051
Ensamblador, lenguajes de alto nivel y C ANSI C C51 Ejemplos
Informtica Industrial
C estndar
C para C 8051
-
3Programacin en C del uC 8051
Ensamblador, lengs de alto nivel y C
Programacin en ensamblador: bajo nivel de abstraccin:
datos simples instrucciones y modos de direccionamiento
rudimentarios y no totalmente compatibles entre s control de flujo bsico mediante instrucciones de
comparacin y salto gestin directa del paso de parmetros
cdigo no portable, totalmente dependiente del lenguaje y los recursos del micro cdigo eficiente
Informtica Industrial
4Programacin en C del uC 8051
Ensamblador, lengs de alto nivel y C
Programacin en lenguaje de alto nivel: alto nivel de abstraccin:
datos estructurados: enumerados, tablas, records potentes estructuras para control de flujo: estructuras
condicionales (if-else), bucles (for, while, ...) ocultacin del paso de parmetros
mayor portabilidad: separacin entre cdigo independiente de los
recursos y cdigo dependiente (drivers) cdigo menos eficiente
Informtica Industrial
-
5Programacin en C del uC 8051
Ensamblador, lengs de alto nivel y C
El lenguaje C: creado en 1972 por D. Ritchie para la programacin del
S.O. UNIX lenguaje de medio nivel (entre ensamblador y alto nivel) permite acceso directo a memoria y a dispositivos E/S eficiencia del cdigo generado gracias a una sintaxis
concisa y la existencia de compiladores eficientes permite programacin modular: funciones y estructuras
de datos portabilidad ampliamente utilizado en la programacin de Cs
Informtica Industrial
6Programacin en C del uC 8051
Ensamblador, lengs de alto nivel y C
ANSI C y C51: C es un lenguaje de alto nivel independiente del micro
cuya sintaxis estndar se conoce como ANSI C para poder aprovechar las caractersticas particulares del
8051 (organizacin de memoria, instrucciones de manipulacin de bits, acceso a puertos) existe una extensin del estndar conocida como C51
Informtica Industrial
-
7Programacin en C del uC 8051
Ensamblador, lengs de alto nivel y C
Ejemplo: inc/dec P6 en funcin de P4.7
Informtica Industrial
USES 80537ORG 8000H
LEDS EQU 20hINICIO MOV LEDS,#00H
MOV P6,LEDSLOOP JB P4.7,CONTAR
DEC LEDSSJMP VISUAL
CONTAR INC LEDSVISUAL MOV P6,LEDS
MOV R1,#0AHACALL RETARDOAJMP LOOP
RETARDO MOV R2,#0FFHRETARD2 MOV R3,#0FFH
DJNZ R3,$DJNZ R2,RETARD2DJNZ R1,RETARDORETEND
#include sbit SWITCH = P4^7;void retardo (unsigned int n);void main(){
unsigned char leds=0;while (1){
if (SWITCH==1)leds++;
elseleds--;
P6 = leds;retardo(0x0A);
}}void retardo (unsigned int n){
unsigned int i,j;for (i=0;i
-
9Programacin en C del uC 8051
Estructura general y sintaxis
Estructura general de un programa C:/* ... */...
void main(void){
...}
programaprincipal
Informtica Industrial
comentariosdirectivas
variables globalesdeclaracin funciones
programacinfunciones
los comentarios pueden aparecer en cualquier punto del
programa
la programacin de funciones puede
aparecer junto con la declaracinvariables
instrucciones
10Programacin en C del uC 8051
Estructura general y sintaxis
Ejemplo:/* clculo del permetro del crculo*/#include #define PI 3.1416void main(void){
float radio,perimetro;scanf(%f,&radio);perimetro = 2*PI*radio;printf(%f,perimetro);
}
declaracinde variables
lectura deteclado
escritura porpantalla
clculo y asignacin
Informtica Industrial
inclusin de declaracin de
funcionesdeclaracin
de constantes
-
11Programacin en C del uC 8051
Estructura general y sintaxis
Generalidades de la sintaxis de C: los comentarios se enmarcan entre /* ... */ ; para
comentarios de una lnea // ... inclusin de ficheros: #include las secuencias de instrucciones se enmarcan entre llaves
{...} debe colocarse un punto y coma ; tras cada instruccin el lenguaje distingue minsculas de maysculas; las
palabras clave en minscula
Informtica Industrial
12Programacin en C del uC 8051
Datos elementales y operaciones
Tipos de datos: identificadores bsicos
char entero de 8 bitsint entero de 16/32 bits, depende de y compiladorfloat real de simple precisin, normalm. 32 bitsdouble real de doble precisin, normalm. 64 bits
modificadoresunsigned entero sin signo, aplicable a char e intshort tamao pequeo, aplicable a intlong tamao grande, aplicable a int y double
Informtica Industrial
short int
-
13Programacin en C del uC 8051
Datos elementales y operaciones
Constantes y variables: declaracin de constantes
declaracin de variables
#define identificador valor
id_tipo id_var_1, ..., id_var_n;
nombre dela constante
valor
identificadorde tipo
+ modificador
nombres delas variables
Informtica Industrial
#define PI 3.1416void main(void){
unsigned int a;char b = 0;float x,y;...
}inicializacinde la variable
ejemplo
14Programacin en C del uC 8051
Datos elementales y operaciones
Operadores bsicos: asignacin
= actualiza una variable con el resultado de una secuencia de operaciones
aritmticos+ suma- resta* producto/ divisin, entera/real en funcin de operandos% resto de la divisin entera-- decremento++ incremento
Informtica Industrial
-
15Programacin en C del uC 8051
Datos elementales y operaciones
compuestos+= suma y actualizacin de variable-= resta y actualizacin*= producto y actualizacin/= cociente y actualizacin%= resto y asignacin
ejemplos
Informtica Industrial
char a=1;int b=3;float x;
a = a+1;a++;a+=1;b = b%2;x = (float)(b/2);
16Programacin en C del uC 8051
Datos elementales y operaciones
Manipulacin de bits: operadores de bits
~ complemento lgico (NOT) bit a bit& producto lgico (AND)| suma lgica (OR)^ suma exclusiva (XOR)> desplazamiento hacia la derecha
ejemplos
Informtica Industrial
unsigned char a=0x33;a = a & 0x0F;a = a | 0xF0;a = a>>2;
00110011000000111111001100111100
0x indica valorhexadecimal
la & se utiliza para poner bits a 0
la | se utiliza para poner bits a 1
utilizada en acceso a dispositivosaplicables a tipos de datos enteros
-
17Programacin en C del uC 8051
Datos elementales y operaciones
Operadores relacionales y lgicos: relacionales
< menor estricto> mayor estricto= mayor o igual= = igual!= diferente
operadores lgicos! negacin lgica (NOT)&& producto lgico (AND)|| suma lgica (OR)
Informtica Industrial
utilizados encontrol 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
18Programacin en C del uC 8051
Datos elementales y operaciones
Evaluacin de expresiones: los parntesis se evalan de dentro hacia fuera los operadores tienen diferentes prioridades
operadores de misma prioridad se evalan de izquierda a derecha
! ++ --* / %+ ->< >=== !=&|&&||= += -= *= /= %=
prioridad
Informtica Industrial
+
-
-
19Programacin en C del uC 8051
Entrada/Salida
Salida estndar: declaracin en stdio.h sintaxis: la cadena de control especifica el formato y nmero de
argumentos (valores a mostrar) y el texto asociado formato de un argumento:
lista de argumentos separados por comas; los argumentos son las variables o expresiones cuyo valor se ha de mostrar
printf(cadena_control,lista_argumentos);
%c carcter%d entero%u entero sin signo%f float/double%s cadena de carcteres
Informtica Industrial
pantalla
20Programacin en C del uC 8051
Entrada/Salida
ejemplos#include
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
Informtica Industrial
-
21Programacin en C del uC 8051
Entrada/Salida
Entrada estndar: declaracin - stdio.h sintaxis: los argumentos son los nombres variables en que se han
de almacenar los valores leidos; cada nombre debe ir precedido por el smbolo & ejemplo
scanf(lista_argumentos)
int num;printf(Introduce un valor entero:);scanf(%d,&num);
Informtica Industrial
teclado
22Programacin en C del uC 8051
ejemplo
Control de flujo
Estructura if-else: sintaxis
if (expr_logica_1){
sec_instr_1}else if (expr_logica_2){
sec_instr_2}...else{
sec_instr_n}
opcionales
condicininstrucciones ejecutadas si
se cumple la condicin
Informtica Industrial
if ((x>=y)&&(x>=z))max = x;
else if (y>=z)max = y;
elsemax = z;
opcionalessi slo 1
instruccin
-
23Programacin en C del uC 8051
Control de flujo
Estructura switch: sintaxis
switch (expresion){
case valor_1:sec_instr_1;break;
...case valor_m:
sec_instr_m;break;
default:sec_instr_n
}
variable/expresinde tipo entero
opcional
valor/sec.valores
separadospor comas
salto al fin switch
Informtica Industrial
switch (a){
case 1,2:b=1;
case 2:c=1;break;
default:b=3;
}
ejemplo
ejecutadas si la expresin toma uno de los valores
opcional
ejecutadas si el valor de la expresin no iguala uno especificado en los casos
24Programacin en C del uC 8051
Control de flujo
Bucle for: sintaxis
for (instruccion; expr_logica; instruccion){
sec_intrucciones}
inicializacinprevia
condicin deiteracin
actualizacin alfin cada iteracin
instrucciones ejecutadasa cada iteracin
Informtica Industrial
for (i=1;i
-
25Programacin en C del uC 8051
Control de flujo
Bucle while: sintaxis
Bucle do-while: sintaxis
while (expr_logica){
sec_instrucciones}
Informtica Industrial
i = 1;while (i
-
27Programacin en C del uC 8051
Datos estructurados
Tablas (arrays): declaracin
acceso indexado
id_tipo id_var[valor_1]...[valor_n];
tipo de loselementos
nombrede la tabla
dim = ntamaos de lasdimensiones
id_var[indice_1]...[indice_n]
nombredel array
ndices(comenzando por 0)
Informtica Industrial
permiten guardar un conjunto de datos del mismo tipo
int matriz[2][3];for (i=0;i
-
29Programacin en C del uC 8051
Funciones
Declaracin de funciones: sintaxis
parmetros por valor por referencia
id_tipo id_funcion(esp_param_1,...,esp_param_n);tipo del resultado
void sin resultadonombre dela funcin parmetros formales
id_tipo id_parametroid_tipo *id_parametro
tipo nombre
Informtica Industrial
la funcin recibe un valor,
un dato de entradarecibe la @ de una variable del programa que la llama, donde puede encontrar un dato de entrada y/o dejar un resultado
cabecera
30Programacin en C del uC 8051
Funciones
ejemplos
Programacin de funciones: sintaxis
acceso a parmetros por valor como a variables acceso a parmetros por referencia devolucin de resultados
int potencia(float base, int exp, float *pot);
entradas
resultado
cdigode error
resultadoentradas
*id_parametroreturn (expresion);
Informtica Industrial
float potencia(float base, int exp);
-
31Programacin en C del uC 8051
Funciones
ejemploint potencia(float base, int exp, float *pot){
unsigned int i;float result=1;if (exp
-
33Programacin en C del uC 8051
Funciones
ejemplo:
int potencia(float base, int exp, float *pot){...}
void main(){
int err, exponente=-1;float base=3.0,result;...err = potencia(2.0,3,&result);err = potencia(base,exponente,&result);
}
result 8.0err 0
result 1.0err -1
Informtica Industrial
parmetros y variables locales de la funcin pueden coincidir en nombre
con variables del programa
34Programacin en C del uC 8051
Funciones
Funcionamiento del ejemplo:
Informtica Industrial
int potencia(float base, int exp, float *pot){
unsigned int i;float result=1;if (exp
-
35Programacin en C del uC 8051
C51
Tipos de datos Acceso a dispositivos Interrupciones Keil
Informtica Industrial
entorno de desarrollo
36Programacin en C del uC 8051
Tipos de datos
Tipos de datos en C51:
Informtica Industrial
unsigned char 8 bits 0 255char 8 bits -128 127unsigned int 16 bits 0 65535int 16 bits -32768 32767unsigned long 32 bits 0 4294967295long 32 bits -2147483648 2147483648float 32 bits +/-1.175E-38 +/-3.403E+38
Identificador Tamao Rango
-
37Programacin en C del uC 8051
Acceso a dispositivos
Acceso a registros: el tipo de datos sfr permite el acceso a los registros de los
dispositivos del micro
la declaracin puede aparecer en el fichero del programa o en un fichero externo con extensin .h
IE se manipula como cualquier variable char (8 bits)
Informtica Industrial
sfr IE = 0xA8;...
IE = IE|0x80;
sfr IE = 0xA8;#include ...
IE = IE|0x80;
reg51.h
38Programacin en C del uC 8051
Acceso a dispositivos
Acceso a bits: el tipo sbit permite el acceso individual a bits de registros
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:
Informtica Industrial
IE.7 = 1;
sbit EA = IE^7;sbit EA = 0xA8^7;sbit EA = 0xAF;...
EA = 1;
equivalentes
IE^7 = 1;
-
39Programacin en C del uC 8051
Acceso a dispositivos
Ejemplo: coche fantstico en LEDS colgados de P6
Informtica Industrial
sfr P6 = 0xFA;void retardo (unsigned int n){
unsigned int i,j;for (i=0;i
-
41Programacin en C del uC 8051
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.
Informtica Industrial
void RSI (void) interrupt n{
....}
ORG 8*n+3LJMP RSI...
RSI: PUSH ACC...POP ACCRETI
42Programacin en C del uC 8051
Interrupciones
Ejemplo: coche fantstico utilizando Timer0
Informtica Industrial
void RSI_Timer0(void) interrupt 1{
TH0 = 0x00;TL0 = 0x00;P6 = P6
-
43Programacin en C del uC 8051
Keil
Proceso de desarrollo:
Informtica Industrial
main.c main.objC51
cmo se obtiene el ejecutable a partir del fuente?
?.c ?.objC51
?.asm ?.objA51
A51startup.asm startup.obj
main.lst
c51*.lib
BL51 main.binmain.hex
main.m51
opciones de ubicacin de
datos y cdigo en memoria
44Programacin en C del uC 8051
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
Informtica Industrial
-
45Programacin en C del uC 8051
Keil
KEIL entorno de desarrollo IDE interfaz de usuario, incluye editor C51, A51, BL51 C51*.lib libreras estndar startup.asm cdigo de inicializacin
Informtica Industrial
46Programacin en C del uC 8051
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
Informtica Industrial
...CSEG AT 8000h
?C_STARTUP: LJMP STARTUP1...
sita una instruccin de salto al cdigo
de inicializacin en la direccin especificada
-
47Programacin en C del uC 8051
Keil
ubicacin de variables en memoria interna:
Informtica Industrial
48Programacin en C del uC 8051
Keil
ubicacin del vector de interrupciones:
Informtica Industrial
-
49Programacin en C del uC 8051
Keil
ubicacin de cdigo:
Informtica Industrial
50Programacin en C del uC 8051
Keil
generacin del fichero HEX:
Informtica Industrial
-
51Programacin en C del uC 8051
Keil
generacin de ficheros lst y m51:
Informtica Industrial
52Programacin en C del uC 8051
Ejemplos
Prctica 4 Reloj digital
Informtica Industrial
-
53Programacin en C del uC 8051
Prctica 4
Montaje HW:
Objetivo: contaje sobre display
Posibles soluciones:1 rutina de incremento BCD3 incremento en binario y rutina de conversin a BCD4 utilizacin del Timer0 para temporizacin incremento
Informtica Industrial
54Programacin en C del uC 8051
Prctica 4
Solucin 1
Informtica Industrial
-
55Programacin en C del uC 8051
Prctica 4Informtica Industrial
56Programacin en C del uC 8051
Prctica 4
Solucin 2
Informtica Industrial
-
57Programacin en C del uC 8051
Prctica 4Informtica Industrial
58Programacin en C del uC 8051
Prctica 4
Solucin 3
Informtica Industrial
-
59Programacin en C del uC 8051
Prctica 4Informtica Industrial
60Programacin en C del uC 8051
Reloj digital
Montaje HW:
Funcionamiento: visualizacin dinmica de horas y minutos parpadeo de los separadores cada medio segundo SEL permite seleccionar entre modos: normal,
incremento horas, dec. horas, inc. minutos, dec. minutos MOD incrementa/decrementa horas/minutos segn SEL
Informtica Industrial
trafo comp
T0
/INT0
/INT1
87C51
ABCD
4511
P2.0P2.1P2.2P2.3
a
g
P2.4
P2.5P2.6
74156
BA
1Y01Y11Y21Y3
20 ms
SEL
+Vcc4584
MOD
+Vcc4584
-
61Programacin en C del uC 8051
Reloj digital
Solucin:
Informtica Industrial
62Programacin en C del uC 8051
Reloj digitalInformtica Industrial
-
63Programacin en C del uC 8051
Reloj digitalInformtica Industrial
64Programacin en C del uC 8051
Reloj digitalInformtica Industrial
-
65Programacin en C del uC 8051
Reloj digitalInformtica Industrial