1. 51單片機 秒錶設計
// 51單片機 秒錶,顯示時間為0000—9999秒,啟動、停止,(停止後再次啟動復位)
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar ,shi;
uint a1,a2;
sbit D1=P3^0;
sbit D2=P3^1;
sbit D3=P3^2;
sbit D4=P3^3;
sbit key=P3^5;
sbit key1=P3^7;
bit j ;
uint y ;
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
=0;
shi=0;
while(1)
{
if(key==0)
{
j=0;
}
if(key1==0)
{
j=1; a2=0;
}
}
}
void timer0()interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a1++;
y++;
if(a1==100)
{
a1=0;
if(j==1) a2++;
if(a2>=10000) a2=0;
}
D1 = 1; D2 = 1; D3 = 1; D4 = 1;
if(y==1)
{
P1=table[a2%10000/1000];
D4=0;
}
if(y==2)
{
P1=table[a2%1000/100];
D3=0;
}
if(y==3)
{
P1=table[a2%100/10];
D2=0;
}
if(y==4)
{
P1=table[a2%10];
D1=0;
y=0;
}
}
2. 51單片機數字秒錶設計用4位數碼管分別顯示十秒,秒,百毫秒,十毫秒計時范圍為10ms到99s
/***************************************************************************/
#include <reg51.h>
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//數碼管位選埠
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
void YS(char hs); void XS(int xm,int xs); void Time1(void);int n,i,m,s;
/***************************************************************************/
void main(void){Time1();while(1){XS(m,s);}}//主函數
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;s++; if(s>59){s=0;m++;if(m>59){m=0;}}}
}
/***************************************************************************/
void Time1(void)//定時器初始化
{
TH0=(65536-921)/256; TL0=(65536-921)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;
}
/***************************************************************************/
void XS(int xm,int xs) //數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xm/1)%10; d4=(xm/10)%10;
P0=table[d1]; Axs=0; YS(10); Axs=1;//個位顯示
P0=table[d2]; Bxs=0; YS(10); Bxs=1;//十位顯示
P0=table[d3]; Cxs=0; YS(10); Cxs=1;//百位顯示
P0=table[d4]; Dxs=0; YS(10); Dxs=1;//千位顯示
}
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數
/***************************************************************************/
數碼管的埠用的可能不一樣,自己改下
3. 單片機怎麼設計一個0-9的一位數秒錶,用定時器實現 c語言程序及其注釋
#include
#define
uchar
unsigned
char
uchar
distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar
times,num;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
//重置初值
TL0=(65536-50000)%256;
times++;
if(times>=20)
//1秒是否到
{
times=0;
num--;
//1秒到後,計數值減1
P0=distab[num];
//顯示
if(num==0)num=9;
//到0後再賦值為9
}
}
main()
{
TMOD=0x01;
//定時器0為16為定時
TH0=(65536-50000)/256;
//50毫米中斷一次
TL0=(65536-50000)%256;
ET0=1;
EA=1;
num=9;
times=0;
TR0=1;
while(1);
}
4. 求用單片機設計一個秒錶AT89C51
;匯編程序如下。
;使用T0定時方式1,每隔50ms中斷一次,用於修改時間及顯示
;使用外部中斷0、1,用於控制啟動和清零
;========================================================
ORG0000H
AJMPMAIN
ORG0003H
AJMPX0_INT
ORG000BH
AJMPT0_INT
ORG0013H
AJMPX1_INT
MAIN:
MOVTMOD,#01H;T0定時方式1
MOVTH0,#(65536-50000)/256;50ms@12MHz
MOVTL0,#(65536-50000)MOD256;
SETBTR0
SETBET0;開啟定時中斷
SETBEX0
SETBEX1
SETBEA;定時器初始化結束,下面循環顯示即可
MOVR1,#99H;0~99計數.
MOVR7,#1;50ms計數.
MOVP0,#0C0H
MOVP2,#0C0H
LOOP:
SJMPLOOP
;-----------------------------------------------------------
DELAY:;延時子程序.
AA4:MOVR4,#0
DJNZR4,$
DJNZR4,$
RET
;-----------------------------------------------------------
X0_INT:;啟動/停止
CPLF0
RETI
;-----------------------------------------------------------
X1_INT:;清零
MOVR1,#0
MOVP0,#0C0H
MOVP2,#0C0H
RETI
;-----------------------------------------------------------
T0_INT:;50ms中斷執行一次.
MOVTL0,#(65536-50000)MOD256;
MOVTH0,#(65536-50000)/256;50ms@12MHz
DJNZR7,T0_END;中斷不到20次.
MOVR7,#20
JNBF0,T0_END
MOVA,R1
ADDA,#1
DAA
MOVR1,A
ANLA,#0FH
MOVDPTR,#TAB
MOVCA,@A+DPTR;查出段碼
MOVP2,A
MOVA,R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR;查出段碼
MOVP0,A;顯示十位數.
T0_END:
RETI
;-----------------------------------------------------------
TAB:
DB0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
;===========================================================
;模擬截圖如下:
5. 利用51單片機設計一個秒錶 (一定要按要求做到0.01秒)
最低位,是0.01s 變化一次,一秒鍾,變化 100 次。
這么快,人的眼睛,分辨不出來。
只能看到一個 8。
停止時,才能看到穩定的數字。
程序如下:
#include<reg52.h>
sbit P3_5 =P3^5;
unsigned char counet, m[4] = {0,0,0,0};
void display()
{
unsigned char code Tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code Bit[] = {8, 4, 2, 1};
unsigned char i, j;
for (i = 0; i < 4; i++) {
P0 = Tab[m[i]]; if (i == 2) P0 &= 127;
P2 = Bit[i]; for(; j > 0; j++); P2 = 0;
}
}
void wait_key()
{
while( P3_5) display();
while(!P3_5) display();
}
main()
{
TMOD = 0x02;
IE = 0x82;
while(1) {
wait_key(); TR0 = 1; TH0 = TL0 = 6;
wait_key(); TR0 = 0;
wait_key(); m[0] = m[1] = m[2] = m[3] = 0;
}
}
void time0() interrupt 1
{
counet++;
counet %= 40;
if(!counet) {
m[0]++; m[0] %= 10;
if(!m[0]) {
m[1]++; m[1] %= 10;
if(!m[1]) {
m[2]++; m[2] %= 10;
if(!m[2]) {
m[3]++; m[3] %= 10;
}}}}
}
6. 用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秒
}
7. 單片機秒錶設計
用AT89C51設計一個2位的LED數碼顯示作為「秒錶」,這應該是一個模擬題,可用兩位一體的共陰數碼管,用定時器T0定時,得到1秒計時。
8. 單片機 按鍵秒錶
秒錶的設計程序
用89C51,外接晶振,復位電路,二個數碼管,二個按鍵,做一個電子秒錶,具體要求為用按鍵起停電子表,可用按鍵設計倒計時時間(如10S,20S,60S),並啟動倒計時功能。能用按鍵選擇以上兩功能之一。
三、程序代碼:
A_BIT EQU 20H ;數碼管個位數存放內存位置
B_BIT EQU 21H ;數碼管十位數存放內存位置
TEMP EQU 22H ;計數器數值存放內存位置 ;開機初始化
MOV P3,#0FFH;對P3口初始化,設置為高電平,用於按鍵輸入
MOV P0,#0FFH;使顯示時間數碼管熄滅
CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表啟始地址
;等待按鍵輸入
;根據按鍵的輸入判斷執行什麼功能;按鍵1按下則執行功能1
MOV P3,#0FFH;對P3口初始化,設置為高電平,用於按鍵輸入
MOV P0,#0FFH;使顯示時間數碼管熄滅
START:JB P3.6,START1;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,START;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
LJMP GN1 ;按鍵2按下則執行功能2START1: JB P3.7,START;循環判斷開始按鈕K2是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.7,START1;如果是干擾就返回
JNB P3.7,$
LJMP GN2;數碼管顯示秒錶時間的程序
GN1: ;先初始化
S1:MOV A,#0
MOV TEMP,A
GOON1: MOV R2,#2
JS1: MOV R3,#250
TIME1: MOV A,TEMP ;將TEMP中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個位在B LCALL DPLOP1 ;插入一段判斷定時過程中是否有按鍵輸入的程序段
C1: JB P3.6,B1
ACALL DELAY10;延時10毫秒消抖
JB P3.6,C1
JNB P3.6,$;等待按鍵松開
CPL F0
ZT1: ; MOV P3,#0FFH;對P3口初始化,設置為高電平,用於按鍵輸入
JB P3.6,$;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,ZT1;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
LCALL DPLOP1
B1: JB P3.7,LOOP1
ACALL DELAY10;延時10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按鍵松開
AJMP OVERLOOP1: DJNZ R3,TIME1 ;2毫秒循環執行250次,時間約0.5秒
DJNZ R2,JS1 ;循環執行2次,時間為1 秒鍾INC TEMP;滿一秒鍾對時間加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判斷TEMP的數值是否為60?不為60循環
ACALL OVER
RET
GN2: MOV A,#14H ; 設定倒計時的時間20S
MOV TEMP,A;數碼管顯示倒計時時間的程序
;初始化
MOV P3,#0FFH;對P3口初始化,設置為高電平,用於按鍵輸入
MOV P0,#14H;使顯示時間為設定的倒計時時間 GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: MOV A,TEMP ;將TEMP中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個位在B MOV DPTR,#NUMTAB ;指定查表啟始地址
DPLOP2: MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關閉十位顯示,防止鬼影 ;插入一段判斷定時過程中是否有按鍵輸入的程序段
C2: JB P3.6,B2
ACALL DELAY10;延時10毫秒消抖
JB P3.6,C2
JNB P3.6,$;等待按鍵松開
ZT2: MOV P3,#0FFH;對P3口初始化,設置為高電平,用於按鍵輸入
JB P3.6,$;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,ZT2;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
B2: JB P3.7,LOOP2
ACALL DELAY10;延時10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按鍵松開
AJMP OVERLOOP2: DJNZ R3,TIME2 ;2毫秒循環執行250次,時間約0.5秒
DJNZ R2,JS2 ;循環執行2次,時間為1 秒鍾DEC TEMP;滿一秒鍾對時間減1
MOV A,TEMP
JNZ GOON2;判斷TEMP的數值是否為0?不為0循環
ACALL OVER
RET
;結束定時
OVER: AJMP START;退到開機初始化狀態;1毫秒延時子程序
DELY1: MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET;10毫秒延時子程序
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET;實驗板上的兩位一體的數碼管0~9各數字的顯示代碼
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關閉十位顯示,防止鬼影
RET
END