当前位置:   article > 正文

《单片机》实验——实验4 MCS-51内部定时/计数器实验(2)_实验四基于mcs-51单片机的实验

实验四基于mcs-51单片机的实验

单片机》实验——实验4 MCS-51内部定时/计数器实验(2)

实验一至实验七配套源代码、电路图、hex文件、实验报告,请点击此处

一、实验目的

  1. 进一步掌握定时/计数器的4种工作方式的应用
  2. 掌握查询控制的定时/计数器的编程

二、知识要点

(1)8051内部有两个定时/计数器T0和T1,均可对系统内部的机器周期计数(定时模式)和芯片之外的脉冲信号计数(计数模式);都有4种工作方式,其不同之处在于计数值宽度不一样(13位/16位/8位)以及计数初值是否能自动重装。
(2)与定时/计数器相关的控制字及控制位主要有TMOD,TH0/TH1,TL0/TL1,TCON

三、实验内容

(1)通过并行口P1实现十字路口交通灯的模拟控制。
关于交通路灯的亮灭规律说明:设有一个十字路口分为南北方向和东西方向,初始状态为红灯全亮,之后,南北绿灯亮,东西红灯亮,南北方向通车。延时一段时间后,南北绿灯熄灭,而南北黄灯开始闪烁,闪烁若干次以后,南北红灯亮,而同时东西的绿灯亮,东西方向通车,延时一段时间后,东西绿灯熄灭,而东西黄灯开始闪烁,闪烁若干次以后,再切换到南北方向,之后,重复上述过程。
编程提示:(实现6个灯按交通变化规律亮、灭或闪烁)
通过定时器实现精准定时,用较短的定时控制黄灯的闪烁(如0.5s或1s),较长的定时控制通行(如5s或10s)。

#include<reg51.h>
char t;
char i;
void main(){
	TMOD=0x01;
	TH0=0x3c;
	TL0=0xB0;
	
while(1){
	P1=0x7e;
	while(1){
		TR0=1;
		while(TF0){
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t==100){
			TR0=0;
			t=0;
			break;
		}
	}

	P1=0xbe;
	while(1){
		TR0=1;
		while(TF0){
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t%10==0){
			P1=0xfe;
		}
		if(t%20==10){
			P1=0xbe;
		}
		if(t==70){
			TR0=0;
			t=0;
			break;
		}
	}
	P1=0xdb;
		while(1){
		TR0=1;
		while(TF0){
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t==100){
			TR0=0;
			t=0;
			break;
		}
	}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

(2)(选做题)利用8051的定时/计数器控制4个发光二极管循环闪烁,要求点亮时间为1S,采用方式3的TH0与TL0联合实现,TH0用于定时,TL0用于对TH0溢出次数的计数。

#include<reg51.h>
char t;
char i=0;
char num=0;
char a=0;
char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(){
		
		TMOD=0x07;
		TH0=0x06;
	  TL0=0x38;
		TR1=1;
    TR0=1;
		EA=1;
		ET0=1;
		while(1){
				while(TF1==0);
				TF1=0;
				P3=0;
				P3=0x10;
				TH0=0x06;
		}
}
timer() interrupt 1{
	TF0=0;
	num++;
	a=i%8;
	if(num%20==0){
		P1=led[a];
		i++;
	}
	TL0=0x38;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/408624
推荐阅读
相关标签
  

闽ICP备14008679号