郭天祥的10天学会51单片机_第四节

发光二极管依次点亮:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp;

void delay(uint z);

void main()

{    

       temp=0xfe;//第一个发光二极管点亮

       P1=temp;

       while(1)

       {

              delay(1000);

              temp=_crol_(temp,1);//_crol_是左移函数

              P1=temp;

       }

}

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

发光二极管依次点亮的同时数码管显示:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,num;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void main()

{

       num=0;  

       aa=0;

       TMOD=0x01;//步骤1,对TMOD赋值,以确定T0和T1的工作方式

       TH0=(65536-50000)/256;//步骤2,计算初值,并将其写入TH0、TL0或TH1、TL1

       TL0=(65536-50000)%256;

       EA=1;//开总中断

       ET0=1;//开定时器0中断

       TR0=1;//启动定时器0

       temp=0xfe;//第一个发光二极管点亮

       P1=temp;

       dula=1;

       P0=table[0];

       dula=0;

       wela=1;

       P0=0xea;//所有数码管全亮

       wela=0;

       while(1)

       {

              delay(1000);

              temp=_crol_(temp,1);//_crol_是左移函数

              P1=temp;

              /*if(aa==40)//之所以把数码管显示的这段程序放到中断程序中是因为在上面的//delay(1000)的延时1s的时间内,很可能由定时器控制的计数器加到aa==40,导致下面的程//序不能执行,造成错误

                     {

                            aa=0;

                            num++;

                            if(num==16)

                                   num=0;

                            dula=1;

                            P0=table[num];

                            dula=0;

                     }*/

       }

}

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void timer0() interrupt 1//有时后面加"using 0(1,2,3)",表示第几组工作寄存器,共四组,见书//P12和P16

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;   

       aa++;

       if(aa==40)

                     {

                            aa=0;

                            num++;

                            if(num==16)

                                   num=0;

                            dula=1;

                            P0=table[num];

                            dula=0;

                     }

}

位选编码依次选中第一数码管,第二个数码管一直到第六个数码管:fe,fd,fb,f7,ef,df

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,numdu,numwe;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管的位选编码,依次从第一个数码管到第六个数码管

void main()

{

       numdu=0;

       numwe=0;

       aa=0;

       TMOD=0x01;

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       EA=1;

       ET0=1;

       TR0=1;

       while(1)

       {

              if(aa==20)

              {    

                     aa=0;

                     numdu++;

                     if(numdu==7)

                            numdu=1;

                     dula=1;

                     P0=table[numdu];

                     dula=0;

                     wela=1;

                     P0=tablewe[numwe];

                     wela=0;

                     numwe++;

                     if(numwe==6)

                            numwe=0;

              }

       }

}

void timer0() interrupt 1

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       aa++;     

}

数码管动态显示:当定时器的中断时间很短时,数码管扫描很快,数码管交替更换很快,人的肉眼就会看见几个数码管同时显示

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,numdu,numwe;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void main()

{

       numdu=0;

       numwe=0;

       aa=0;

       TMOD=0x01;

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256;

       EA=1;

       ET0=1;

       TR0=1;

       while(1)

       {

              if(aa==1)

              {    

                     aa=0;

                     numdu++;

                     if(numdu==7)

                            numdu=1;

                     dula=1;

                     P0=table[numdu];

                     dula=0;

                     wela=1;

                     P0=tablewe[numwe];

                     wela=0;

                     numwe++;

                     if(numwe==6)

                            numwe=0;

              }

       }

}

void timer0() interrupt 1

{

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256;

       aa++;     

}

显示一个十位十进制数,通过设置temp,如果显示百位十进制数就要定义一个bai(256范围内,因为tempuchar型,是0256)

Bai= temp/100;

shi=temp%100/10;

ge=temp%10;

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,numdu,shi,ge;//当显示大于255的数字时,要将temp定义成uint型,因为uchar 型//即unsigned char型,范围在0~255之间

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void main()

