用C语言编写8051单片机程序

用C语言编写8051单片机程序,第1张

/********************************

/* 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7814412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存