利用51单片机,6个数码管设计一秒表。要求:刚开始时间为12点(120000),实现秒闪
你是要实物
还是仿真?
共阳数码管中断程序:
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x83,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uint num,a;
uchar bai,shi,ge;
void init();
void delay(uint);
void display(ucharbai,ucharshi,ucharge);
uint fb();
uint fs();
uint fg();
void main()
{
init();
while(1)
{
display(fb(),fs(),fg());
}
}
void init()
{
num=0;
a=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(ucharbai,ucharshi,ucharge)
{
P1=0xfd;
P0=table[bai];
delay(1);
P1=0xfb;
P0=table[shi];
delay(1);
P1=0xf7;
P0=table[ge];
delay(1);
}
void timeoff() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
a++;
if(a%20==0)
{
num++;
if(num==999)
{
num=0;
}
}
}void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint fb()
{
bai=num/100;
return bai;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}
扩展资料
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:百度百科-51单片机
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define show P2
code table[16]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
code tuble[9]=
{
0x00,0x7f,0xbf,
0xdf,0xef,0xf7,
0xfb,0xfd,0xfe
};
uchar t_h,t_m,t_s;
bit KEY=1;
sbit wela=P0^1;
sbit dula=P0^0;
char ge,shi,time0,led;
void play_h(uchar t_h);
void play_m(uchar t_m);
void play_s(uchar t_s);
void display_();
void delay(uint );
void inti();
//void display(uchar t_h,uchar t_m,uchar t_s);
void main()
{
inti();
t_h=setup_h();
t_m=setup_m();
t_s=setup_s();
while(1)
{
if (KEY)
{
KEY=0;
t_s+=1;
if(t_s==60)
{t_m++;t_s=0;}
if(t_m==60)
{t_h++;t_m=0;}
if(t_h==24)
{t_h=0;}
}
delay(3);
display_();
delay(3);
play_s(t_s);
delay(3);
play_m(t_m);
delay(3);
play_h(t_h);
delay(3);
// display(t_h,t_m,t_s);
}
}
//初始化函数
void inti()
{
TMOD=0x01;
IE=0x82;
SP=0x60;
TH0=15536/256;
TL0=15536%256;
P1=0xfe;
time0=0;
t_h=0;
t_m=0;
t_s=0;
led=P1;
ge=0;
shi=0;
TR0=1;
wela=0;
dula=0;
}
//中断函数
void timer0() interrupt 1 using 1
{
TR0=0;
TH0=15536/256;
TL0=15536%256;
TR0=1;
time0++;
if(time0==20)
{
time0=0;
KEY=1;
led=_crol_(led,1);
P1=led;
if (KEY)
{
KEY=0;
t_s+=1;
if(t_s==60)
{t_m++;t_s=0;}
if(t_m==60)
{t_h++;t_m=0;}
if(t_h==24)
{t_h=0;}
}
}
}
//时钟小时位显示
void play_h(uchar t_h)
{
uchar th=t_h;
ge=th%10;
shi=th/10;
show=0xfd;
wela=1;
wela=0;
show=table[ge];
dula=1;
dula=0;
delay(1);
show=0xfe;
wela=1;
wela=0;
show=table[shi];
dula=1;
dula=0;
delay(1);
show=0x00;
}
//时钟分位显示
void play_m(uchar t_m)
{
uchar tm=t_m;
ge=tm%10;
shi=tm/10;
show=0xef;
wela=1;
wela=0;
show=table[ge];
dula=1;
dula=0;
delay(1);
show=0xf7;
wela=1;
wela=0;
show=table[shi];
dula=1;
dula=0;
delay(1);
show=0x00;
}
//时钟秒位显示
void play_s(uchar t_s)
{
uchar ts;
ts=t_s;
ge=ts%10;
shi=ts/10;
show=0x7f;
wela=1;
wela=0;
show=table[ge];
dula=1;
dula=0;
delay(1);
show=0xbf;
wela=1;
wela=0;
show=table[shi];
dula=1;
dula=0;
delay(1);
show=0x00;
}
//显示-连接
void display_()
{
delay(1);
show=0xdb;
wela=1;
wela=0;
show=0x40;
dula=1;
dula=0;
show=0x00;
}
//软件延时
void delay(uint aa)
{
uint x=aa,y;
for(;x>0;x--)
for (y=110;y>0;y--);
}
我这是上周没事自己写了玩的 你把t_h初值改一下就行了 你要连对了电路显示效果是
时时-分分-秒秒
嗯 你看着改改吧 能用的
你就这个一个要求,然后你一点分也没有,谁愿意给你编写,如果你给分多一些,还是可以考虑给你编写一下的
好诡异的要求啊,秒表刚开始显示120000,那第四位进位时怎么办?高两位是显示13还是别的什么??
利用单片机控制6个共阳数码管,采用动态显示方式稳定显示自己的生日_百 ...
include<reg51.h>#define uchar unsigned charuchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};\/\/0-9unsigned char scanled;unsigned char disdat[6];void dischg(){ disdat[0]=4; disdat[1]=1; disdat[2]=6; disdat[3]=0; disdat[4]=9; dis...
在51单片机中,为什么1个机器周期包含6个状态周期?
一个机器周期=12个时钟周期是生产时就确定的,原因就是因为51的执行速度相对较慢,MCU运行时是对外部时钟进行了12分频,这个没必要纠结,执行不够快那只能慢下来。像AVR的单片机 机器周期就=时钟周期,没有进行12的分频。
51单片机如何让一个数码管闪烁而其他数码管一直保持亮的状态不受影响...
假如有6 个数码管,每个亮5ms,30ms是一轮,用一个变量a计数,40轮为一周期,如果a小于20,需闪烁的哪一位数码管不亮,a大于20,该位正常显示。就形成了亮0.6s灭0.6S的效果。下面是4位数码管闪烁程序:uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x...
用51单片机做一个LED显示的电子钟
用89C51设计LED电子钟6个数码管显示时分秒,要求通过键盘输入初值,打上开关K1时允许设定时间,按下开关K1时开始运行显示时间,K2用做选择是24小时制还是12小时制答得正确又快的可以获... 用89C51设计LED电子钟 6个数码管显示时分秒,要求通过键盘输入初值,打上开关K1时允许设定时间,按下开关K1时开始运行显示时间,K2用...
使用51单片机+设计一个6位数的数字时钟两位显示小时两位显示分钟两位显 ...
使用51单片机+设计一个6位数的数字时钟两位显示小时两位显示分钟两位显示秒。
用汇编语言编程使51单片机实现6位共阳数码管一位循环显示0-9
以下程序实现6位数码管,每一位依次循环显示0--9 ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV P2,#0FEH MOV A,#00H MOV DPTR,#TAB LOOP:MOVC A,@A+DPTR MOV P0,A LCALL DELAY INC A CJNE A,#0AH,LOOP MOV A,P2 RL A MOV P2,A JB ACC.6,SS1 MOV P2,#0FEH SS1:CLR A SJMP...
用51单片机设计数字钟,六位数码管显示时分秒,四个发光二极管做为秒点...
那几个发光二极管自己加就行了 s_set bit p1.0 m_set bit p1.1 h_set bit p1.2 second equ 30h minute equ 31h hour equ 32h tcnt equ 34h org 0000h sjmp start org 000bh ljmp int_t0 start:mov dptr,#table mov hour,#0 mov minute,#0 mov second,#0 mov tcnt,#0 mov...
什么是MCS-51单片机的震荡周期,状态周期,机器周期,指令周期。当采用6...
51单片机把一个时钟周期定义为一个节拍(用P表示),两个节拍就是一个*状态周期 机器周期*一条指令的的执行过程分若干个阶段,每一个阶段完成一项工作,每一项工作称为一个基本操作。完成一个基本操作需要的时间就是机器周期。51单片机的一个机器周期由6个状态周期组成,一个状态周期为两个节拍 所以一...
MCS-51单片机的时钟周期与振荡周期之间有什么关系 一个机器周期的时序如...
机器周期时序由振荡周期来划分,内存中读取一个指令字的最短时间来规定机器周期。计算机通过内部或外部总线进行一次信息传输从而完成一个或几个微操作所需要的时间,由12个时钟周期(振荡周期)组成,也是由6个状态周期组成。而振荡周期=1秒\/晶振频率,因此单片机的机器周期=12秒\/晶振频率 。
单片机作业 内部RAM中以51H单元为首地址,存放着6个字节的无符号数...
:MOV R0, @51H MOV 50H, #0 MOV R2, #6 LOOP:MOV A, @R0 JNZ NNN INC 50H NNN:INC R0 DJNZ R2, LOOP SJMP END --- 按照补充,程序如下:CONTO:MOV R1,#51H MOV R2,#6 MOV 50H,#0 LOOP:MOV A,@R1 JNZ NEXT INC 50H NEXT:INC R1 DJNZ R...
督瑗千乐: //开始 P2^0//暂停 P2^1//清零 P2^2 #include <AT89X52.H>unsigned char Lcd_code[8];unsigned char code disp_code[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};unsigned char c_flag;void scanf(void); void InitTimer0(void){ TMOD = 0...
兰山区13549118039: 51单片机做一个10秒倒计时的程序 - ?
督瑗千乐: C语言 #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit p27=P2^7;//数码管位选端定义 uchar c,i; //数码管译码表 unsigned char code NumDecode[] = { 0XC0,//;0 0XF9,//;1 0XA4,//;2 0XB0,//;3 0X99,//;4 0X92,//;5 0X...
兰山区13549118039: 用单片机控制6个共阳数码管秒表计时器分秒毫秒c代码怎么写 - ?
督瑗千乐: 显示部分自己写呀,与硬件关系很大51单片机程序如下:uint a=0; uchar sec=0,min=0; void main(void) { TMOD=0x01; TH0=(65536-1000)/256;TL0=(65536-1000)%256; TR0=1;ET0=1; EA=1; while(1){display();} } 中断程序:void timer0(void) interrupt 1 { TH0=…… TL0=…… a++;if(a==1000){sec++;} if(sec==60){min++;} } 个位 十位子百位分离方法:bai=a/100%10;shi=a/10%10;ge=a%10;
兰山区13549118039: 求程序用AT89C51单片机......用六位数码管实现数字时钟,显示时分秒,用两个按键可分别调整时、分. - ?
督瑗千乐: #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar temp,aa,miao,fen,shi; sbit m=P3^0; sbit n=P3^1; uchar code table[]={ //数码管编码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; void display(uchar miao,...
兰山区13549118039: 51单片机中用数码管做秒表时怎么用一个独立按键控制开始和暂停,即第一次按下计时,在按下时暂停? - ?
督瑗千乐: 其实,控制秒表的启动和停止,很简单.要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动.当按一下键,再启动,TR0=1,就开始计时了.再 按一下键,就停止,TR0=0,就不计时了.程序好写,先 定义一个按键 sbit key=P1^1; //具体是哪个 键,你自己改 主程序中,判断按键和启动/停止 if(key==0) { delay(); //具体延时时间自己定 if(key==0) { TR0=!TR0; //每按一次,取反 一次 while(key==0); } }
兰山区13549118039: 用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续 - ?
督瑗千乐: #include<reg51.h>#define uchar unsigned char; uchar LED1,LED2; uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar num=0;sec,key; void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } void ...
兰山区13549118039: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. - ?
督瑗千乐: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.
兰山区13549118039: 用数码管设计一个秒表,使之显示从0~60(用内部定时器),数码管段码由P2口输出位选由P0口输出 - ?
督瑗千乐: #include // 包含51单片机寄存器定义的头文件 unsigned char code Tab[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示0~9的段码表 unsigned char int_time; //记录中断次数 unsigned char second; //储存秒/**********...
兰山区13549118039: 51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示. - ?
督瑗千乐: ORG 0000H JMP BEGIN ORG 000BH LJMP T0INT ORG 001BH LJMP T1INT LEDD EQU 30H LEDC EQU 36H SECC EQU 37H TCNT EQU 3AH ORG 0030H;--------------------------------------- TABLE: ; 共阴极数码管显示代码表 DB 0FCH ;"0" ...
兰山区13549118039: 用51单片机设计一个数码管计时器程序.从00~~59,增加一个用一秒钟. - ?
督瑗千乐: 试着把P0=00放到jsq_s=1,后面,各位的也一样!!!