{    

       temp=12;

       numdu=0;

       while(1)

       {

              shi=temp/10;

              ge=temp%10;

              dula=1;

              P0=table[shi];

              dula=0;

              wela=1;

              P0=0xfe;

              wela=0;

              delay(5);

              dula=1;

              P0=table[ge];

              dula=0;

              wela=1;

              P0=0xfd;

              wela=0;

              delay(5);

       }

}

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

利用子函数显示一个百位数:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar bai,shi,ge;

uint temp;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void display(uchar,uchar,uchar);

void main()

{    

       temp=456;

       bai=temp/100;

       shi=temp%100/10;

       ge=temp%10;                     

       while(1)

       {

              display(bai,shi,ge);

       }

}

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void display(uchar bai,uchar shi,uchar ge)

{

              dula=1;

              P0=table[bai];

              dula=0;

              wela=1;

              P0=0xfe;

              wela=0;

              delay(5);

              dula=1;

              P0=table[shi];

              dula=0;

              wela=1;

              P0=0xfd;

              wela=0;

              delay(5);

              dula=1;

              P0=table[ge];

              dula=0;

              wela=1;

              P0=0xfb;

              wela=0;

              delay(5);

      

}

0显示到99,隔一秒加一次:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,bai,shi,ge;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void display(uchar bai,uchar shi,uchar ge);

void delay(uint z);

void init();

void main()

{    

       init();//初始化子程序

       while(1)

       {

              if(aa==20)//一次中断是50(50000)ms,(a=20)20次就是1s

                {

                     aa=0;

                     temp++;

                     if(temp==100)

                        {

                                   temp=0;

                        }

                     bai=temp/100;

                     shi=temp%100/10;

                     ge=temp%10;

                }

              display(bai,shi,ge);

       }

}

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void display(uchar bai,uchar shi,uchar ge)

{

        dula=1;

              P0=table[bai];

              dula=0;

              P0=0xff;//因为如果没有这句,段选数据送完后P0=table[bai],下面的位选打开//wela=1P0口的数据P0=table[bai]送到下面的位选,导致数码管还没正式送位选P0=0xfe

//就直接显示数字P0=table[bai],导致错误

//P0=table[bai]会传给下面的位选导致后面几个数码管也可能亮

              //P0=0xff作用是让所有数码管都不用,即消隐

              wela=1;

              P0=0xfe;

              wela=0;

              delay(1);//delay(1)是延时1ms,如果时间长了就可能影响中断的程序

              //因为中断程序时间范围内,如果延时超过中断时间就会影响中断程序

              dula=1;

              P0=table[shi];

              dula=0;

              P0=0xff;//道理同上

              wela=1;

              P0=0xfd;

              wela=0;

              delay(1);//如果没有延时P0=0xfd会很快的传给下面的段选,导致错误

              dula=1;

              P0=table[ge];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfb;

              wela=0;

              delay(1);

}

void init()//初始化函数,程序规范化,初始化放到一个子函数里

{    

       wela=0;//初始化中要把段选和位选都清零

       dula=0;

       temp=0;

       TMOD=0x01;

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       EA=1;

       ET0=1;

       TR0=1;  

}

void timer0() interrupt 1

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       aa++;     

}

课件练习:

利用动态扫描方法在六位数码管上显示出稳定的654321:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

uchar dunum;

char wenum;//uchar类型的是不能为负数的,这里的wela是要有负的部分数字

uchar code dutable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar code wetable[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf

};

void delay(uint z)

