51单片机程序参考大全

让流水灯来回流一次,蜂鸣器响一次 001  

#include<reg52.h>

#include <intrins.h>

sbit P10=P1^2;

sbit SPK=P1^2; 

#define uint unsigned  int    

#define uchar unsigned  char   

unsigned int temp;

void yanshi() ;

void fengmq();

void delay(unsigned int cnt)

{

 while(--cnt);

}

void main()

{

   int i;

   temp=0xfe;

P1=temp;

   while(1)

  {     

          for(i=0;i<8;i++)

      yanshi();

      temp=_crol_(temp,1);   

P1=temp ;  

    for(i=0;i<8;i++)

      { 

      yanshi();

      temp=_crol_(temp,-1);   

P1=temp ;  

         fengmq(); 

         yanshi();

    }

}

void fengmq()

 {

 while(1)

      { 

              int i;

   for(i=0;i<200;i++) 

          {

            delay(80);      

            SPK=!SPK;

          }

         

      } 

 }

void yanshi() 

 {

    uint x,y;

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

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

 }

数码管动态显示(顺)  002

 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

/*------------------------------------------------

                    延时子程序

------------------------------------------------*/

 

void main()

{

 unsigned char i,j;

 while(1)

      {

       P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全?

     i=0;

        }

    P2=seg[j++];  //取位码

           {

         if(j==8) 

            j=0;

           }

     yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理

     

    

      }

}

void yanshi() 

 {

  int x,y;

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

       for(y=500;y>0;y--) ;    如果将500改为0;将if(16==i) 改为8,将静态显示

 }

数码管动态显示(倒) 003

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

/*------------------------------------------------

                    延时子程序

------------------------------------------------*/

 

void main()

{

   unsigned char i,j;

    i=15;

  while(1)

      {    

       P0=dofly[i--]; 

        {

          if(i==-1)       //如果是i<0,不行

         i=15;

        }

    P2=seg[j++];   

           {

         if(j==8) 

            j=0;

           }

    yanshi();  

      }

}

void yanshi() 

 {

  int x,y;

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

       for(y=500;y>0;y--) ;  //  如果将500改为0;将if(16==i) 改为8,将静态显示

 }

数码管显示HELLO

#include<reg52.h>  

void yanshi();

/*unsigned char code dofly[]={

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

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

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

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

 unsigned char code dofly[]={0x76,0x79,0x38,0x38,0x3F};

 unsigned char code  seg[]={0,1,2,3,4,5,6,7}; 

void main()

{

   unsigned char i,j;

    i=0;

  while(1)

      {    

       P0=dofly[i++]; 

        {

          if(i==5)      

         i=0;

        }

    P2=seg[j++];   

        {

         if(j==5)

            j=0;

        }

    yanshi();  

      }

}

void yanshi() 

 {

  int x,y;

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

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

 }

外部中断

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j;

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

void main()

{

  EA=1;          //全局中断开

  EX0=1;         //外部中断0

  IT0=0;         //0电平触发,1边沿触发

 

 while(1)

      {

       P1=0xFF;   //让所有的灯灭

       P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全?

         i=0;

        }

    P2=seg[j++];  //取位码

           {

         if(j==8) 

            j=0;

           }

     yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理   

      }

}

void yanshi() 

 {

  int x,y;

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

       for(y=50;y>0;y--) ;   // 如果将500改为0;将if(16==i) 改为8,将静态显示

 }

void zhongduan( ) interrupt 0 using 1

{   

     P1=0x00;   //P3.2口有低电平时亮

           yanshi();  //此处不能是while(1),否则不能跳出循环

}

外部中断1

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j;

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

void main()

{

  EA=1;          //全局中断开

  EX1=1;         //外部中断1

  IT1=0;         //0电平触发,1边沿触发

 

 while(1)

      {

       P1=0xFF;   //让所有的灯灭

       P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全?

         i=0;

        }

    P2=seg[j++];  //取位码

           {

         if(j==8) 

            j=0;

           }

     yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理   

      }

}

void yanshi() 

 {

  int x,y;

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

       for(y=50;y>0;y--) ;   // 如果将500改为0;将if(16==i) 改为8,将静态显示

 }

void zhongduan( ) interrupt 2

{   

     P1=0x00;   //P3.3口有低电平时亮

           yanshi();  //此处不能是while(1),否则不能跳出循环

}

定时器延时1秒,数码管加1右移003

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j,tt;

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

void main()

{

  TMOD=0x01;//设置定时器0为工作方式1

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;  //设置定时50毫秒

  EA=1;          //全局中断开

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

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

  P0=0x00;

  P2=0x00;

 while(1)

      {

        if(tt==4)  //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1

       {   

                 tt=0;

              P1=0xFF;   //让所有的灯灭

        P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全

         i=0;

        }

    P2=seg[j++];  //取位码

        {

         if(j==8) 

            j=0;

        }

   //  yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理   

    }

       }

}

/*void yanshi()   //定时器情况下,延时无用

 {

  int x,y;

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

       for(y=50;y>0;y--) ;   // 如果将500改为0;if(16==i) 改为8,将静态显示

 }   */

