89C52单片机数码管循环显示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


//程序名:凌动在瞬间
//编写人:何秋贤
//程序内容:8个数码管前4位循环框流动,后3位显示10进1计数,最后1位闪动行杠,进10蜂鸣器响一次
//程序目的:惯用函数模块化,掌握52微控制器的中断资源,数码管段码计算和使用
//程序效果:可在百度视频里搜索“凌动瞬间”
//看似有些啰嗦,不过对于有用的人这都是重点!

#include//定义一个包含52单片机功能寄存器文件

char AS; sbit s=P3^5;//定义蜂鸣器控制端口P3.5,用sbit可以位寻址(即:可直接访问IO口)

int DQ,SQ,zun,Q,YU,KE;int SE,SVD,VV,LP,UL;//定义整型(int)计数变量用于定时器溢出时计数

int code DO0[]={0xbf,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管显示段码0到10

int code DO3[23]={//定义一个数组变量把所要显示的轮循框数组段码储存在里面

//方法:类型--变量数组名[]={};即:int ABC[]={};变量名可随意取

0xce,0xde,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfc,0xf8,0xf1,0xf3,0xf7,0xf7,0xf7,0xf7,0xf7,//轮循段码
0xf7,0xf7,0xe7,0xc7,0xcf};
int code DO4[23]={
0x80,0x80,0x80,0xc0,0xe0,0xf0,0x70,0x30,0x10,//轮循位码
0x10,0x10,0x10,0x10,0x10,0x30,0x70,0xf0,0xe0,
0xc0,0x80,0x80,0x80,0x80};

int code cbb[]={0xd0,0xe0,0xc1,0xc2,0xc4,0xc8};

int code DO2[]={0xbf,0xff};//闪动光标状态码0和1,数码管的


CLK(int sk)//延时函数,工作原理是先把x赋值500然后判断x,x大于0,x就自减1直到x小于0
{ //所以就产生了时间上的拖延,就起到了延时的作用,这里只是简单描述。
int y,x;
for(y=sk;y>0;y--)
for(x=400;x>0;x--);
}

FG(){//计数显示函数
CLK(1);
P0=DO0[Q];
P1=0x02;
CLK(1);//调用延时函数适当延时,也就是是延时函数里的分之一(即:500分之一)看上面的延时函数就明白了

P0=DO2[DQ];//闪动光标显示函数
P1=0x01;
CLK(1);
}

seq(){//轮循框显示函数
CLK(1);
P0=DO3[SVD];
P1=DO4[SVD];
}

cbbn()
{
CLK(1);
P0=cbb[LP];
P1=0x08;
}


Y2(){
CLK(1);
P0=0xbf;
P1=0x60;}

void main(){

TMOD = 0x01;//设置定为时器0,对内部时钟周期计数(即:对12兆晶振的时钟计数)
TH0=1000;//赋高8位初值
TL0=1000;//赋低8位初值
TR0=1;//启动定时器
ET0=1;//允许中断
EA=1;//打开总中断



while(1){ //程序主循环,如果没有任何中断请求程序会在while里一直循环执行
FG();seq();cbbn(); Y2();
//把所要显示和实时执行的程序放到while里循环依次执行
}}

//while的意思是如果括号里的条件为真(即:1)则执行大括号里的程序
//如果括号里的条件为假(即:0)则不执行大括号里的程序


stop() interrupt 1{//定时器0中断函数interrupt n,n的编号是对应着89C52内部的每个中断源

//其中1是定时器0的中断请求,0

是外部中断0的中断请求,2是外部中断1的请求,
//3是定时器1的中断请求,4则是串行口中断请求,由此看出级别为:0>1>2>3>4

TH0=1000;//重装高8位初值
TL0=1000;//重装低8位初值

//当定时器溢出时必须重装初值,否则计满后会停止计数

AS++;SQ++;SE++;zun++;UL++;YU++;//当定时器计满溢出这些变量就执行自己的动作如:AS自加1等等

if(zun==500)zun=0;

if(AS==130)AS=0;
//AS加满130溢出则清零然后再来判断等于0后Q再自加加直到为10才清零,这样就得到了寻找段码的变量时钟
if(AS==0)Q=Q++;
if(Q==10)Q=0;//共数10次,每次约为一秒,12兆晶振
if(Q==0)if(AS==10)s=0;
else s=1;

if(SQ==40)SQ=0;//这里同上,相信你看得出来,每个变量对应着自己的函数
if(SQ==0)DQ=DQ++;
if(DQ==2)DQ=0;

if(SE==20)SE=0;
if(SE==0)SVD=SVD++;
if(SVD==23)SVD=0;


if(UL==24)UL=0;
if(UL==0)LP=LP++;
if(LP==6)LP=0;

}
//至此,这是我本人的程序和想法,也许同样的事情有不同的方法,你呢 ^_^

//更多交流QQ:1214166685

相关文档
最新文档