マイクロコントローラー実験4:タイマーは発光ダイオードのオンとオフを制御します+連続長方形パルスの単純な出力

説明

以下の機能を実現するために、シングルチップマイクロコンピュータのプロテウスシミュレーション回路を設計します。

  1. P1ポートは8つのLEDを制御し、P0はデジタルチューブに接続します
  2. タイマー/カウンターT0を使用してタイミングを生成し、割り込みモードを採用して、8つのLEDを1秒ごとに順番に点灯させ、その後すべてを消灯させて、サイクルを再開します。
  3. デジタルチューブは1から始まり、発光ダイオードが点灯するたびに+1が表示され、9が表示されるとダイオードがすべてオフになり、サイクルが再開します。
  4. システムの結晶周波数fosc = 12 MH z f_ {osc} = 12MHzfOC=1 2 M H z、Proteusシミュレーションを使用して、次の連続長方形パルスを検証します
    ここに写真の説明を挿入

実験回路図

ここに写真の説明を挿入

実験分析

  1. 8つの発光ダイオードが1秒ごとに順番に点灯し、ニクシーチューブは1から8まで表示され、9時に消灯し、その後サイクルを続けます。タイマー0を使用して中断し、順次点灯するときに8つの状態を事前に書き込みます。その後、P1は毎秒次の状態に変化します。
  2. 高レベル40ms、低レベル360ms、タイマー1割り込みを使用、各タイミング40ms、高レベルから低レベルへ40msで、400msで反転できます。

ソースコード

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
uchar t = 0, cnt = 1, n;
sbit wave = P2^7;
bit flag;
uchar code DSY_CODE[]={
    
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //0-9
uchar code LED_CODE[]={
    
    0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //依次点亮

void init_time0() {
    
    
	P1 = LED_CODE[cnt - 1];
	P0 = DSY_CODE[cnt];
	TMOD = 0x01; //设置T0为定时器模式,工作方式在1
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}

void init_time1() {
    
    
	TMOD = 0x11;
	EA = 1;
	ET1 = 1;
	TR1 = 1;
	wave = 1;  //高电平
	flag = 1;
}

void time0() interrupt 1 {
    
       //定时器0中断服务程序
	TH0=(65536-50000) / 256;
  TL0=(65536-50000) % 256;
	if(++t == 20) {
    
      //1s
		t = 0;
		cnt++;
		P1 = LED_CODE[cnt - 1];
		P0 = DSY_CODE[cnt];
		if(cnt == 9) {
    
    
			P1 = 0xff;
			cnt = 0;
		}
	}
}

void timer1() interrupt 3 {
    
    
	TH1=(65536-40000) / 256;  //40ms高电平
  TL1=(65536-40000) % 256;
	if(flag) {
    
    
		wave = ~wave;   //变为低电平
		flag = 0;
	}
	n++;
	if(n == 10) {
    
       //400ms时候,此时低电平已经持续360ms,翻转
		n = 0;
		wave = ~wave;
		flag = 1;
	}
}

void main() {
    
    
	init_time0();
	init_time1();
	while(1);
}

付録

長方形パルスのスクリーンショットは次のとおりです。
ここに写真の説明を挿入
高レベル:-760-(-800)= 40ms、低レベル:-400-(-760)= 360ms。

おすすめ

転載: blog.csdn.net/Cyril_KI/article/details/110586059