void zhongduan( ) interrupt 1

{   

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;  //设置定时50毫秒

    tt++;

}

灯闪一次,数码管加1右移一次

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j,tt;

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

void main()

{

  TMOD=0x01;//设置定时器0为工作方式1

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;  //设置定时50毫秒

  EA=1;          //全局中断开

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

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

  P0=0x00;

  P2=0x00;

 while(1)

      {

        if(tt==20)  //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1

       {   

               tt=0;

               P1=0x00;

                 

              

        P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全

         i=0;

        }

    P2=seg[j++];  //取位码

        {

         if(j==8) 

            j=0;

        }

    }   

       }

}

void zhongduan( ) interrupt 1

{   

    P1=0xff;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;  //设置定时50毫秒

    tt++; 

}

P1输出1秒的方波,即灯亮一秒灭一秒 

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j,tt;

 

void main()

{

  TMOD=0x01;//设置定时器0为工作方式1

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;  //设置定时50毫秒

  EA=1;          //全局中断开

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

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

  P1=0xff;

     while(1)

     {

       if(tt==20)

          {

            tt=0;

            P1=~P1;

          }

     }

}

void zhongduan( ) interrupt 1

{   

     

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;  //设置定时50毫秒

     tt++;

}

数码管偶数时灯亮,奇数时灯灭

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

void yanshi();

unsigned char i,j,tt;

