閱讀187 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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) ;

}

    

最後更新:2017-04-03 19:06:48

  上一篇:go 愛上多線程——重複初始化問題
  下一篇:go 2KB內存單片機上實現彩屏GUI控件庫