51单片机电子钟程序数码管显示

51单片机电子钟程序数码管显示,第1张

#include<reg51h>

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;

uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;

unsigned int pp;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned char i)

{

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

for(k=125;k>0;k--);

}

void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)

{

dula=0;

P0=table[shi2];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[shi1]|0x80;

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);

P0=table[fen2];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(5);

P0=table[fen1]|0x80;

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

delay(5);

P0=table[miao2];

dula=1;

dula=0;

P0=0xef;

wela=1;

wela=0;

delay(5);

P0=table[miao1];

dula=1;

dula=0;

P0=0xdf;

wela=1;

wela=0;

delay(5);

}

void keyscan0()

{

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xbb:

ok=0;

break;

case 0x7b:

ok=1;

break;

}

}

}

}

void keyscan()

{

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

wei++;

break;

case 0xde:

key=1;

wei++;

break;

case 0xbe:

key=2;

wei++;

break;

case 0x7e:

key=3;

wei++;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

wei++;

break;

case 0xdd:

key=5;

wei++;

break;

case 0xbd:

key=6;

wei++;

break;

case 0x7d:

key=7;

wei++;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

wei++;

break;

case 0xdb:

key=9;

wei++;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

}

}

}

}

void main()

{

TMOD=0x01;

TH0=(65536-46080)/256;// 由于晶振为110592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。

TL0=(65536-46080)%256;//46080的来历,为50000110592/12

ET0=1;

EA=1;

while(1)

{ keyscan0();

if(ok==1)

{ TR0=1;

wei=0;

if(pp==20)

{ pp=0;

m++;

if(m==60)

{

m=0;

f++;

if(f==60)

{

f=0;

s++;

if(s==24) //为24h一个循环,若要12h,只需在此改为12即可。

{

s=0;

}

}

}

}

a0=s%10;

a1=s/10;

b0=f%10;

b1=f/10;

c0=m%10;

c1=m/10;

display(a1,a0,b1,b0,c1,c0);

}

else

{ TR0=0;

keyscan();

if(key!=10)

{

switch(wei)

{

case 1: if(key<3) //小时最高位为2

a1=key;

else

wei--;

break;

case 2: if(a1==1|a1==0)

a0=key;

else

if(key<5)

a0=key; //当小时最高位为2时,低位最高为4

break;

case 3: if(key<7) //分钟最高位为6

b1=key;

else

wei--;

break;

case 4: b0=key; break;

case 5: if(key<7) //秒最高位为6

c1=key;

else

wei--;

break;

case 6: c0=key; break;

}

key=10;

}

m=c110+c0;

f=b110+b0;

s=a110+a0;

display(a1,a0,b1,b0,c1,c0);

}

}

}

void time0() interrupt 1

{ TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

pp++;

}

不清楚你的电路构成如何,因此先按下面的假设执行段码及位码的输出;

其中,延时值可根据实验效果予以调整;

设 P0 为输出七段码(共阳极数据);

四位数码管有4个阳极,设位码分别与P24--P27对应,并且=1时表示可点亮数码管;

sbit wma1=b2^4; //对应左起第1个数码管的阳极

sbit wma2=b2^5; //对应左起第2个数码管的阳极

sbit wma3=b2^6;

sbit wma4=b2^7;

void main()

{

wma1=0; wma2=0; wma3=0; wma4=0;

while(1)

{

P0=table[0]; wma1=1; delay(10); wma1=0;

P0=table[1]; wma1=2; delay(10); wma2=0; P0=table[2]; wma1=3; delay(10); wma3=0; P0=table[3]; wma1=4; delay(10); wma4=0; P0=table[4]; wma1=1; delay(10); wma1=0; P0=table[5]; wma1=2; delay(10); wma2=0; P0=table[6]; wma1=3; delay(10); wma3=0; P0=table[7]; wma1=4; delay(10); wma4=0;

}

}

1、首先,要把代码写好,点亮数码管。

2、代码写完后,要确认原先写好的代码是不是正确的。

3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。

4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。

5、这里改成的是代表数字0的代码,如图所示。

6、最后写好代码后,将生成的hex文件写进单片机,数码管显示的数字就变成0了。