unsigned char code dofly[]={

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

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

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

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

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

void main()

{

  TMOD=0x01;//设置定时器0为工作方式1

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;  //设置定时50毫秒

  EA=1;          //全局中断开

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

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

  P0=0x00;

  P2=0x00;

 while(1)

      {

        if(tt==20)  //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1

       {   

           tt=0;

           P1=~P1;

        P0=dofly[i++];//取显示数据,段码

        {

         if(16==i)    //检测8位扫描完全

         i=0;

        }

    P2=seg[j++];  //取位码

        {

         if(j==8) 

            j=0;

        }

    }   

       }

}

void zhongduan( ) interrupt 1

{   

    

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;  //设置定时50毫秒

    tt++; 

键盘防抖

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char

#define uint  unsigned 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};

unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

sbit d1=P1^0;

sbit k1=P3^4;

uchar num;

void delay(uint);

void main()

 {

    P2=0x01;

    P3=0xff;

      while(1)

    {

      if(k1==0)

                {

                delay(10);

                  if(k1==0)

                   {

                 d1=0;

                 num++;

                   if(num==10)   num=0;

                   }

                     while(!k1);

                     delay(10); 

                     while(!k1);

                 }

             else  d1=1;

              P0=table[num];

 }

 }

void delay(uint z)

{

uint x,y;

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

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

独立键盘显示数字   

 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

 #define uchar unsigned char

#define uint  unsigned int

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

                    0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

 uchar keyscan(void);//键盘扫描

void delay(uint i); //演示程序

 void main()

 uchar key;

 P0=0x00; 

             P2=0x01;        //1数码管亮 按相应的按键,会显示按键上的字符

 while(1)

{

 key=keyscan();  //调用键盘扫描,

 switch(key)

 {

  case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值

  case 0x7d:P0=dofly[1];break;//1

  case 0x7b:P0=dofly[2];break;//2

  case 0x77:P0=dofly[3];break;//3

  case 0xbe:P0=dofly[4];break;//4

  case 0xbd:P0=dofly[5];break;//5

  case 0xbb:P0=dofly[6];break;//6

  case 0xb7:P0=dofly[7];break;//7

  case 0xde:P0=dofly[8];break;//8

  case 0xdd:P0=dofly[9];break;//9

  case 0xdb:P0=dofly[10];break;//a

  case 0xd7:P0=dofly[11];break;//b

  case 0xee:P0=dofly[12];break;//c

  case 0xed:P0=dofly[13];break;//d

  case 0xeb:P0=dofly[14];break;//e

  case 0xe7:P0=dofly[15];break;//f

 }

 }

}

 uchar keyscan(void)  //键盘扫描函数,使用行列反转扫描法

{

 uchar cord_h,cord_l;//行列值中间变量

 P3=0x0f;            //行线输出全为0

 cord_h=P3&0x0f;     //读入列线值

 if(cord_h!=0x0f)    //先检测有无按键按下

 {

  delay(100);        //去抖

  if(cord_h!=0x0f)

  {

    cord_h=P3&0x0f;  //读入列线值

    P3=cord_h|0xf0;  //输出当前列线值

    cord_l=P3&0xf0;  //读入行线值

    return(cord_h+cord_l);//键盘最后组合码值

   }

  }

      return(0xff);     //返回该值

}

void delay(uint i)  //延时函数

{

    while(i--);

}

独立键盘显示数字   

/*-----------------------------------------------

  名称:矩阵键盘

  日期:2009.5

  修改:无

  内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据

------------------------------------------------*/

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char

#define uint  unsigned int

 unsigned char code  seg[]={0,1,2,3,4,5,6,7};   

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

                    0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

/*------------------------------------------------

                   函数声明

------------------------------------------------*/ 

uchar keyscan(void);//键盘扫描

void delay(uint i); //演示程序

/*------------------------------------------------

                   主函数

------------------------------------------------*/

void main()

{

  uchar key;

  uint j;

  P0=0x00;

 

 while(1)

{

 key=keyscan();  //调用键盘扫描,

 switch(key)

 {

  case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值

  case 0xbe:P0=dofly[1];break;//1

  case 0xde:P0=dofly[2];break;//2

  case 0xee:P0=dofly[3];break;//3

  case 0x7d:P0=dofly[4];break;//4

  case 0xbd:P0=dofly[5];break;//5

  case 0xdd:P0=dofly[6];break;//6

  case 0xed:P0=dofly[7];break;//7

  case 0x7b:P0=dofly[8];break;//8

  case 0xbb:P0=dofly[9];break;//9

  case 0xdb:P0=dofly[10];break;//a

  case 0xeb:P0=dofly[11];break;//b

  case 0x77:P0=dofly[12];break;//c

  case 0xb7:P0=dofly[13];break;//d

  case 0xd7:P0=dofly[14];break;//e

  case 0xe7:P0=dofly[15];break;//f    

 }  

             P2=seg[j++]; 

                 {

         if(j==8) 

            j=0;

        }

       delay(100);

        }

}

/*------------------------------------------------

              键盘扫描程序

------------------------------------------------*/

uchar keyscan(void)  //键盘扫描函数,使用行列反转扫描法

{

 uchar cord_h,cord_l;//行列值中间变量

 P3=0xf0;            //行线输出全为0

 cord_h=P3&0xf0;     //读入列线值

 if(cord_h!=0x0f)    //先检测有无按键按下

 {

  delay(100);        //去抖

  if(cord_h!=0x0f)

  {

    cord_h=P3&0xf0;  //读入列线值

    P3=cord_h|0x0f;  //输出当前列线值

    cord_l=P3&0x0f;  //读入行线值

    return(cord_h+cord_l);//键盘最后组合码值

   }

  }

  //  return(0x00);     //返回该值

}

/*------------------------------------------------

                 延时程序

------------------------------------------------*/

void delay(uint i)  //延时函数

{

while(i--);

}

矩阵键盘,按一次灯闪一次004

/*-----------------------------------------------

  名称:矩阵键盘

  日期:2009.5

  修改:无

  内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据

------------------------------------------------*/

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char

#define uint  unsigned int

 unsigned char code  seg[]={0,1,2,3,4,5,6,7};   

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

                    0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

/*------------------------------------------------

                   函数声明

------------------------------------------------*/ 

uchar keyscan(void);//键盘扫描

void delay(uint i); //演示程序

/*------------------------------------------------

                   主函数

------------------------------------------------*/

void main()

{

  uchar key;

  uint j;

  P0=0x00;

    P1=0xff;

 while(1)

{

 key=keyscan();  //调用键盘扫描,

{

 switch(key)

 {

  case 0x7e:P0=dofly[0],P1=0x00;;break;//0 按下相应的键显示相对应的码值

  case 0xbe:P0=dofly[1],P1=0x00;break;//1

  case 0xde:P0=dofly[2],P1=0x00;break;//2

  case 0xee:P0=dofly[3],P1=0x00;break;//3

  case 0x7d:P0=dofly[4],P1=0x00;break;//4

  case 0xbd:P0=dofly[5],P1=0x00;break;//5

  case 0xdd:P0=dofly[6],P1=0x00;break;//6

  case 0xed:P0=dofly[7],P1=0x00;break;//7

  case 0x7b:P0=dofly[8],P1=0x00;break;//8

  case 0xbb:P0=dofly[9],P1=0x00;break;//9

  case 0xdb:P0=dofly[10],P1=0x00;break;//a

  case 0xeb:P0=dofly[11],P1=0x00;break;//b

  case 0x77:P0=dofly[12],P1=0x00;break;//c

  case 0xb7:P0=dofly[13],P1=0x00;break;//d

  case 0xd7:P0=dofly[14],P1=0x00;break;//e

  case 0xe7:P0=dofly[15],P1=0x00;break;//f    

 }  

             P2=seg[j++]; 

                 {

         if(j==8) 

            j=0;

     }

       delay(100);

   

   }

        }

}

/*------------------------------------------------

              键盘扫描程序

------------------------------------------------*/

uchar keyscan(void)  //键盘扫描函数,使用行列反转扫描法

{

 uchar cord_h,cord_l;//行列值中间变量

 P3=0xf0;            //行线输出全为0

 P1=0xff;   

 cord_h=P3&0xf0;     //读入列线值

 if(cord_h!=0x0f)    //先检测有无按键按下

 {

  delay(100);        //去抖

  if(cord_h!=0x0f)

  {

   

    cord_h=P3&0xf0;  //读入列线值

    P3=cord_h|0x0f;  //输出当前列线值

    cord_l=P3&0x0f;  //读入行线值

 

    return(cord_h+cord_l);//键盘最后组合码值

   }

  }

  //  return(0x00);     //返回该值

}

/*------------------------------------------------

                 延时程序

------------------------------------------------*/

void delay(uint i)  //延时函数

{

while(i--);

}

PWM调节发光二极管的亮度

/*-----------------------------------------------

  名称:PWM 调光

  日期:2009.5

  修改:无

  内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法

        2、硬件要求:LED灯 定时器

        3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象

------------------------------------------------*/

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED = P1^2;      //定义LED灯,通过LED显示调光效果

unsigned char CYCLE;  //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms

unsigned char PWM_ON ;//定义高电平时间

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

/*                    延时函数                                    */

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

void delay(unsigned int cnt)

{

 while(--cnt);

}

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

/*                    主函数                                      */

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

main()

{

bit Flag;

TMOD |=0x01;              //定时器设置 0.1ms in 12M crystal

TH0=(65536-100)/256; 

TL0=(65536-100)%256;      //定时0.1mS 

IE= 0x82;                 //打开中断

TR0=1;

CYCLE = 10;               // 时间可以调整 这个是10调整 8PWM就是256

while(!Flag)

  {

   delay(20000);          //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果

   PWM_ON++;              //这个使用较长延时,以便能看清楚变化过程

   if(PWM_ON == CYCLE)

     {                    //这个里可以添加其他程序 如到最亮时候控制设备

      Flag=1;

  }

  }

 while(Flag)              //亮度递减 同上,是个相反的过程

  {

   delay(20000);

   PWM_ON--;

   if(PWM_ON == 0)

     {

      Flag=0;

  }

  }

}

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

/*                    定时器中断函数                              */

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

void tim(void) interrupt 1 using 1

{

static unsigned char count; 

TH0=(65536-100)/256; 

TL0=(65536-100)%256;     //定时0.1mS 

if (count==PWM_ON)

    {

     LED = 1;            //灯灭 

    }

  count++;

if(count == CYCLE)

    {

    count=0;

if(PWM_ON!=0)        //如果左右时间是保持原来状态

   LED = 0;          //灯亮

    }

}

八位数计数器

#include<reg52.h>    

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

          //共阴数码管 0-9 

unsigned char  ge ; //定义个位

unsigned char  shi ;//定义十位

unsigned char  bai ;

unsigned char  qian ;

unsigned char  wan ;

unsigned char  shiwan ;

unsigned char  baiwan ; 

unsigned char  qianwan ;

void delay(unsigned int cnt)

{

 while(--cnt);

}

 

void main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式116位定时

TH0=(65535-1000)/256;

TL0=(65535-1000)%256;

IE= 0x82;  //打开中断

TR0=1;     //打开定时开关

while(1)

  {

  P0=ge; 

  P2=7;

  delay(30);   //短暂延时

 

  P0=shi; 

  P2=6;

  delay(30);   //短暂延时

  P0=bai; 

  P2=5;

  delay(30);

  P0=qian; 

  P2=4;

  delay(30);

  P0=wan; 

  P2=3;

  delay(30);   //短暂延时

 

  P0=shiwan; 

  P2=2;

  delay(30);   //短暂延时

  P0=baiwan; 

  P2=1;

  delay(30);

  P0=qianwan; 

  P2=0;

  delay(30);

  }

}

 

void tim(void) interrupt 1  

{

 unsigned long second,count;

TH0=(65535-1000)/256;

TL0=(65535-1000)%256;

  count++;             

if (count==5)       //100x10ms=1S,大致延时时间

    {

    count=0;

    second++;         //秒加1

if(second==100000000)

      second=0;

  ge=tab[second%10]; 

  shi=tab[second%1000000%1000000%100000%10000%1000%100/10];        

       bai=tab[second%1000000%1000000%100000%10000%1000/100] ;

       qian=tab[second%1000000%1000000%100000%10000/1000] ;

       wan=tab[second%1000000%1000000%100000/10000];

       shiwan=tab[second%1000000%1000000/100000];

   baiwan=tab[second%1000000/1000000];

   qianwan=tab[second/10000000];

        }

}

 四位数计数器

#include<reg52.h>    

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

          //共阴数码管 0-9 

unsigned char  ge ; //定义个位

unsigned char  shi ;//定义十位

unsigned char  bai ;

unsigned char  qian ;

unsigned char  wan ;

unsigned char  shiwan ;

unsigned char  baiwan ; 

unsigned char  qianwan ;

void delay(unsigned int cnt)

{

 while(--cnt);

}

 

void main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式116位定时

TH0=(65535-10000)/256;

TL0=(65535-10000)%256;

IE= 0x82;  //打开中断

TR0=1;     //打开定时开关

while(1)

  {

  P0=ge; 

  P2=3;

  delay(10);   //短暂延时

 

  P0=shi; 

  P2=2;

  delay(10);   //短暂延时

  P0=bai; 

  P2=1;

  delay(10);

  P0=qian; 

  P2=0;

  delay(10);

  }

}

 

