單片機實驗四:定時器控制發光二極管的亮滅+簡單輸出連續矩形脈沖


此文轉載自:https://blog.csdn.net/Cyril_KI/article/details/110586059

Description

設計單片機的Proteus仿真電路,實現如下功能:

  1. P1口控制8個發光二極管,P0連接數碼管
  2. 利用定時器/計數器T0產生定時,采用中斷方式,讓8個發光二極管每隔1s依次點亮,全亮后全滅,再次開始循環
  3. 數碼管從1開始,每點亮一個發光二極管,顯示+1,顯示9時二極管全滅,再次開始循環
  4. 系統的晶振頻率 f o s c = 12 M H z f_{osc}=12MHz fosc=12MHz,用Proteus仿真驗證如下連續矩形脈沖
    在這里插入圖片描述

實驗電路圖

在這里插入圖片描述

實驗分析

  1. 八個發光二極管每隔1s依次點亮,同時數碼管從1顯示到8,9時全滅,然后不斷循環。采用定時器0中斷,事先寫好依次點亮時的八種狀態,然后每隔一秒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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM