单片机89c51一个6位LED数码管显示功能 程序,希望能准确点的程序,只显示6位数字就好。

单片机89c51一个6位LED数码管显示功能 程序,希望能准确点的程序,只显示6位数字就好。,第1张

#include <reg51h>

#include <intrinsh>

void delay(unsigned int i); //函数声名

char DelayCNT;//定义变量

//此表为 LED 的字模, 共阴数码管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制

//此表为8个数码管位选控制, 共阴数码管 1-8个 -

unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制

/主函数/

main()

{

unsigned int i,LedNumVal=1 ; //变量定义

unsigned int LedOut[10]; //变量定义

DelayCNT=0;

while(1)

{

if(++DelayCNT>=20) //控制数字变化速度

{

DelayCNT=0; //20个扫描周期清零一次

++LedNumVal; //每隔20个扫描周期加一次

}

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;

LedOut[2]=Disp_Tab[LedNumVal%100/10];

LedOut[3]=Disp_Tab[LedNumVal%10];

LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位

LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点

LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[7]=Disp_Tab[LedNumVal%10]; //个位

for( i=0; i<9; i++)

{

P0 = LedOut[i];

P1 = dispbit[i]; //使用查表法进行位选

/ switch(i) //使用switch 语句控制位选

{

case 0:P1 = 0x7F; break;

case 1:P1 = 0xbF; break;

case 2:P1 = 0xdF; break;

case 3:P1 = 0xeF; break;

case 4:P1 = 0xf7; break;

case 5:P1 = 0xfb; break;

case 6:P1 = 0xfd; break;

case 7:P1 = 0xfe; break;

} /

delay(150); //扫描间隔时间 太长会数码管会有闪烁感

}

}

}

void delay(unsigned int i)

{

char j;

for(i; i > 0; i--)

for(j = 200; j > 0; j--);

}

#include<reg52h>

#include <intrinsh> //内部包含延时函数 _nop_();

#define uchar unsigned char

#define uint unsigned int sbit d1=P2^0; sbit key1=P0^4;

sbit SDATA_595=P0^0; //串行数据输入 ----接板卡上的SPI 数据信号输入端

sbit SCLK_595=P0^1; //移位时钟脉冲(输入口) ---接板卡上的SPO----串行时钟线----SHcp移位时钟信号输入端

sbit RCK_595=P0^2; //输出锁存器控制脉冲 ----接板卡上SPK STcp锁存信号输入端

uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar num=60;

void delay(uint z);

void aa595_in(uchar Data) {

uchar i;

for(i=0;i<8;i++)

{SCLK_595=0; Data<<=1; SDATA_595=CY;

SCLK_595=1; SCLK_595=0;

}

}

void a595_in(uchar Data) {

uchar i;

for(i=0;i<8;i++) {

SCLK_595=0; Data<<=1; SDATA_595=CY;

SCLK_595=1; SCLK_595=0;

}

}

void aa595_out(void) {

RCK_595=0;

_nop_(); _nop_();

RCK_595=1;

_nop_(); _nop_();

RCK_595=0;

}

void main() {

uchar ge,shi;

while(1) {

if(key1==0) {

delay(10);

if(key1==0)

{d1=0; num--;

if(num==0)

num=60;}

while(!key1);//松手检测

delay(10);//延时10ms

while(!key1);//再松手检测

}

else d1=1;

// aa595_in(duan[num]);

// aa595_in(wei[3]);

shi=num/10;

ge=num%10;

a595_in(duan[shi]);

aa595_in(wei[3]);

aa595_out();

delay(10);

aa595_in(duan[ge]);

aa595_in(wei[2]);

aa595_out();

delay(10);}

}

void delay(uint z) {

uint x,y;

for(x=100;x>0;x--) for(y=z;y>0;y--);

}//延时子程序,延时Zms

#include<reg51h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9

uchar sec=0,min=0,hour;

uchar time;

uchar disdat[6];

void delay(unsigned int x)

{

unsigned int i,j;

for(i=0;i<x;i++)

for(j=0;j<120;j++);

}

void dischg()

{

disdat[0]=sec%10;

disdat[1]=sec/10;

disdat[2]=min%10;

disdat[3]=min/10;

disdat[4]=hour%10;

disdat[5]=hour/10;

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c;

TL0=0xb0;

time++;

if(time==20)

{

time=0;

if(sec>0)sec--;

else if(min>0){sec=99;min--;}

else if(hour>0){sec=99;min=99;hour--;}

}

dischg();

}

void t1isr() interrupt 3 //显示

{

TH1=0xec;

TL1=0x78;

switch(scanled)

{

case 0:

P2=0x20;

P0=~ledtab[disdat[5]];

break;

case 1:

P2=0x10;

P0=~ledtab[disdat[4]];

break;

case 2:

P2=0x08;

P0=~ledtab[disdat[3]];

break;

case 3:

P2=0x04;

P0=~ledtab[disdat[2]];

break;

case 4:

P2=0x02;

P0=~ledtab[disdat[1]];

break;

case 5:

P2=0x01;

P0=~ledtab[disdat[0]];

break;

default:break;

}

scanled++;

scanled%=6;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

TR1=1;

TR0=0;

ET0=1;

ET1=1;

EA=1;

fmq=0;

scanled=0;

time=0;

mode=1;

dischg();

while(1)

{

if(keyhu==0)

{

while(keyhu==0);

TR0=0;

hour++;

hour%=24;

}

if(keyhd==0)

{

while(keyhd==0);

TR0=0;

if(hour>0)hour--;

if(hour==0)hour=23;

}

if(keymu==0)

{

while(keymu==0);

TR0=0;

min++;

min%=60;

}

if(keymd==0)

{

while(keymd==0);

TR0=0;

if(min>0)min--;

if(min==0)min=59;

}

if(keysu==0)

{

while(keysu==0);

TR0=0;

sec++;

sec%=60;

}

if(keysd==0)

{

while(keysd==0);

TR0=0;

if(sec>0)sec--;

if(sec==0)sec=59;

}

if(keyst==0)

{

while(keyst==0);

TR0=~TR0;

}

dischg();

}

}

