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

来源:互联网 发布:数控雕刻机怎么编程 编辑:程序博客网 时间:2024/06/07 15:04

**数码管主要是利用视觉暂留的效果,通过快速循环点亮数
码管方式,将数据呈现出来数码管是 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 intuchar  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 0