❶ 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" 00H
DB 60H ;"1" 01H
DB 0DAH ;"2" 02H
DB 0F2H ;"3" 03H
DB 66H ;"4" 04H
DB 0B6H ;"5" 05H
DB 0BEH ;"6" 06H
DB 0E0H ;"7" 07H
DB 0FEH ;"8" 08H
DB 0F6H ;"9" 09H
DB 0EEH ;"A" 0AH
DB 3EH ;"B" 0BH
DB 9CH ;"C" 0CH
DB 7AH ;"D" 0DH
DB 9EH ;"E" 0EH
DB 8EH ;"F" 0FH
DB 00H ;" " 10H
; DB 3FH,06H,5BH,4FH,66H ;12345
; DB 6DH,7DH,07H,7FH, ;6789
;---------------------------------------
DELAY:
MOV R6,#25
DLY01:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DLY01
RET
;---------------------------------------
BEGIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0F4H
MOV TL1,#48H
MOV LEDC,#0
MOV R0,#LEDD
CLR A
INIT:
MOV @R0,A
INC R0
DJNZ LEDC,INIT
SETB ET1
SETB TR1
MOV P2,#0
MOV TCNT,#0
MOV SECC,#0
SETB ET0
SETB EA
MOV SECC,#60
LCALL DISSEC
SETB TR0
SETB TR1
LOOP:
SJMP $
;---------------------------------------
T1INT:
PUSH ACC
CLR TR1
MOV TH1,#0F4H
MOV TL1,#48H
SETB TR1
MOV DPTR,#TABLE
MOV R0,#LEDD
MOV A,LEDC
T1INT0:
JNZ T1INT1
MOV P2,#01H
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
SJMP T1INTD
T1INT1:
MOV P2,#02H
INC R0
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
T1INTD:
INC LEDC
MOV A,LEDC
CJNE A,#2,T1INT6
T1INT6:
JC T1INTE
MOV LEDC,#0
T1INTE:
POP ACC
RETI
;---------------------------------------
HBCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;---------------------------------------
T0INT:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC TCNT
MOV A,TCNT
CJNE A,#20,T0INT1
T0INT1:
JC T0INTE
MOV TCNT,#0
INC SECC
MOV A,SECC
CJNE A,#60,T0INT2
JC T0INT2
MOV A,#60
MOV SECC,A
T0INT2:
LCALL DISSEC
T0INTE:
POP ACC
RETI
;---------------------------------------
DISSEC:
MOV A,SECC
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 30H,A
POP ACC
SWAP A
ANL A,#0FH
MOV 31H,A
RET
;---------------------------------------
END
❷ 如何用51單片機的八位動態數碼管變為一個秒錶
只修改void refresh_led()函數即可
void refresh_led()
{
static uint8 j = 0;
P0=0x00;//要先關燈在調整輸出位
switch(j)
{
case 0:ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;break;
case 1:ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;break;
case 2:ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;break;
case 3:ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;break;
case 4:ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;break;
case 5:ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;break;
default:break;
}
P0=number[a[j]];/調整到此處可以節省代碼,便於管理
if(5>j)j++;
else j=0;
}
❸ 用單片機控制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++;}
}
個位 十位子百位分離方法:
=a/100%10;
shi=a/10%10;
ge=a%10;
❹ 如何用51單片機用單數碼管做9s的簡易秒錶
假設P0接數碼管,程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0;
uchar b=9;
//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void delay(uchar aa)//延時子程序
{
uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(cc=200;cc>0;cc--);
}
void main(void )//主程序
{
TMOD=0x01;// 定時器0工作方式一
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
TR0=1;//啟動
while(b>0)
{
P0= table[b];
delay(5);
}
P0=0;
TR0=0;
while(1);
}
//中斷子程序
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20) {a=0;b--;}
}
❺ 利用51單片機,4個數碼管設計一個計時器,要求在數碼管上顯示的數據從0開始每1秒鍾加1。
共陽數碼管中斷程序:
#include<reg52.h>
#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 ,shi,ge;
void init();
void delay(uint);
void display(uchar,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(uchar,ucharshi,ucharge)
{
P1=0xfd;
P0=table[];
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()
{
=num/100;
return ;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}
(5)單片機數碼管秒錶擴展閱讀
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單片機
❻ 51單片機的4位數碼管做簡易秒錶C語言程序
#include"dz110306140.h"這是什麼頭文件
❼ 用51單片機設計3位led數碼顯示管作秒錶00.0-99.0求設計電路與c語言程序
#include "STC12C54.H"
#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;//P3.3P3.4 P3.5口設為推挽輸出
}
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秒
}
❽ AT89c51單片機程序控制兩個數碼管顯示00-59秒錶的程序要怎麼編啊
display(second)子函數與兩個數碼管的連接方式有關
void main(void )//主程序
{
TMOD=0x01;// 定時器1工作方式一
ET0=1;
EA=1;
TH0=(65536-10000)/256;//定時10ms
TL0=(65536-10000)%256;
TR0=0;//上電先不啟動
while(1)
{
if(key1==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key1==0)
{
while(key1==0);//等待按鍵抬起
TR0=!TR0;//啟動或停止
}
}
if(key2==0&&TR0==0)//判斷按鍵是否按下及是否在走時
{
Delay1ms(10);//延時消抖
if(key2==0)
{
while(key2==0);//等待按鍵抬起
a=0; second=0;
}
}
display(second);
}
}
//中斷子程序
void Timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==100 ) second++;
if(second==60) second=0;
}
❾ 51單片機中用數碼管做秒錶時怎麼用一個獨立按鍵控制開始和暫停,即第一次按下計時,在按下時暫停
其實,控制秒錶的啟動和停止,很簡單。要做秒錶,一定要用定時器吧,假如用T0,那開始初始化時,不寫TR0=1,先不啟動。
當按一下鍵,再啟動,TR0=1,就開始計時了。
再 按一下鍵,就停止,TR0=0,就不計時了。
程序好寫,先 定義一個按鍵
sbit key=P1^1; //具體是哪個 鍵,你自己改
主程序中,判斷按鍵和啟動/停止
if(key==0)
{
delay(); //具體延時時間自己定
if(key==0)
{
TR0=!TR0; //每按一次,取反 一次
while(key==0);
}
}