{

       uchar x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void init()

{

       dunum=0;

       wenum=5;

       dula=0;

       wela=0;

}

void main()

{

       init();

       while(1)

       {

              dunum++;

              if(dunum==7)

                     dunum=1;

              dula=1;

              P0=dutable[dunum];

              dula=0;

              P0=0xff;//这句程序的后面要是加上delay(5),各个数码管会变化很多数字

              wela=1;

              P0=wetable[wenum];

              wela=0;

              wenum--;

              if(wenum==-1)

                     wenum=5;// wetable[wenum]数组的起始值的序号是从05

              delay(5);

       }

}

课件的程序:

#include<reg52.h>  //52单片机头文件

#include <intrins.h> //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit dula=P2^6;       //数码管段选锁存端

sbit wela=P2^7;       数码管位选锁存端

uchar code table[]={   //数码管显示编码

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void display(uchar,uchar,uchar,uchar,uchar,uchar); //函数声明

void delay(uint);

void main()

{

       while(1)

       {

              display(6,5,4,3,2,1);         //始终显示

       }

}

void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)

{

        dula=1;

              P0=table[one];   //送段数据

              dula=0;

              P0=0xff;        //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选//锁存器

              wela=1;

              P0=0xfe;

              wela=0;

              delay(1);

              dula=1;

              P0=table[two];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfd;

              wela=0;

              delay(1);

              dula=1;

              P0=table[three];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfb;

              wela=0;

              delay(1);

              dula=1;

              P0=table[four];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xf7;

              wela=0;

              delay(1);

              dula=1;

              P0=table[five];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xef;

              wela=0;

              delay(1);

              dula=1;

              P0=table[six];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xdf;

              wela=0;

              delay(1);

}

void delay(uint z)       //延时子函数

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar aa,bb,bai,shi,ge,shii;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

void delay(uchar z)

{

       uchar x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void init()

{

       aa=0;

       bb=0;

       bai=0;

       shi=0;

       ge=0;

       shii=0;

       TMOD=0x11;

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       EA=1;

       ET0=1;

       TR0=1;

       //TMOD=0x10;

       TH1=(65536-10000)/256;

       TL1=(65536-10000)%256;

       //EA=1;

       ET1=1;

       TR1=1;

       dula=1;

       P0=table[0];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xc8;

       wela=0;

}

void display(uchar bai,uchar shi,uchar ge)

{

       dula=1;

       P0=table[bai];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfe;

       wela=0;  

       delay(1);

       dula=1;

       P0=table[shi];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfd;

       wela=0;  

       delay(1);

       dula=1;

       P0=table[ge];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfb;

       wela=0;  

       delay(1);

}

void displayy(uchar shii,uchar bb)

{

       dula=1;

       P0=table[shii];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xef;

       wela=0;  

       delay(1);

       dula=1;

       P0=table[bb];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xdf;

       wela=0;  

       delay(1);

}

void main()

{

       init();

       while(1)

       {

              if(aa==20)

              {

                     aa=0;

                     ge++;

                     if(ge==10)

                     {

                            ge=0;

                            shi++;

                            if(shi==6)

                            {

                                   shi=0;

                                   bai++;

                                   if(bai==10)

                                          bai=0;

                            }

                     }

              }

              display(bai,shi,ge);

              if(bb==10)

              {

                     bb=0;

                     shii++;

                     if(shii==10)

                            shii=0;

              }

              displayy(shii,bb);

       }

}

void inter0() interrupt 1

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       aa++;

}

void inter1() interrupt 3

{

       TH1=(65536-10000)/256;

       TL1=(65536-10000)%256;

       bb++;

}

对于题目:用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去

我的方法:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar bai,shi,ge;

uint aa;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

void delay(uint z)

{

       uchar x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void init()

{

       aa=0;

       bai=0;

       shi=0;

       ge=0;

       TMOD=0x10;

       TH1=(65536-10000)/256;

       TL1=(65536-10000)%256;

       EA=1;

       ET1=1;

       TR1=1;

/*    dula=1;

       P0=table[0];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xf8;

       wela=0;*/

}

void display(uchar bai,uchar shi,uchar ge)

{

       dula=1;

       P0=table[bai];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfe;

       wela=0;  

       delay(1);

       dula=1;

       P0=table[shi];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfd;

       wela=0;  

       delay(1);

       dula=1;

       P0=table[ge];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfb;

       wela=0;  

       delay(1);

}

void main()

{

       init();

       while(1)

       {

              display(bai,shi,ge); //显示函数要放在while(1)中,让display(bai,shi,ge)时刻显示,如//果放在中断函数中,只有中断时才会显示,在数码管上就显示不很亮,甚至亮度很弱

       }

}

void inter1() interrupt 3

{

       TH1=(65536-10000)/256;

       TL1=(65536-10000)%256;

       aa++;     

}

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住

我的方法:分成2块,第一块分成2部分:先利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,再利用定时器0500MS速度进行流水灯从上至下移动;第二块是流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”

对于“直至765398并保持显示此数”,程序里关闭定时器1即可实现

#include<reg52.h>

#include<intrins.h>             

#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long int

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0//为了显示HELLO,这里添加几个码,什么也不显示的码是0

};   

sbit dula=P2^6;

sbit wela=P2^7;

uchar one,two,three,four,five,six,aa,bb,kk,dd,ee,flag;

ulong temp;//注意temp的值里有765432

void delay(uint z)

{

       uchar x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)//显示函数单提出来

{

       dula=1;

       P0=table[one];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfe;

       wela=0;  

       delay(1);//延时不能少,少了延时下面的数字送过来就会出现叠加

       dula=1;

       P0=table[two];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfd;

       wela=0;

       delay(1);

       dula=1;

       P0=table[three];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xfb;

       wela=0;

       delay(1);

       dula=1;

       P0=table[four];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xf7;

       wela=0;

       delay(1);

       dula=1;

       P0=table[five];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xef;

       wela=0;

       delay(1);

       dula=1;

       P0=table[six];

       dula=0;

       P0=0xff;

       wela=1;

       P0=0xdf;

       wela=0;

       delay(1);

}

void init()

{

       TMOD=0x11;

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       TH1=(65536-50000)/256;

       TL1=(65536-50000)%256;

       EA=1;

       ET0=1;

       ET1=1;

       TR0=1;

       TR1=1;

      

       ee=0xff;//ee为了控制发光二极管给P1口送数而设置的

       flag=0;//flag为标志位,为了判断是否到了765398

       kk=0xfe; //为了控制发光二极管流水灯给P1口送数

       P1=kk;

       temp=765432;

       display(7,6,5,4,3,2);//显示初始值765432

}

void main()

{

       init();

      

       while(1)

       {

              display(one,two,three,four,five,six);//在主函数中才能不间断显示,在中断中会间断显//

              if(bb==10)

              {    

                     if(temp==765398)

                            flag=1;           //当需要判断时多多利用标志位flag

                     if(flag==0)

                     {

                            bb=0;

                            kk=_crol_(kk,1);   

                            P1=kk;

                     }

                     if(flag==1)

                     {

                            bb=0;

                            dd++;

                            if(dd==6)//定时3s后显示HELLO

                            {

                                   dd=0;

                                   TR0=0;

                                   P1=0xff;

                                   one=16;

                                   two=17;

                                   three=18;

                                   four=18;

                                   five=19;

                                   six=20;//如果这里不将onesix换成HELLO,走到上面的//display(one,two,three,four,five,six),只会将原来的onesix765398再次显示出来

                                   display(one,two,three,four,five,six);

                            }

                            else

                            {

                                   ee=~ee;

                                   P1=ee;//全体发光二极管闪烁

                            }

                     }

              }

       }

}

void exter1() interrupt 3

{

       TH1=(65536-50000)/256;

       TL1=(65536-50000)%256;

       aa++;

       if(aa==2)

       {

              aa=0;

              temp--;

              if(temp==765398)

              {

                     TR1=0;//temp==765398时,关断定时器1,就不再扫描

                     bb=0;

              }

              one=temp/100000;//分离出temp

              two=temp%100000/10000;

              three=temp%10000/1000;

              four=temp%1000/100;

              five=temp%100/10;

              six=temp%10;

       }

}

void exter0() interrupt 1

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       bb++;     

}

