赞
踩
实验一至实验七配套源代码、电路图、hex文件、实验报告,请点击此处
(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; } } } }
(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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。