void tim(void) interrupt 1  

{

 unsigned long second,count;

TH0=(65535-10000)/256;

TL0=(65535-10000)%256;

  count++;             

if (count==100)       //100x10ms=1S,大致延时时间

    {

    count=0;

    second++;         //秒加1

if(second==10000)

      second=0;

  ge=tab[second%10]; 

  shi=tab[second%1000%100/10];        

       bai=tab[second%1000/100] ;

       qian=tab[second/1000 ] ;

       

        

        }

}

9999倒计数

/*-----------------------------------------------

  名称:99秒倒计时器

  日期:2009.5

  修改:无

  内容:通过定时器倒计时

------------------------------------------------*/

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

          //共阴数码管 0-9 

unsigned char Dis_qainwei;

unsigned char Dis_baiwei;

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

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

/*                    延时函数                                    */

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

void delay(unsigned int cnt)

{

 while(--cnt);

}

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

/*                    主函数                                      */

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

main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式116位定时

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

IE= 0x82;  //打开中断

TR0=1;     //打开定时开关

while(1)

  {

  P0=Dis_qainwei; 

  P2=0;

  delay(300);    

  P0=Dis_baiwei; 

  P2=1;

  delay(300);    

  P0=Dis_Shiwei; 

  P2=2;    

  delay(300);    

  P0=Dis_Gewei;  

  P2=3;

  delay(300);

 

 

  }

}

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

