用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序

用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序,第1张

#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

#define uint unsigned int

uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,

0xb6,0xbe,0xe0,0xfe,0xf6,0x0};//段码根据实际情况自编

sbit k1=P2^0;//定义加加

sbit k2=P2^1;//定义减减

sbit CLK=P3^6;//164模拟时钟

sbit DAT=P3^7;//164模拟数据端

uint z;

void delay(uint t)//延时函数

{

uint x,y;

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

for(y=120;y>0;y--);

}

void sendbyte(uint b)//传送显示字节函数

{

uchar num,c;

num=table[b%10];//个位

for(c=0;c<8;c++)//依次传送8位

{

CLK=0;

DAT=num&0x01;

CLK=1;

num>>=1;

}

num=table[b%100/10];//十位

for(c=0;c<8;c++)//依次传送8位

{

CLK=0;

DAT=num&0x01;

CLK=1;

num>>=1;

}

num=table[b%1000/100];//百位

for(c=0;c<8;c++)//依次传送8位

{

CLK=0;

DAT=num&0x01;

CLK=1;

num>>=1;

}

num=table[b/1000];//千位

for(c=0;c<8;c++)//依次传送8位

{

CLK=0;

DAT=num&0x01;

CLK=1;

num>>=1;

}

}

void key()

{

if(k1==0)

{

delay(3);

if(k1==0)

{

TR0=0;

z++;

if(z==10000)

z=0;

sendbyte(z);

}

while(!k1);

}

if(k2==0)

{

delay(3);

if(k2==0)

{

TR0=1;

sendbyte(z);

}

while(!k2);

}

}

void main()

{

TMOD=0X01;//定时器0定时方式1

TH0=0XD8;//晶振12MHZ,定时10ms

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

sendbyte(0);

while(1)

key();

}

void time()interrupt 1//定时器中断

{

uint count;

TH0=0XD8;

TL0=0XF0;

count++;

if(count==100)//10毫秒X100=1秒

{

count=0;

z++;

if(z==10000)

{

z=0;

}

sendbyte(z);//刷新显示

}

}

我写了个六位数码管的程序,放到这里让你参考一下,希望对你有用!

/

数码管时钟秒表

功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节

时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一

个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为

调节秒钟状态),key4键为秒表功能键。

实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:完成

数码管时钟调节功能;第三步:完成数码管秒表显示功能。

*** 作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键

为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。

/

#include <reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit beep=P2^3;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选编码

uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00};

uchar temp; //temp为按键变量

int light,flag; //flag用来控制数码管显示的状态(显示时钟或者显示秒表),light用来控制时钟和秒表的led显示

uchar shi2,ge2,shi1,ge1; //这四个变量用来分离出实参的十位和个位

uchar num,num1,num2,num3; //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态

int miao,fen,shi; //时钟变量

uchar mfen,mmiao,mmmiao; //秒表变量

void delay(uint z)

{

uint i,j;

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

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

}

void timeinit()

{

TMOD=0x11;

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

TH1=(65536-4608)/256;

TL1=(65536-4608)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=0;

}

void timedisplay0() interrupt 1

{

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

num++;

if(num==20)

{

num=0;

miao++; //开启时钟功能

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

shi=0;

}

}

}

}

void timedisplay1() interrupt 3

{

TH1=(65536-4608)/256;

TL1=(65536-4608)%256;

num1++;

if(num1==2)

{

num1=0;

mmmiao++;

if(mmmiao==100) //开启秒表功能

{

mmmiao=0;

mmiao++;

if(mmiao==60)

{

mmiao=0;

mfen++;

if(mfen==60)

mfen=0;

}

}

}

}

void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)

{

shi2=date/10;

ge2=date%10;

P0=0xff;

wela=1;

P0=table1[add];

wela=0;

P0=0;

dula=1;

P0=table2[shi2];

dula=0;

delay(1);

P0=0xff;

wela=1;

P0=table1[add+1];

wela=0;

P0=0;

dula=1;

P0=table2[ge2]|0x80;

dula=0;

delay(1);

}

void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)

{

shi1=date/10;

ge1=date%10;

P0=0xff;

wela=1;

P0=table1[add];

wela=0;

P0=0;

dula=1;

P0=table2[shi1];

dula=0;

delay(1);

P0=0xff;

wela=1;

P0=table1[add+1];

wela=0;

P0=0;

dula=1;

P0=table2[ge1];

dula=0;

delay(1);

}

void keyscan()

{

P3=0xfd;

temp=P3; //第二行功能键

if(temp!=0xfd)

{

delay(5);

if(temp!=0xfd)

{

beep=0;

switch(temp)

{

case 0xed: num2++; //第一个按键用来控制调节时,分,秒

TR0=0;

light=1;

if(num2==4)

{

num2=0;

light=0;

TR0=1;

}

break;

case 0xdd: if(num2==1) //第二键用来增加数据

{

shi++;

if(shi==24)

shi=0;

}

if(num2==2)

{

fen++;

if(fen==60)

fen=0;

}

if(num2==3)

{

miao++;

if(miao==60)

miao=0;

}

break;

case 0xbd: if(num2==1) //第三个键用来减小数据

{

shi--;

if(shi==-1)

shi=23;

}

if(num2==2)

{

fen--;

if(fen==-1)

fen=59;

}

if(num2==3)

{

miao--;

if(miao==-1)

miao=59;

}

break;

case 0x7d: flag=1; //第四个键用来开启秒表

num3++;

TR1=1;

if(num3==1)

mfen=mmiao=mmiao=0; //清除上次残留数据

if(num3==2)

TR1=0; //暂停秒表

if(num3==3)

{

mfen=mmiao=mmmiao=0; //秒表清零

TR1=0;

}

if(num3==4) //重新开启秒表

TR1=1;

if(num3==5) //暂停秒表

TR1=0;

if(num3==6) //切换为显示时钟状态

{

flag=0;

num3=0;

}

break;

}

while(temp!=0xfd)

{

temp=P3;

}

beep=1;

}

}

}

int main()

{

timeinit();

beep=1;

while(1)

{

keyscan();

if(light==0)

{

if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去

P1=0;

else

P1=0xff;

}

else

{

if(num2==1)

P1=0xfe;

if(num2==2)

P1=0xfd;

if(num2==3)

P1=0xfb;

}

if(flag==0) //显示时钟

{

display(1,shi);

display(3,fen);

display1(5,miao);

}

else //显示秒表

{

display(1,mfen);

display(3,mmiao);

display1(5,mmmiao);

}

}

return 0;

}

以上就是关于用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序全部的内容,包括:用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序、求单片机驱动74hc164,四位7段数码管显示的C语言程序!、51单片机的4位数码管做简易秒表C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存