利用 51 單片機構成計數器,計數的上限,做的大一些,也不難,幾千幾萬都可以。
下面的電路,小了一點,是個兩路兩位的計數器。
用來記錄乒乓球比賽,還算可以,用于籃球比賽,分數超過 99,這個電路就不夠用了。
電路圖中,用的是共陽數碼管;還設置了六個按鍵,用途,都已經標出。
用 C 語言編寫驅動程序,是比較簡單的,全部代碼如下:
#include《reg51.h》
unsigned char n1, n2;
//-----------------------------------------------
void delay(unsigned int i) //1ms延時程序
{
unsigned char j;
while(i--) for(j = 0; j 《 115; j++);
}
//-----------------------------------------------
void disp(void)
{
unsigned char code SEG[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, //0-4
0x92, 0x82, 0xf8, 0x80, 0x90};//5-9
P0 = SEG[n1 / 10]; P1 = 1; delay(2); P1 = 0;
P0 = SEG[n1 % 10]; P1 = 2; delay(2); P1 = 0;
P0 = SEG[n2 / 10]; P1 = 4; delay(2); P1 = 0;
P0 = SEG[n2 % 10]; P1 = 8; delay(2); P1 = 0;
}
//-----------------------------------------------
void main(void)
{
unsigned char k, t;
n1 = n2 = 0;
while(1) {
disp();
if (~(P2 | 0xc0)) {
disp();
if (~(P2 | 0xc0)) {
k = ~(P2 | 0xc0);
while (~(P2 | 0xc0)) disp();
if (k == 1) {n1++; if (n1 == 100) n1 = 0;}
else if (k == 2) {n1--; if (n1 == -1) n1 = 99;}
else if (k == 4) {n2++; if (n2 == 100) n2 = 0;}
else if (k == 8) {n2--; if (n1 == -1) n2 = 99;}
else if (k == 16) {n1 = n2 = 0;}
else if (k == 32) {t = n1; n1 = n2; n2 = t;}
} } }
}
//-----------------------------------------------
是不是很簡單?
用匯編語言來編程,就顯得長多了。
和上述 C 語言功能相同的匯編語言程序,全部代碼如下:
ORG 0000H
JMP MAIN
ORG 0030H
;-------------------------
MAIN:
CALL DISP
MOV A, P2
CJNE A, #0FFH, KEY
CLR 00H
JMP MAIN
;-------------------------
KEY:
JNB 00H, A_ADD1
JMP MAIN
;----------------------
A_ADD1:
SETB 00H
JB P2.0, A_SUB1
MOV A, R0
ADD A, #01H
DA A
MOV R0, A
JMP MAIN
;----------------------
A_SUB1:
JB P2.1, B_ADD1
MOV A, R0
ADD A, #99H
DA A
MOV R0, A
JMP MAIN
;----------------------
B_ADD1:
JB P2.2, B_SUB1
MOV A, R1
ADD A, #01H
DA A
MOV R1, A
JMP MAIN
;----------------------
B_SUB1:
JB P2.3, CLR_0
MOV A, R1
ADD A, #99H
DA A
MOV R1, A
JMP MAIN
;----------------------
CLR_0:
JB P2.4, EXCH
MOV R0, #00H
MOV R1, #00H
JMP MAIN
;----------------------
EXCH:
JB P2.5, END_K
MOV A, R0
XCH A, R1
MOV R0, A
JMP MAIN
END_K:
CLR 00H
JMP MAIN
;-------------------------
DISP:
MOV DPTR, #BG
MOV A, R0
SWAP A
ANL A, #0FH
MOVC A, @A + DPTR
MOV P0, A
SETB P1.0
CALL DELAY
CLR P1.0
;----------------------
MOV A, R0
ANL A, #0FH
MOVC A, @A + DPTR
MOV P0, A
SETB P1.1
CALL DELAY
CLR P1.1
;----------------------
MOV A, R1
SWAP A
ANL A, #0FH
MOVC A, @A + DPTR
MOV P0, A
SETB P1.2
CALL DELAY
CLR P1.2
;----------------------
MOV A, R1
ANL A, #0FH
MOVC A, @A + DPTR
MOV P0, A
SETB P1.3
CALL DELAY
CLR P1.3
RET
;-------------------------
DELAY:
DJNZ R7, $
DJNZ R7, $
DJNZ R7, $
DJNZ R7, $
RET
;-------------------------
BG:
DB 0C0H,0F9H,0A4H,0B0H, 99H
DB 92H, 82H,0F8H, 80H, 90H
;-------------------------
END
匯編語言的程序,看起來,比 C 語言的程序,長了不少,但是,編譯后生成的機器碼,卻少于 C 程序。
上一篇:基于AT89S51單片機的沖床控制器
下一篇:帶你使用51單片機做一款簡易的電子時鐘
推薦閱讀最新更新時間:2025-06-07 23:28



設計資源 培訓 開發板 精華推薦
- 步進電機控制指令詳解
- 依利浦實驗室人工智能平臺為Ceva NeuPro-Nano NPU優化 推動實現更智能的邊緣設備
- Bourns 全新推出兩款屏蔽功率電感器系列 專為 DDR5 電源管理電路開發
- Bourns 推出新型電流變壓器產品,采用坡莫合金 T 型磁芯結構,具備高匝數比特性
- 羅克韋爾自動化推出 OptixEdge 高級邊緣網關,助力客戶釋放數據潛力
- 通用汽車斥資 40 億美元,擬將主要制造業遷回美國
- 是德科技助力蔚來驗證新一代 汽車無線系統
- 為敏感的器件打造超低噪聲電源
- Teledyne Space Imaging 發布通過航天級篩選的工業圖像傳感器
- 曝韓國電池供應商LG與奇瑞簽署合作協議:訂單規模達8GWh!
- 【CN0113】利用數字電位計AD5292和運算放大器OP184構建可變增益反相放大器
- MSP430教程14:MSP430單片機ADC12模塊
- MOSFET的發明人--馬丁•阿塔拉(Martin M. "John" Atalla)博士
- 請問Wince上不能正確顯示越南語怎么解決?
- wince 的超級終端
- [轉載]Active Noise Control Using a Filtered-X LMS FIR Adaptive Filter
- 在城里的農村孩子你回來吧!父母不多你一個人!
- 編譯器認為十六進制值是無符號?
- TPK宸鴻科技集團誠聘英才,多個崗位可選擇!!!
- 還有6個小時,DIY大賽方案提交即將截止!