/*                    定时器中断函数                              */

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

void tim(void) interrupt 1 using 1

{

 static unsigned long second=9999,count; //初值99  static相当重要,否则不能减数

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

 count++;

if (count==10)

    {

    count=0;

    second--;//秒减1

if(second==0)

  

   second=9999;  

   

Dis_qainwei=tab[second/1000] ;

Dis_baiwei=tab[second%1000/100] ;

Dis_Shiwei=tab[second%1000%100/10];//十位显示值处理

     Dis_Gewei=tab[second%10]; //个位显示处理

    

    }

}

数字时钟

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char

#define uint  unsigned int

static unsigned char count;

code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

         //共阴数码管 0-9

uchar smg[8];                 //定义缓冲区

uint minute=30,hour=12,second;  //定义并且初始化值 12:30:00

 

void delay(unsigned int cnt)

{

 while(--cnt);

}

 

void display( )

{

            smg[0]=tab[hour/10];    //显示小时

       smg[1]=tab[hour%10];

  smg[2]=0x40;            //显示"-"

            smg[3]=tab[minute/10];  //显示分钟

              smg[4]=tab[minute%10];

       smg[5]=0x40;            //显示"-"

                 smg[6]=tab[second/10];  //显示秒

  smg[7]=tab[second%10];

}

