以单片机为核心,设计一个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); \/\/显示小时个...