以下是使用51单片机(如STC89C52)和4个开关来控制数码管显示一位密码的简单示例代码。假设使用的是共阴数码管,并且数码管的引脚连接到了单片机的P0口。

#include <reg52h> // 引入单片机寄存器定义头文件// 数码管显示的密码模式,共16种,每种模式使用4位二进制表示unsigned char password[16] = { 0x3F, // 0b00111111, 模式0

0x06, // 0b00000110, 模式1

0x5B, // 0b01011011, 模式2

0x4F, // 0b01001111, 模式3

0x66, // 0b01100110, 模式4

0x6D, // 0b01101101, 模式5

0x7D, // 0b01111101, 模式6

0x07, // 0b00000111, 模式7

0x7F, // 0b01111111, 模式8

0x6F, // 0b01101111, 模式9

0x77, // 0b01110111, 模式10

0x7C, // 0b01111100, 模式11

0x39, // 0b00111001, 模式12

0x5E, // 0b01011110, 模式13

0x79, // 0b01111001, 模式14

0x71 // 0b01110001, 模式15};void main() { unsigned char i = 0; // 密码模式的索引

while (1) { // 读取四个开关的状态,每个开关对应一个二进制位

unsigned char switchValue = (P1 & 0x0F); // 根据开关状态选择密码模式

i = switchValue; // 设置数码管显示的密码模式

P0 = password[i]; // 简单延时

for (unsigned int j = 0; j < 1000; j++);

}

}

以上代码通过读取四个开关(连接到P1口的低4位)的状态来选择密码模式,并将选择的密码模式通过P0口设置到数码管上显示。

假设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];

1、最开始,我们先打开keil。

2、接着,我们要定义好库函数,想要实现动态数码灯,这个步骤是很重要的。

3、接着,我们加上一条循环语句。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。

#include "STC12C54H"

#define uchar unsigned char

#define uint unsigned int

#define dataport P1//P1直接驱动数码管的8个阳极

sbit wei1=P3^3;//再有三个管脚接3个三极管驱动数码管的阴极

sbit wei2=P3^4;

sbit wei3=P3^5;

uint a=0;//中断次数计数,一次50ms,20次为1 秒

//共阴数码管七段码

uchar TABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时子程序

void delay1ms(uint t)

{

uint i,j,k;

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

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

for(k=27;k>0;k--);

}

//显示子程序

void display(uint n)

{

uchar a1,a2,a3;

a1=n/100%10;

a2=n/10%10;

a3=n%10;

wei1=1;

dataport=TABLE[a1];

delay1ms(1);

wei1=0;

dataport=0x80|TABLE[a2];//这里多个小数点

delay1ms(1);

wei3=1;

dataport=TABLE[a3];

delay1ms(1);

wei3=0;

}

void init(void)

{

TMOD=0X01;

TH0=(655536-50000)/256;//定时50ms

TL0=(655536-50000)%256;

EA=1;

ET0=1;

TR0=1;

P1M0=0;

P1M1=0xff;//P1口设为推挽输出,驱动能力强

P3M0=0;

P3M1=0x38;//P33P34 P35口设为推挽输出

}

void main(void)//主程序

{

init();//初始状态设定

while(1)

{

display(a/2);//显示计数值,以十分之一秒为单位

}

}

void timer0(void)interrupt 1//中断子程序

{

TH0=(655536-50000)/256;

TL0=(655536-50000)%256;

a++;

if(a==1980)a=0;//1980次是99秒

}

#include<reg51h>

#define uchar unsigned char;

uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f

uchar number,nn=0;

uchar dat[]={2,0,1,2,1,1,4,5,8,2};

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

number++;

number%=4;

switch(number)

{

case 0:P2=0x08;P0=distab[nn];

break;

case 1:P2=0x04;P0=distab[nn+1];

break;

case 2:P2=0x02;P0=distab[nn+2];

break;

case 3:P2=0x01;P0=distab[nn+3];

break;

default:break;

}

nn++;

nn%=7;

}

main()

{

TMOD=0x01;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

while(1);

}

以上就是关于51单片机电子钟程序数码管显示全部的内容,包括:51单片机电子钟程序数码管显示、51单片机四位一体共阳极数码管显示编程、51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9467781.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存