void main()

{

     uchar i;

     TMOD |=0x01;  //定时器0 10ms in 12M crystal 用于计时

TH0=0xd8;     //初值

TL0=0xf0;

ET0=1;

TR0=1;

     EA =1;     

  display();

  while(1)

  {   

for(i=0;i<8;i++) //显示时间

   {

      P0=smg[i];

 P2=i;

 delay(100);

   }

 

if (count==100)

    {

    count=0;

    second++; display();            //秒加1

if(second==60)

   {

   second=0;

   minute++;          //分加1

   if(minute==60)

  {

   minute=0;

   hour++;      //时加1

   if(hour==24)

      hour=0;

  }  

      

   }

    

   } 

 display();

   }

   

}

void timer() interrupt 1  

{

   

   TH0=0xd8;                  //重新赋值

   TL0=0xf0;

   count++;

}

交通灯        //经典啊

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include<math.h>  

#define uchar unsigned char

#define uint  unsigned int

#define ulang unsigned lang

static unsigned char count;

code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

         //共阴数码管 0-9

uchar smg[8];                 //定义缓冲区

uint  we,ns,h,j; 

 

   

int aaa(); 

int bbb();

int eee();

void delay(unsigned int cnt)

{

 while(--cnt);

}

 

void display( )

{

            smg[0]=tab[we/10];     

       smg[1]=tab[we%10];

  smg[2]=0x00;             

            smg[3]=0x00;   

             smg[4]=0x00;

       smg[5]=0x00;            

                 smg[6]=tab[ns/10];  

  smg[7]=tab[ns%10];

}