#include <reg52h>

typedef unsigned char u8;

typedef unsigned int u16;

void display(u8 x);//声明显示子函数

u8 t0n; //定时器中断次数

void main()//主程序

{

u8 n;

TMOD=0x01;

TH0 =0x3C;//晶振12M,定时50ms

TL0 =0xB0;

IE =0x82;

TR0 =1;

while(1)

{

display(n);

if(t0n>=20)//1秒到

{

t0n=0;

if(n==0)n=4;

else n=0;

}

}

}

//定时器T0中断服务程序

void T0_isr() interrupt 1

{

TH0 =0x3C;

TL0 =0xB0;

t0n++;

}

这要看你的数码管是共阴还是共阳的哈。还有和单片机IO口的链接情况。然后对应IO口将相应的''0-F编码。

如下面是我的开发板的一位数码管的显示程序,你在上面做些修改就是了哈!

#include <reg51h>

#include <intrinsh>

#define NOP() _nop_() / 定义空指令 /

void delay(unsigned int i); //函数声名

// 此表为 LED 的字模

unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};

main()

{

unsigned int LedNumVal=1 ,C ; //定义变量

while(1)

{

if (++C>= 300)

{ LedNumVal++ ; //每隔300个扫描周期加一次

C =0; //每隔300个扫描清零

}

// 将字模送到P0口显示

P0 = LED7Code[LedNumVal%10]&0x7f; //LED7 0x7f为小数点 共阴和共阳此处也是不一样;

delay(150); //调用延时程序

}

}

/

延时程序

/

void delay(unsigned int i)

{

char j;

for(i; i > 0; i--)

for(j = 200; j > 0; j--);

}

假设P0 P2口接数码管 程序如下

include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar num=0;

//共阴数码管七段码

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};

void Delay1ms(uint i) //1ms延时程序

{

uint j;

for(;i>0;i--)

{

for(j=0;j<164;j++)

{;}

}

}

void main(void )//主程序

{

while(1)

{

delay_ms(1000);

num++;

if(num==100)num=0;

P0=table[num/10];

P2=table[num%10];

从静态显示和动态显示的区别说起,把动态显示占用IO少,利用视觉残留的方法说清楚就可以啊

附上电路图和程序供你参考,别忘记给分哦

#include "STC12C5Ah" //包含头文件

/数字编码表 0~9/

unsigned char const seg[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //段选

unsigned char const position[]={1,2,4,8}; //位选

sbit HC595_SCK = P0^4;

sbit HC595_RCK = P0^5;

sbit HC595_RST = P0^6;

sbit HC595_DAT = P0^7;

//us延时

void delay_us(unsigned int t)

{

while(t--);

}

//延时函数(24M 晶振下延时 1ms)

void delay_ms(unsigned int time)

{

unsigned int t;

for(;time>0;time--)

{

t = 1500;

while(t--);

}

}

//向 HC595 发送一个字节

void HC595_send_byte(unsigned char byte)

{

unsigned char i,temp;

for(i=0;i<=7;i++)

{

temp = byte&1<<i;

if(temp)

{

HC595_DAT = 1; //数据线

}

else

{

HC595_DAT=0;

}

//下面是写时序

HC595_SCK=1; //SCK(11 脚)

delay_us(1);

HC595_SCK=0;

delay_us(1);

}

HC595_RCK=0; //RCK(12 脚)

delay_us(1);

HC595_RCK=1;

}

//显示一个数 num

void SMG_ShowNum(unsigned char num)

{

HC595_send_byte(seg[num]);

}

void SMG_Display(unsigned int dat)

{

SMG_ShowNum(dat/1000);

P0 = (P0&0xf0)|position[0];

delay_ms(2);

SMG_ShowNum((dat%1000)/100);

P0 = (P0&0xf0)|position[1];

delay_ms(2);

SMG_ShowNum(dat%100/10);

P0 = (P0&0xf0)|position[2];

delay_ms(2);

SMG_ShowNum(dat%10);

P0 = (P0&0xf0)|position[3];

delay_ms(2);

}

//主函数

void main()

{

unsigned int num=0;

unsigned char time=0;

P0=0X00; //初始化低四位为高电平,使能四位数码管

HC595_RST=0; //HC595 的复位端,不能让他复位

while(1)

{

num = (num+1)%10000; //动态显示 0~9999

time = 100;

while(time--)

SMG_Display(num);

}

}

以上就是关于单片机89c51一个6位LED数码管显示功能 程序,希望能准确点的程序,只显示6位数字就好。全部的内容,包括:单片机89c51一个6位LED数码管显示功能 程序,希望能准确点的程序,只显示6位数字就好。、求单片机数码管倒计时程序、51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9334863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存