/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定时器0,定时中断2ms一次对数码管显示扫描;
/* 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;
/* 段A-H接到P0.1....7,位选为 P1.0,1,2;
/* 流水也以计数方式从200到250在P2口显示,低电平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}//共阳数字字形0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe}//低电平有效数字个十百位选择
unsigned char buf[3]={0,0,2}//计算中的个十百位暂时存放处
unsigned char one,ten,second//个十位变量和流水灯显示3秒的时间变量
unsigned char rate//扫描速度,调整以适应显示效果
unsigned char stop=0, flag=1,flag1=0//闪烁3秒的标志位,用于主函数对中断的关断参数传递
unsigned int t,tt//2ms变量
unsigned char rate//与变量t同步,辅助赋值变
/**********主函数**********/
main(void)
{
TMOD=0X01
TH0=0xf8//定时2ms
TL0=0x30
ET0=1
EA=1
TR0=1
while(1)
{ if(stop==1)//判断stop信号,为1后便关闭定时器
{ TR0=0
ET0=0
EA=0
}
}
}
/*******************中断*******************/
void timer0() interrupt 1
{
TH0=0xf8//重新赋值定时2ms
TL0=0x30
if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务
{
t++
if(t==500)
{ t=0
one++
P2=200+ten*10+one//在P2口的流水等,也是从200开始计数。
if(one==10)
{ one=0
ten++
if(ten==5)
{ flag=1//转向执行闪烁任务
}
}
}
}
else//flag已经==1;转向else执行流水灯闪烁任务
{ tt++
if(tt==500)
{ tt=0
second++
P2=~P2//流水灯全部以1S速度闪烁
if(second==3)stop=1//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭
}
}
rate++
P0=0XFF//消隐
if(rate==3)rate=0
P0=num_disp[buf[rate]]
P1=bit_sel[rate]
buf[0]=one
buf[1]=ten
//因为百位没有变,所以不用赋值
}
51程序库http://www.programfan.com/blog/article.asp?id=19116
http://workingon.bokee.com/viewdiary.12218674.html
MCS-51单片机实用子程序库
http://blog.tom.com/fangqidong/article/416.html
你的第二次修改,还有一处不足:……
CLR C
MOV DPTR,#TABLE
LOOP:
CLR A 这里少了一句,下面每次读出的,
就不知道是什么了
MOVC A,@A+DPTR
JNZ CONT_P
INC R2
SJMP NEXT
……
可以正常计数的程序如下。
=========================================
ORG 0H
MOV A,#00H
MOV R2,A
MOV R3,A
MOV R4,A
MOV R6,A
MOV R5,#40
CLR C
MOV DPTR,#TABLE
LOOP:
CLR A
MOVC A,@A+DPTR
JNZ CONT_P
CJNE A,#00H,CONT_P
INC R2
SJMP NEXT
CONT_P:
JB ACC.7, CONT_N
INC R3
SJMP NEXT
CONT_N:
INC R4
NEXT:
INC DPTR
DJNZ R5, LOOP
MOV P0,R4
SJMP $
实际个数 保存单元 统计个数
零个数 14R2 21
正数个数19R3 19
负数个数:7R4 0
其实是零和负数没有分开统计,请高手指教一下,谢谢!
ORG 400H
TABLE:
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 02H, 05H, 00H,0FFH, 26H, 34H, 00H, 00H, 00H, 00H
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)