以单片机为核心,设计一个2位的LED数码显示作为“秒表”。 C语言程序+仿真,最好写明程序每一步的功能等

供稿:hz-xin.com     日期:2025-01-13
设计要求用AT89C51设计一个2位的LED数码显示作为“秒表”用C语言编写

#include#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;unsigned char j,k,c1,c0,m,n=255;unsigned char 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 a,uchar b){ P0=table[a]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[b]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5);}void main(){TMOD=0x01;TR0=1;TH0=(65536-46080)/256;TL0=(65536-46080)%256;//ET0=1; //EA=1; while(1){if(TF0==1){TF0=0;pp++;TH0=(65536-46080)/256;TL0=(65536-46080)%256;}if(pp==20){pp=0;m++;n--;P1=n;if(m==60){m=0; }}c0=m%10; c1=m/10;display(c1,c0); }}

同求😭小姐妹门有分享的吗

// 时钟秒表,仿真示例程序,可以参考一下。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0; //清零

sbit tiaofen=P1^1; //调分

sbit tiaoshi=P1^2; //调时

sbit sounder=P1^7; //naozhong

uint a,b;

uchar hour,minu,sec,   //时钟

hour0,minu0,sec0,//秒表

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2,//显示位

k,s;//状态转换标志

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

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

uchar code tableh[]= {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/  

void main()

{

init();

while(1)

{  

while(TR1)

{

keyscan(); //扫描函数

while(s==1) ///////////////s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);

{  //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan();  //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示

while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec); //秒表显示

}  

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11;  //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1; //秒表中断

EX1=1; //闹钟设定中断

ET0=1;

ET1=1;

IT0=1;  //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0;  //初始,秒表不工作

TR1=1;  //时钟一开始工作

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1 //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0; //毫秒级

minu++;

if(minu==60)

{

minu=0; //秒

hour++;

if(hour==60)  //分

{

hour=0;

}

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{  

hour=0;

minu=0;

sec=0;

}

}

if(k==2)

{

TR0=~TR0;

}  

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3 //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{  

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;               

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);

}

}

else  //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);

}

}

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=tableh[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=tableh[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder;

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

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

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

}



画图 调试两小时还没一步说明,这么冷天……

复杂的,你没搜出来资料么

要代码和仿真可私聊,这里是说不清楚的

锁存器注意事项
操作方法类似。在实际应用中,通常我们会简化这个过程,仅使用一个锁存器,通过一根I\/O口线来控制它的状态,例如,将锁存器的LE线连接到单片机的I\/O口,而OE线可以接地固定。这样,锁存器可以看作是单片机I\/O口功能的扩展工具。因此,是否使用锁存器,主要取决于系统设计的需求和效率考虑。

单片机秒表课程设计,急求!!!
SET_BRIGHT EQU 04H ;占空比为15\/32;显示亮度;SET_LIMITEQU 01H ;2位显示方式;SET_NORMAL EQU 01H ;测试模式 SET_STARTEQU 01H ;进入启动工作方式?;=== ;管脚分配定义 ;=== m7219_DIN BIT P3.0 m7219_LOAD BIT P3.1 m7219_CLK BIT P3.2 KEYSTART BIT P1.0 KEYRESET BIT P1....

stc15w204s单片机用两个串连SM16126D给到任意几个口高电平输出,程序怎 ...
在硬件连接上,第一片16126D的SDI(串行数据输入)应连接到单片机的数据引脚,命名为SDAT;而第二片16126D的SDI则接在第一片16126D的SDO(串行数据输出)上。两片16126D的LE(锁存使能)信号需并联,共同由单片机的一个引脚控制,命名为LE;CLK(时钟)信号也需并联,由单片机的另一个引脚控制,命名为...

两片74hc573怎么连接在单片机上实现位和段的锁存
用74hc573的LE端控制,OE直接接地就行,LE为1时打开锁存器,这时候就可以输入数据到锁存器中,也就是说D0~D7到Q0~Q7导通;LE为0时,锁存器锁存,D0~D7的变化不会影响到Q0~Q7.

用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自...
参考:http:\/\/hi.baidu.com\/%D7%F6%B6%F8%C2%DB%B5%C0\/blog\/item\/52eac0fb2d529307a9d311b0.html 顺便再看看其它的。特别是文章下边的链接,可以找到许多同类的文章。

求高手为下面的仿真图设计一个51单片机实现秒表的程序,要求:2位数码...
汇编还是C?include <reg51.h> define uchar unsigned char define uint unsigned int sbit KS=P1^1;sbit KP=P1^2;sbit KC=P1^3;uchar ge,shi;uchar code tab[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};void delay(uint ms){ uchar a;while(ms--)for(a=123;...

单片机如何在kile3向右动2位
菜单里设置。具体设置步骤如下:1、建立工程文件,选择单片机,单击Project菜单,在弹出的下拉菜单中选中NewProject选项。2、然后选择要保存的路径,输入工程文件的名字,比如保存到hyj目录里,工程文件的名字为h2,然后点击保存。3、这时会弹出一个对话框,选择单片机的型号,这里还是以大家常用的ATMEL公司的...

单片机IO口是怎样扩展的
1、首先可以使用38译码器进行拓展,三个引脚的二进制输入可变成8个引脚的分别输出。2、然后附74hc138芯片真值表。3、还可以使用锁存器拓展:74hc573,顾名思义,就是可以通过控制LE引脚锁住输入io的点平,保持输出不变,如下图。4、还可以用串行输入并行输出的移位缓存器74hc595进行拓展。5、真值表如图...

如何分析一个单片机的时钟?
需要建立对D触发器的工作方式和各种逻辑门电路的工作方式的正确认识和使用 1、观察该系统输入输出波形可以确定该系统为时钟的四分频(2位2进制)2、使用双D触发器对时钟进行四分频,一个D触发器可以完成2分频,级联即可完成4分频,根据D触发器分频基本电路设计电路原理图如下:图中数字信号D(3)为时钟...

51单片机6位数码管显示时间
if (Digi==1||Digi==3) P0 &= 0x7f; \/\/显示分隔符 delay(50);P0 = 0xff;LE1 = 0;} void main(void){ P0 = 0xff;LE1 = 0;LE2 = 0;T0_Init();while(1){ if(MODE != 1 || T_CYCLE){ display(HH\/10,0); \/\/显示小时十位数 display(HH%10,1); \/\/显示小时个...