利用 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 程序。
单片机的片内存储器跟片外存储器的内和外是相对于什么啊?
半导体产业迈入后摩尔定律时代 复杂制程迫使终端设备必须愈趋智慧化
人脸识别的应用包含了哪些领域
脉冲电源如何设置参数_脉冲电源主要参数
润和软件HopeStage与超图软件 GIS平台完成产品兼容性互认证
51 单片机编程:双路计数器详解
Q61F一体式全焊接球阀:在同类产品中流体阻力最小
小米note2是怎么了? 说好的科技和艺术呢?
KASITE浮动主轴刀具与工件之间柔性接触去毛刺4036DC-T
台积电7nm制程降幅约为5%至10%
探讨iPhone的困境和机会
RFID文件管理系统的结构、功能及优点
OZ9RR与推挽驱动电路构成的高压板电路
自动重合闸漏电保护器的工作条件_自动重合闸漏电保护器配置要求
多个相同IP设备通过网段隔离器实现不同IP的访问映射
cems烟气在线分析仪的详细介绍
3D打印在太空中的应用
安防论坛现场直击,世强掀起差异化商机
中国联通是区块链领域的务实派
PROFIBUS六路集线器的详细介绍