51单片机程序参考大全

本文档提供了一系列51单片机程序示例,包括流水灯控制、数码管显示、定时器延时、键盘输入处理以及1602液晶显示屏的时分秒显示等功能。通过这些实例,读者可以深入理解51单片机的基本操作和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让流水灯来回流一次,蜂鸣器响一次 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值