课件的程序:在中断函数中,比如下面的中断0的中断时间是50ms,那么中断0中的函数的处理时间不要超过50ms,如果超过中断的时间,下一次中断到来时这次中断还没处理完,就会把下一次中断丢失;一个单周期指令是1us,一个双周期指令是2us,中断0才几条指令,总共也几微妙,远远小于50ms,所以不影响下一次中断;在中断中写一些利于方便计算和观察的程序就行

#include<reg52.h>  //52单片机头文件

#include <intrins.h> //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={   //显示数据编码

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0};

uchar temp,t0,t1,bai,shi,ge,flag,flag1;

uint shu;

void init();              //函数声明

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);

void delay(uint z)     //延时子函数

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void main()          //主函数

{

       init();

       while(1)

       {

              if(flag1!=1)   //如果flagi不再等于1则显示数据

                     display(7,6,5,bai,shi,ge);

              else

                     display(16,17,18,18,19,20);     //否则显示hello

       }

}

void init()          //初始化函数

{

       shu=432;//观察到765432765398的高3位都是765,不用参与分离程序,简化程序

       temp=0xfe;

       P1=temp;

       TMOD=0x11;

       TH0=(65536-50000)/256;  //定时器初始化

       TL0=(65536-50000)%256;

       TH1=(65536-50000)/256;

       TL1=(65536-50000)%256;

       EA=1;

       ET0=1;

       ET1=1;

       TR0=1;

       TR1=1;

}

