
#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单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)