单片机实验四:定时器控制发光二极管的亮灭+简单输出连续矩形脉冲
Description
设计单片机的Proteus仿真电路,实现如下功能:
- P1口控制8个发光二极管,P0连接数码管
- 利用定时器/计数器T0产生定时,采用中断方式,让8个发光二极管每隔1s依次点亮,全亮后全灭,再次开始循环
- 数码管从1开始,每点亮一个发光二极管,显示+1,显示9时二极管全灭,再次开始循环
- 系统的晶振频率
f
o
s
c
=
12
M
H
z
f_{osc}=12MHz
实验电路图
实验分析
- 八个发光二极管每隔1s依次点亮,同时数码管从1显示到8,9时全灭,然后不断循环。采用定时器0中断,事先写好依次点亮时的八种状态,然后每隔一秒P1变换到下一个状态。
- 高电平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。