Se desea supervisar un sensor (S0) con un microcontrolador compatible 8051. El sensor “S0” está conectado al bit 4 del puerto “P1”. Cuando se detecta un nivel bajo en el sensor “S0”, el bit 7 del puerto “P0” deberá ponerse a nivel alto e iniciarse una temporización de 6 segundos. Cuando finalice este tiempo, el bit 7 del puerto “P0” deberá ponerse a nivel bajo.

Se pide:
Realizar un programa en C que implemente la especificación anterior. Para ello, se deberá contemplar la programación de los registros involucrados (“sfr”), los bits necesarios y la utilización de las variables. La temporización se realizará por encuestas (sin utilizar interrupciones). Considérese que el reloj del sistema funciona a 12 Mhz.
Solución:
Como nos piden una temporización grande, usaremos el modo 1 (16 bits).
desbordamientos_enteros: 6000000/65536=91
resto: 6000000-(91*65536)=36224 (un desborde parcial).
Por lo tanto debemos realizar:
- 91 desbordamientos completos (timer empieza en cero) y
- 1 desbordamiento parcial (timer no empieza en cero).

* Sin calculadora, se deja indicado:
desbordamientos_enteros: 6000000/65536 (91)
resto: 6000000 % 65536 (36224)
El desbordamiento parcial debe temporizar resto (36224 microsegundos).
Para cargar “TH0” y “TL0” con esta cuenta inicial, debemos, como siempre, restar del valor total del temporizador:
cuenta_inicial=65536-36224 = 29312 = 0x7280
TH0 = 0x72;
TL0 = 0x80;
* Sin calculadora, se deja indicado:
cuenta_inicial=65536-resto
TH = cuenta_inicial/256;
TL= cuenta_inicial % 256;
Esta operación anterior “separa” un valor de 16 bits en dos registros de 8 bits. Se hace así porque este micro no permite la asignación de un registro de 16 bits en una operación única.
Ejemplo del programa:
void main (void){
TR1=0;
P0=0x01; // configura línea 0 del puerto P0 como entrada
TMOD=0x01; // modo temporizador, gate=0, modo 16 bits
while (1){
desbordes=92;
if (s0 == 0) {
salida = 1;
TH0 = 29312/256; // carga parcial
TL0= 29312 % 256; // carga parcial
TR0=1;// puesta en marcha del timer
…terminarlo y probarlo…
1 comentario:
¿Podrías colgar el resultado completo del ejercicio como este que pusisteis el último día de clase? Aquel sí que era con interrupciones.
Publicar un comentario