void main()

{

     uchar i;

     TMOD |=0x01;  //定时器0 10ms in 12M crystal 用于计时

TH0=0xd8;     //初值

TL0=0xf0;

ET0=1;

TR0=1;

     EA =1;     

  display();

  while(1)

  {

    

for(i=0;i<8;i++)    //显示函数

   {

      P0=smg[i];

 P2=i;

 delay(100);

   }

           ccc();

display( );

       } 

 

}

void timer() interrupt 1  

{

   

   TH0=0xd8;                  //重新赋值

   TL0=0xf0;

   count++;

}

int aaa()

{

          if(j<25)

      {

      if(j==1) { we=30,ns=25; }

 ns--;

      we--;

      P1=0xde;

 return 0; } 

 

    if(25<=j<30)

  {       

      if(j==26)  {  ns=5; } 

     P1=0xee;    

ns--; 

we--;  

return 0;   }

}

int bbb()

{

            if(h<25)

      {

      if(h==1) { we=25,ns=30; }

 ns--;

      we--;

       P1=0xf3;

 return 0; } 

 

    if(25<=h<30)

  {       

      if(h==26)  {  we=5; } 

     P1=0xf5;    

ns--; 

we--;  

return 0;   }

 

     

 }

 int eee()

 {

 j=0;

 h=0;

 return 0;

 }

 int ccc()

 {

     

  if (count==100)

    {

            count=0;

    j++;

 if ( (j>30)&&(j!=61))  { h++;      bbb(); return 0;   }

    if(j==61)  { eee(); return 0;}

               aaa();      return 0;   

   } 

 }

 1602可调时分秒

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char

#define uint  unsigned int

static  uchar count,j,s1num;

  char shi,fen,miao;

sbit RS = P2^4; //Pin4

sbit RW = P2^5; //Pin5

sbit E  = P2^6; //Pin6

sbit s1=P3^0;   //矩阵键盘分离出独立键盘

sbit s2=P3^1;

sbit s3=P3^2;

sbit rd=P3^7;

uchar code table1[]=" 2013-7-30  MON ";

uchar code table2[]="    00:00:00    ";

 

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

/*                    延时函数                               */

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

void delay(uint z)

{

   uint x,y;

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

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

}

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

/*                   写入命令函数                                 */

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

void WriteCommand(unsigned char c)

{

 delay(5);//操作前短暂延时,保证信号稳定

 E=0;

 RS=0;

 RW=0;

 delay(5);

 E=1;

 P0=c;

 E=0;

}

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

/*                   写入数据函数                                 */

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

void WriteData(unsigned char c)

{

 delay(5);  //操作前短暂延时,保证信号稳定

 E=0;

 RS=1;

 RW=0;

 delay(5);

 E=1;

 P0=c;

 E=0;

 RS=0;

}

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

/*                   初始化函数                                   */

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

void InitLcd()

