2017.11.20 定时器与数码管
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017.11.20 定时器与数码管相关的知识,希望对你有一定的参考价值。
&& : 逻辑与,都为真则真
||: 逻辑或,一个为真则为真
!:逻辑非,
&:按位与
|:按位或
~:按位取反
^:按位异或,相异为1.例如A=0b11001100,B=0b11110000,F=A^B=0b00111100
时钟周期:晶振就是时钟源,就是晶振分之一。
机器周期:完成一个操作的最短时间。一个机器周期是12个时钟周期。
定时器:打开定时器后,定时器“存储寄存器”的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。
定时器存储寄存器 sfr地址 复位值
TH0 定时器 0x8C 0x00
TL0 0x8A
TH1 0x8D
TL1 0x8B
TCON 定时器控制寄存器的位分配
TMOD 定时器模式寄存器的位分配
#include<reg52.h>
sbit LED=P0^0;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
void main()
{
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
TMOD=0x01;
TH0= 0xb8;
TL0=0x00;
TR0=1;
unsigned char cnt=0;
while(1)
{ /*
定时器使用方法
1.设置特殊功能寄存器TMOD,配置好工作模式。
2.设置计数寄存器TH0和TL0的初值。
3.设置TCON,通过TR0置1让定时器开始计数
4.判断TCON寄存器的TF0位,检测定时器溢出情况
*/
if(TF0==1)
{
/*
晶振是11.0592MHz ,时钟周期是1/11.0592 *1000000=90422。
定时20ms=0.02s
机器周期X *12/11.0592=0.02
X=18432;
定时器到65535+1 溢出
T0+X=65536
T0=47104;
*/
TF0=0;
TH0=0xb8;
TL0=0x00;
cnt++;
if(cnt>=50)
{
cnt=0;
LED=~LED;
}
}
}
}
#includ<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code (放入程序存储空间,节省空间)LED[]={0xC0,数码管真值表。}
void main()
{
unsigned char cnt=0;
unsigned char sec=0;
ENLED =0;
ADDR3=1;
ADDR2=0;
ADDR1=0;
ADDR0=0;
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
cnt++;
if(cnt>=50)
{
cnt=0;
P0=LED[sec];
sec++;
if(sec>=16)
sec=0;
}
}
}
}
以上是关于2017.11.20 定时器与数码管的主要内容,如果未能解决你的问题,请参考以下文章
单片机c语言编程问题,功能是用定时器T0使发光管间隔200ms闪烁,定时器T1使数码管循环显示0-59.