**数码管主要是利用视觉暂留的效果,通过快速循环点亮数
码管方式,将数据呈现出来数码管是 LED 的升级,每位数码管里面继承了 8 个 LED,点亮LED就是点亮数码管**
里面的 LED。
中断寄存器的初始化:
TCON 高四位控制定时计数器的启动和中断申请
高四位: TF1,TR1,TF0,TR0
TR0开关 其他的固定
TMOD=0x01; 将工作方式寄存器TMOD置为 0000 0001 即M0=1,M1=0————工作方式一:16位定时器/计数器。同时C/T=0设置为定时器,GATE设为0。
EA=1; 中断允许寄存器IE打开全局中断控制
ET0=1; T0——定时器/计数器的开关在中断允许寄存器IE的D1位
TR0=1; 定时器/计数器控制允许寄存器TCON的D4位,在GATE为0的情况下,启动,停止仅由TR0控制
这里只举例方式1
计数是16位 , 由TL0 作为低8位, TH0作为高8位 组成加1计数器
个数与初值关系: X=2^16-N
如,计算50000 (50毫秒)
TH0=(65536-50000)/256 放入高8位
TL0=(65536-50000)%256 放入低8位
要在数码管上面显示相应的值,就是点亮不同位置的 LED。数码管有共阴和共阳两种,共阴数码管公共端是所有 LED 的负极连接在一起,相反共阳数
码管公共端是所有 LED 的正极连接在一起。一般公共端称作“位选”,
控制每一个 LED 的称为“段选…….
数码管动态显示就是延时程序和数码管静态显示的结合,首先点亮数码管显示数值,然
后将数值显示一段时间,然后再关闭显示,重新点亮数码管显示另一个数值,实现动态显示。
下面为我自己写的计时代码:
//定时时间,作为秒计数时间,当一秒产生时,秒
//计数加1,秒计数到60时,自动从0开始。单片机
//晶振频率为12MHZ
#include<8051.h> //linux下的头文件
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar miao);
uchar a,miao,shu;
uint num;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(miao);
}
}
void timer0()__interrupt(1)__using(1)
{
TH0=(65536-50000)/256; //设置50毫秒计时器
TL0=(65536-50000)%256; //通过循环20次实现精确控制1秒的计时
a++;
if(a==20)
{
a=0;
miao++;
if(miao==60)
miao=0;
}
}
//初始化函数
void init()
{
TMOD=0x01; //将其工作方式设置为16位计时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //允许打开全局中断控制
ET0=1;
TR0=1;
P0=table[miao]; //初始化传递的数据
}
//显示函数
void display(uchar miao)
{
P0=table[miao%10]; //传递数据
P1=1; //打开位选
delay(5);
P1=0; //关闭位选
P0=table[miao/10];
P1_1=1; //打开P1_1引脚的位选
delay(5);
P1_1=0; //关闭位选
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
注意将跳帽将J1短接, 学会看懂原理和其单片机的引脚图