{

 //delay(15);

 WriteCommand(0x38); //display mode

 WriteCommand(0x38); //display mode

 WriteCommand(0x38); //display mode

 WriteCommand(0x06); //显示光标移动位置

 WriteCommand(0x0c); //显示开及光标设置

 WriteCommand(0x01); //显示清屏

    // fen=59;   //测试用

   //  miao=53;

    // shi=23;

   delay(15);

   WriteCommand(0x80); //显示第一行

for(j=0;j<16;j++)

{

 WriteData(table1[j]);

   delay(5);

}    

   WriteCommand(0x80+0x40);     //显示第二行

for(j=0;j<16;j++)   

{

 WriteData(table2[j]);      

   delay(5);

}

}

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

/*                   时分秒显示                                   */

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

void writesfm(uchar add,uchar date)

{

    uchar shi,ge;

    shi=date/10;

    ge=date%10;

    WriteCommand(0x80+0x40+add);

    WriteData(0x30+shi);

    WriteData(0x30+ge);

}

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

/*                   键盘功能函数                                 */

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

void keysan()

{

rd=0;

if(s1==0)

  {

   delay(5);

     if(s1==0)

  {

  s1num++;

  while(!s1);

  if(s1num==1)

  {

    TR0=0;

    WriteCommand(0x80+0x40+10);

    WriteCommand(0x0f); //显示光标

  }

       }   

       if(s1num==2)

  {    

    WriteCommand(0x80+0x40+7);

  } 

  if(s1num==3)

  {    

    WriteCommand(0x80+0x40+4);

  }

  if(s1num==4)

  {

    s1num=0;    

    WriteCommand(0x0c); //光标不闪烁

    TR0=1;

  }

       }

    if(s1num!=0)    //s1抬起时完成加减操作

 {

   if(s2==0)

  {

    delay(5);

    if(s2==0)

      {

   while(!s2); 

   if(s1num==1)

   {

    miao++;

 if(miao==60)

     miao=0;

 writesfm(10,miao);

 WriteCommand(0x80+0x40+10); 

   }

   if(s1num==2)

   {

       fen++;

  if(fen==60)

     fen=0;

       writesfm(7,fen);

  WriteCommand(0x80+0x40+7);   

   }

   if(s1num==3)

   {

       shi++;

  if(shi==24)

    shi=0;

  writesfm(4,shi);

  WriteCommand(0x80+0x40+4);   

   }

 }

  }

   if(s3==0)

   {

   delay(5);

  if(s3==0)

  {

    while(!s3);

    if(s1num==1)

    {     

miao--;

if(miao==-1)

     miao=59;

writesfm(10,miao);

     WriteCommand(0x80+0x40+10);

    }

    if(s1num==2)

    {

     fen--;

if(fen==-1) 

      fen=59;

   writesfm(7,fen);

     WriteCommand(0x80+0x40+7); 

    }

    if(s1num==3)

    {

     shi--;

if(shi==-1) 

      shi=23;

   writesfm(4,shi);

     WriteCommand(0x80+0x40+4);

    }  

  }

   }    

 }

 

}   

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

/*                   主函数                                       */

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

void main(void)

{

     TMOD=0x01;  //定时器0 10ms in 12M crystal 用于计时

TH0=(65536-50000)/256;     //初值

TL0=(65536-50000)%256;

ET0=1;

TR0=1;

     EA =1;    

     InitLcd();         //初始化LCD,送初值

     while(1)

  {

  keysan();

if(count==10) 

{

  count=0;

  miao++;

    if(miao==60)

    {

     miao=0;

     fen++;

       if(fen==60)

  {

   fen=0;

   shi++;

    if(shi==24)

       {

   shi=0;

  }

  writesfm(4,shi) ;

  }

  writesfm(7,fen) ;

    }

 writesfm(10,miao) ;

}

    }

}

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

{

  TH0=(65536-50000)/256;     //初值

  TL0=(65536-50000)%256;

  count++;

}

 

 

你可能感兴趣的:(51单片机程序参考大全)