void timer0() interrupt 1   //定时器0中断

{

       TH0=(65536-50000)/256;

       TL0=(65536-50000)%256;

       t0++;

       if(flag!=1)          //flag不等于1时进行流水灯

              {

              if(t0==10)

                     {

                            t0=1;//这里程序应该是t0=0

                            temp=_crol_(temp,1);

                            P1=temp;

                     }

              }

       else              //否则进行灯闪烁

              {

                     if(t0%4==0)  //小灯每200毫秒变化一次

                            P1=~P1;

                     if(t0==60)

                     {

                            TR0=0;   //3秒后关闭定时器0,关闭灯,并置flag=1

                            P1=0xff;

                            flag1=1;

                     }

              }    

}

void timer1() interrupt 3  //定时器1中断函数

{

       TH1=(65536-50000)/256;

       TL1=(65536-50000)%256;

       t1++;

       if(t1==2)

              {

                     t1=0;

                     shu--;

                     bai=shu/100;

                     shi=shu%100/10;

                     ge=shu%10;

                     if(shu==398)   //当到398时把原来T0中的数清除,重新加裁初值让小灯闪烁

                            {

                                   TR0=0;

                                   TH0=(65536-50000)/256;//还原定时器0,里面的数据此时会有一个数,//这里要还原一下

                                   TL0=(65536-50000)%256;

                                   TR0=1;//再重新启动定时器0

                                   flag=1;

                                   t0=0;

                                   P1=0xff;

                                   TR1=0;

                            }    

              }    

}

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) //显示子函数

{

               dula=1;

              P0=table[aa];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfe;

              wela=0;

              delay(1);

                dula=1;

              P0=table[bb];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfd;

              wela=0;

              delay(1);

                 dula=1;

              P0=table[cc];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xfb;

              wela=0;

              delay(1);

               dula=1;

              P0=table[bai];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xf7;

              wela=0;

              delay(1);

              dula=1;

              P0=table[shi];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xef;

              wela=0;

              delay(1);

              dula=1;

              P0=table[ge];

              dula=0;

              P0=0xff;

              wela=1;

              P0=0xdf;

              wela=0;

              delay(1);

}

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值