单片机实验四:定时器控制发光二极管的亮灭+简单输出连续矩形脉冲

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。

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/110586059