此文转载自: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。

版权声明:本文为phyger原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/phyger/p/14084452.html