Linux系统下的51单片机数码管实现精准计时

**数码管主要是利用视觉暂留的效果,通过快速循环点亮数
码管方式,将数据呈现出来数码管是 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短接, 学会看懂原理和其单片机的引脚图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51单片机数码管3分钟计时的代码示例: ``` #include <reg51.h> // 导入51单片机头文件 #define uchar unsigned char // 定义无符号字符型变量 sbit D1 = P1^0; // 数码管的位选引脚 sbit D2 = P1^1; sbit D3 = P1^2; sbit D4 = P1^3; sbit LSA = P2^2; // 数码管的段选引脚 sbit LSB = P2^3; sbit LSC = P2^4; uchar code DisplayTable[] = { // 数码管显示表 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 }; void Delayms(uchar n) { // 延时函数 uchar i, j; for(i = n; i > 0; i--) for(j = 110; j > 0; j--); } void Display(uchar num) { // 数码管显示函数 LSA = 0; LSB = 0; LSC = 0; // 关闭段选 P0 = DisplayTable[num]; // 设置显示的数字 Delayms(5); // 延时 } void main() { uchar i, j, k; for(i = 0; i < 3; i++) { // 3分钟计时 for(j = 0; j < 60; j++) { // 60秒计时 for(k = 0; k < 100; k++) { // 100毫秒计时 Display(j % 10); // 显示秒的个位数 D1 = 1; D2 = 0; D3 = 0; D4 = 0; // 选择第1位数码管 Delayms(1); // 延时 Display(j / 10); // 显示秒的十位数 D1 = 0; D2 = 1; D3 = 0; D4 = 0; // 选择第2位数码管 Delayms(1); Display(i % 10); // 显示分的个位数 D1 = 0; D2 = 0; D3 = 1; D4 = 0; // 选择第3位数码管 Delayms(1); Display(i / 10); // 显示分的十位数 D1 = 0; D2 = 0; D3 = 0; D4 = 1; // 选择第4位数码管 Delayms(1); } } } } ``` 以上代码实现了3分钟计时功能,使用了延时函数和数码管显示函数。在主函数中,分别对秒、分和小时进行计时,并通过数码管显示出来。其中,位选引脚用于选择数码管的哪一位进行显示,段选引脚则用于控制数码管显示的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值