注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

碧空雄鹰的博客

人和人相遇,靠的是一种缘;人和人相处,靠的是一份诚;人和人相爱,靠的是一份真

 
 
 

日志

 
 
关于我

人生有三样东西是无法隐瞒的:咳嗽、贫穷和爱,你想隐瞒,却欲盖弥彰。 人生有三样东西是不该挥霍的:身体、金钱和爱,你想挥霍,却得不偿失。 人生有三样东西是无法挽留的:生命、时间和爱,你想挽留,却渐行渐远。 人生五靠: 命运不是靠时间,而是靠勤奋,时间不是靠虚度,而是靠使用,感情不是靠缘分,而是靠珍惜,金钱不是靠使用,而是靠投资,事业不是靠满足,而是靠踏实。 人生三大遗憾 : 不会选择,不坚持选择,不断地选择。

网易考拉推荐

51单片机程序1(转)  

2009-08-01 09:41:41|  分类: S51 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、I/O口基本应用

0、/数码管静态显示

 

#include"at89x52.h"//头文件

unsigned char  data  code  a[]={0x3f,0x06,0x5b,0x4f,0x66 ,0x6d ,

0x7d ,0x07 ,0x7f ,0x6f ,0x77 ,0x7c};//数组a[]放数码管的段码

    void delay(void)      //延时函数

     {  unsigned int i;

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

     }

 

    void  main  void ()             //主函数

    {

    unsigned  char i,k;//定义变量

    for(i=0;i<3;i++) //循环

        {

         k=i*3;

         P0=a[k+1]; //把段码a[1],a[4],a[7]分别送到p0口显示

         P2=a[k+2]; //把段码a[2],a[5],a[8]分别送到p2口显示

         P3=a[k+3]; //把段码a[3],a[6],a[9]分别送到p3口显示

       delay();    //延时

        }

1、//单个数码管显示及二极管闪烁 C程序 

#include"at89x52.h"

sbit m=P2^7;

void delay(void)                                          //延时程序

     {  unsigned int data i;

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

     }

void  main(void)

  {  unsigned  char data  i;

     unsigned  char data a[ ]={0x3f,0x06,0x5b,0x4f,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f ,0x77 ,0x7c};

//共阴数码管段码0-9,a,b

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

      {

      P0=a[i]; //P0口输出0-9

      m=!m;   

      delay(); //延时

      }

}

 

汇编程序

    ORG 0000H                 //程序存储器起始存放地址

    AJMP MAIN

MAIN:   MOV R0,#0               //寄存器R0置0

MAIN1:  MOV DPTR,#TAB        //把TAB常数表的数据传送给DPTR(16位操作数)

        MOV A,R0

        MOVC A,@A+DPTR      //把DPTR中的第A个数据传送给累加器A

        MOV P0,A

        CPL P2.7                //位取反

        INC R0      //RO加1

        CJNE R0,#10,MAIN2      //如果R0不等于10,程序转到MAIN2

        MOV R0,#0

MAIN2:  LCALL DELAY

        AJMP MAIN1

 

DELAY:  MOV R1,#250             //延时子程序

DE1:    MOV R2,#255

        NOP

        NOP

        NOP

DE2:    DJNZ R2,DE2

        DJNZ R1,DE1

        RET

 

TAB:    DB 3fH,06H,5bH,4fH,66H ,6dH ,7dH ,07H ,7fH ,6fH //数码管段码常数表

 

        END

 

PROTEUS仿真图

2、//程序功能:行列式按键显示

    #include"reg52.h"

    unsigned char data code  a[]={0x3f,0x06,0x5b,0x4f,0x66 ,0x6d ,0x7d ,         0x07 ,0x7f ,0x6f ,0xbf,0x86,0xdb,0xcf,0xe6 ,0xed };//共阴数码管段码

    unsigned char data code  tv[]={0xfe,0xfd,0xfb,0xf7};        //数码管位选择

    unsigned  char data led[4];

    sbit key1=P3^1;                             //位定义

    sbit key2=P3^5;

    unsigned  char data tvdata;                     //定义变量

    void delay(void)                                //延时子程序                   

     {

        unsigned int i;

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

     }

 

 void  ledxianshi(void)                         //显示子程序

   {

        unsigned char k,i;

        led[0]=tvdata/100;                 //取百位

        led[1]=tvdata%100/10;              //取十位

        led[2]=tvdata%10;                  //取个位

        led[3]=0xff;

       

        for(k=0;k<4;k++)                   //动态扫描显示

         {

           i=led[k];                        //依次取百,十,个位

           P0=a[i];                     //P0口依次输出百,十,个位

           P2=tv[k];                        //P2口依次选项通数码管

           delay();                     //延时,防止数码管闪烁

         }

     }

    void  main(void)                        //主程序:产生按键的键值

    {

       while(1)

        { unsigned char k,i;

          P1=0xff;

          P1=0x0f;

          k=P1;

          P1=0xff;

          P1=0xf0;

          i=P1;

          tvdata=i+k;                    // tvdata=i|k先相同;

          ledxianshi();                 //调用显示子程序

        }

     }

   

3 、程序功能:按键显示(方法不同)

#include"reg52.h"//头文件

unsigned  char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed };//数组用来放段码

  unsigned  char data led[4];//定义一个数组

  unsigned  char data tvdata;

   

    void delay(void)//延时函数

    {unsigned int i;

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

     }

 

 

   ledxianshi()              //显示函数

   {

        unsigned char k,i,j; //定义变量

        led[0]=(tvdata&0xf0)>>4;//数据右移四位放到数组LED[0]中

        led[1]=tvdata&0x0f;     //数据低四位放到数组LED[1]中

        j=0xfe;

        for(k=0;k<4;k++)

         {

           i=led[k];      //把显示数组的值给I

           P0=a[i];       //把a[i]对应的段码给p0

           P2=j;         //p2初始状态为11111110

           j<<=1;       //准备下支LED显示(j左移一位得:11111100)

           j|= 0x01;       //j=11111101

           delay();        //延时

         }

    }

   

 

    main()      //主函数

    {

       while(1)//循环

        { unsigned char k,i;//定义变量

 

          P1=0xff;//

          P1=0x0f;

          k=P1;

                     

          P1=0xff;

          P1=0xf0;

          i=P1;

          tvdata=i+k;

 

            if(tvdata==0xd7)tvdata=0;     //如果键值为0xd7,那么数码管显示数字0

            if(tvdata==0xdb)tvdata=2;     //如果键值为0xdb,那么数码管显示数字2

            if(tvdata==0xdd)tvdata=5;     //如果键值为0xdd,那么数码管显示数字5

            if(tvdata==0xde)tvdata=8;     //如果键值为0xde,那么数码管显示数字8

 

                    

          switch(tvdata)                  //对数据tvdata进行转换

             {case 0xeb:tvdata=1;break;   //如果键值为0xeb,那么数码管显示数字1

              case 0xed:tvdata=4;break;   //如果键值为0xed,那么数码管显示数字4

              case 0xee:tvdata=7;break;   //如果键值为0xee,那么数码管显示数字7

              case 0x77:tvdata=0x11;break;//如果键值为0x77,那么数码管显示数字11

              case 0x7b:tvdata=0x22;break;//如果键值为0x7b,那么数码管显示数字22

              case 0x7d:tvdata=0x33;break;//如果键值为0x7d,那么数码管显示数字33

              case 0x7e:tvdata=0x44;break;//如果键值为0x7e,那么数码管显示数字44

              default: ;

             }

          ledxianshi();//显示

        }

     }

4、//程序功能:I/O扩展

#include<AT89X51.h>     //头文件

void delay(void)        //延时程序

     {

    unsigned int i;

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

      }

main()

{

unsigned int ina,inb;       //定义变量ina,inb

while(1)

   {P1_0=0;             //数据ina输入P1口

    delay();

    ina=P0;

    P1_0=1;

  

    P1_1=0;             //数据inb输入P1口

    delay();

    inb=P0;

    P1_1=1;

   

    P2=inb;             //数据inb从P2口输出

    P3_0=0;

P3_0=1;

 

P2=inb;             //数据ina从P2口输出

    P3_1=0;

P3_1=1;

}

 

第5章  定时定时

1、图1  来源于程序 dsjs1  完成功能:每按下按键6次,波形跳变一次。

程序如下:

#include"at89x52.h"  // 头文件

    #define uchar unsigned char //  简写

    #define uint  unsigned int  //  同上

    sbit m=P1^0; //  定义P1_0为变量m

       void main()  //主函数

       { 

        TMOD=0X06; //T0为计数,方式2(可自动重装载)

        TR0=1;  //开定时定时T0

        TH0=-6;  //置初值

        TL0=-6;  //置初值

       while(1) //   死循环

          {while(TF0==0); //定时没有到,TF0==0则等待

          TF0=0;      // TF0==1 清零

          m=!m;   //取反

          }

 

 

 

2、图2  来源于程序 dsjs2  完成功能:利用定时器输出5ms高电平12m低电平方

程序如下:

#include"at89x52.h"

    #define uchar unsigned char

    #define uint  unsigned int

    sbit m=P1^0;

  void main()

    {

         TMOD=0X10;       // T1为定时,方式1(不能自动重装载)

         TR1=1;             //开定时T1

         m=1;               //初值为高电平,可以不写

        while(1)             //死循环

      {   TH1=(-5000)>>8;    //16位定时器设置初值5ms

          TL1=-5000;

          while(TF1==0);     //定时没有到,TF1==0则等待

        { TF1=0;            //定时到,TF1==1清零

          m=0;             //输出低电平

          TH1=(-12000)>>8;  //T1设置初值12ms

          TL1=-12000;

          while(TF1==0);    //定时没有到,则等待

            {TF1=0;m=1;}   //清零,同时输出高电平

         }

      }

   }     

 

3、图3 来源于程序 dsjs  完成功能:每按下一次键,定时定时每20ms输出一个方波,记一次数,送数码管显示 并使LED闪烁

程序如下:

#include"at89x52.h"//头文件

    #define uchar unsigned char

    #define uint  unsigned int

    sbit m=P1^0;

    sbit key=P3^4;  //定义按键

    uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};  //数码管片选

    uchar code  a[]={0x3f,0x06,0x5b,0x4f,       //数码管断选

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

                 0x6f,0x00,0x7c};

    uchar data  led[];   //显示缓冲(这个地方最好改成4,不然程序执行出问题)

    uchar data  tvdata;   //全局变量

 

    void delay(void)   //延时函数

       {

        uint i;

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

       }

    ledxianshi()   //显示函数,也就是数码管驱动

       {

          uchar k,i;

          led[0]=tvdata/100;  //取百位显示

          led[1]=tvdata%100/10;  //取十位显示        

        led[2]=tvdata%10; //取个位显示         

led[3]=10;   //定义的固定显示,可以修改

        for(k=0;k<4;k++)

         {

           i=led[k];

           P0=a[i];  //送段码

           P2=tv[k];  //送位选

           delay();

         }

       

       }

    void main()   //主函数

     {   uchar data l;

         while(1)  //死循环

       {

         TMOD=0X01; //定时器T0工作在方式1

         TR0=1;  //启用定时定时T0

         if(key= =0)  //如果按键按下,就执行下面的程序

         {

             TH0=(-2000)>>8;  //16位定时器设置处值

             TL0=-2000;

               do{ledxianshi();}  //当TF0=0,调用显示

               while(TF0= =0);  

           TF0=0;  //中断清零

           l=l+1;  //计数

           if(l= =10)  //计数次数10次

           {

            m=!m;    //取反

            l=0;      //I清零

            tvdata=tvdata+1;  //显示数加一

           }

         }

       }

     }

4、图4 来源于程序 dsjsbx  完成功能:.定时器工作在工作在方式2,输出30us方波,并使LED闪烁

程序如下:

#include"at89x52.h"

    #define uchar unsigned char

    #define uint  unsigned int

    sbit m=P1^0;

    void main()                //主函数

         {  uchar data l;

            TMOD=0X02;     //定时器T0工作在方式2

            TR0=1;           //启用定时定时T0

            TH0=-30;          //置初值

            TL0=-30;

         while(1)              //死循环

            {while(TF0= =0);   //定时没有到,TF0= =0则等待

             TF0=0;          // TF0= =0,TF0清零

             l=l+1;           //计数

             if(l==10)         //计数次数10次

               {m=!m;l=0;}    //m取反,I清零

             }

          }

5、图5 来源于程序:测频gate  完成功能:利用查询的方法实现测方波频率,并送数码管显示。

程序如下:

#include"at89x52.h"

    #define uchar unsigned char

    #define uint  unsigned int

    uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};

    uchar code  a[]={0x3f,0x06,0x5b,0x4f,

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

                     0x6f,0x77,0x7c};

    uchar data  led[4];

    uint data f;        //定义变量

    void delay(void)   //延时函数

     {

    uint i;

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

     }

      ledxianshi()    //显示函数

        {

          uchar k,i;

          led[0]=f/1000; //得到千位

          led[1]=f%1000/100; //得到百位

          led[2]=f%100/10; //得到十位

          led[3]=f%10; //得到个位

for(k=0;k<4;k++)

         { i=led[k];

           P0=a[i];

           P2=tv[k];

           delay();

         }

     }

    void main()      //主函数

         {

         TMOD=0x50;  //使T1工作在计数方式

         TH1=0;       //初值为零,用于计数

         TL1=0;

         while(1)

         {while(P3_3= =1);  //等待一个高电平

          while(P3_3= =0);  //等待一个低电平(这样做的好处是 在定时开始时,电平高低未知,这样会使精度更高,尤其对低频信号来说)

          TR1=1;  //启用定时定时器T1

          while(P3_3= =1);  //等待一个高电平

          while(P3_3= =0);  //等待一个低电平

          TR1=0;  //定时定时T1清零

          f=(TH1<<8)+TL1;  //计数值付给变量f

          f=f;

          while(1)          //死循环,这样可以不停的显示刚测出的方波频率

          {ledxianshi();}//调用显示程序

         }

     }

 

 

6、图6 来源于程序:测宽度  完成功能:测一个方波的完整周期的时间,并送数码管显示

程序如下:

#include"at89x52.h"   //头文件

    #define uchar unsigned char

    #define uint  unsigned int

    sbit m=P1^0;   //定义P1_0为变量m

    sbit key=P3^4; //  定义按键

    uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};   //片选

    uchar code  a[]={0x3f,0x06,0x5b,0x4f,    //段选

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

                     0x6f,0x77,0x7c};

    uchar data  led[4];

    uchar data  tvdata;

 

   

    void delay(void)    //延时函数

     {

    uint i;

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

     }

 

 

      ledxianshi()    //显示函数,即数码管驱动

        {

      uchar k,i;

      led[0]=tvdata/100;       //取百位显示

      led[1]=tvdata%100/10;   //取十位显示

      led[2]=tvdata%10;       //取个位显示

      led[3]=10;             //定义的固定显示0,可以修改,这里为0

       

        for(k=0;k<4;k++)

         {

           i=led[k];

           P0=a[i];

           P2=tv[k];

           delay();

         }

     }

 

    void main()

         {  TMOD=0X09;   //使T0工作在定时方式,用方式1

 

            TH0=0;              //寄存器高位清零

            TL0=0;              //寄存器低位清零

 

          while(1)

         {while(P3_2= =0);(老师程序中没有这句,我觉得加上这句才要好些)

while(P3_2= =1);

          TR0=1;          //开启定时定时T0

          while(P3_2= =0);  //等待一个低电平

          while(P3_2= =1);  //等待一个高电平

 

          TR0=0;          //定时定时器T0 清零

          tvdata=TL0;      //把记录的值送变量

          TH0=0;          //寄存器器清零

          TL0=0;           //寄存器器清零

          ledxianshi();        //调用显示程序

         }

     }

 

7、图7 来源于程序:dsjsbxh  完成功能:每按下按键6次,波形跳变一次。51单片机程序1(转) - 碧空雄鹰 - 碧空雄鹰的博客

程序如下:

    #include"at89x52.h"

    #define uchar unsigned char

    #define uint  unsigned int

    sbit m=P1^0;

       

 

    void main()

      {                                                               ____

      TMOD=0X0e;   // T0为计数,方式2,同时把GATE信号置1,这样只使INT0有用

        TR0=1;   //开定时定时T0

        TH0=-6;  //置初值

        TL0=-6;  //置初值

       

         while(1)  //死循环

         {while(TF0==0);  //定时没有到,则等待

          TF0=0;  //清零

          m=!m;    //取反

          

          }

     

       }

图8 来源于程序:波形产生2  完成功能:在P1.0引脚上输出一个高电平为200us低电平为1000ms的脉冲波形(即周期为1200ms

程序如下:

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

//用定时计数器0 工作在方式1 在P1.0引脚上输出一个高电平为200us低电平为//

//800us的脉冲波形(即周期为1000us),单片机采用12M晶体     //

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

#include <at89x52.h>

unsigned int data i=0;   //定义一个全局I型变量

void Timer0Interrupt( void ) interrupt 1     //设置中断。中断号为1

{  

    i++;                     //i=i+1 循环

    if(i= =1){P1_0=0;}         //200us

    if(i= =5){P1_0=1;i=0;}     /800us,/改变5调占空比////这些值不一定是题中要求的值,请大家自己替换

}

void Timer0Init( void )     //设置一个Timer01Init初始化的子函数

{   TMOD=(TMOD & 0xf0) | 0x02; //初始化,定时器T0,工作方式2 与INT0无关定时器模式//这里大家要弄明白高位不变 低位置2的方法

    P1_0=0;             //把电平拉成低电平

    TL0 = -200;         //定时1ms  单片机采用12M晶振

    TH0=-200;

    TR0 = 1;               //允许T0开始计数

    ET0=1;             //允许T0中断

    EA=1;              //中断总允许位,这里CPU开放中断

}

void main( void )        //主函数

{

 Timer0Init();                 //time0初始化

 while(1);                   //死循环

 }                       ////等待硬件定时 到 并输出波形

 

 

9、图9 来源于程序:波形产生3(双定时双输出)  完成功能:赑1.0引脚上输出一个高电平为86ms低电平为138ms的脉冲波形(即周期为224ms),在P2.0引脚上输出一个低电平为600us高电平为800us的脉冲波形(即周期为1400us)

程序如下:

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

//用定时计数器0 工作在方式1 在P1.0引脚上输出一个高电平为86ms低电平为//

//138ms的脉冲波形(即周期为224ms),在P2.0引脚上输出一个低电平为600us高电平为//

//800us的脉冲波形(即周期为1400us),单片机采用12M晶体     //

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

#include <at89x52.h>

unsigned int data i=0;k=0; //定义两个全局I型变量

 

void Timer0Interrupt( void ) interrupt 1    //设置中断。中断号为1

{  

    i++;

    if(i= =860){P1_0=0;}

    if(i= =1380){P1_0=1;i=0;}          //改变860,1380调占空比

}

void Timer1Interrupt( void ) interrupt 3     //设置中断。T1中断号为3

{  

    k++;

    if(k= =6){P2_0=1;}            //把电平拉高,即输出一个高电平

    if(k= =14){P2_0=0;k=0;}      //改变k(6,14)调占空比  //这些值不一定是题中要求的值,请大家自己替换

 

  

}

void Timer01Init( void )            //设置一个T0\T1初始化的子函数

{   TMOD=0x22; //初始化,定时器T0T1,工作方式2 与INT0\NT1无关 定时器模式

    P1_0=0;                        //把电平拉成低电平

    TL0 = -200;                   //定时100us时标,  单片机采用24M晶体

    TH0=-200;

    TL1 = -200;                   //定时100us时标,  单片机采用24M晶体

    TH1=-200;

    TCON =0x50;                   //允许T0  T1开始计数

    IE=0x8a;                      //允许T0\T1中断

    IP=0X80;                    

  }

void main( void )             //主函数

{

 P1_0=1;                     //p1.0输出一个高电平

 P2_0=0;                     //p2.0输出一个低电平

 Timer01Init();                 //time0time1初始化

 while(1);  

 }                           ////等待硬件定时 到 并输出波形

 

 

10、图10 来源于程序:波形产生  完成功能:P1.0引脚上输出一个高电平为200us低电平为1000Us的脉冲波形(即周期为1200Us),单片机采用12M晶体

 

程序如下:

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

//用定时计数器0 工作在方式1 在P1.0引脚上输出一个高电平为200us低电平为//

//1000Us的脉冲波形(即周期为1200Us%),单片机采用12M晶体     //

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

#include <at89x52.h>

unsigned char bdata i=0;

void Timer0Interrupt( void ) interrupt 1 //设置中断。中断号为1

{   

     i=~i;                      //把i按位求反

     if(i= =0)                   //如果i= =0 则输出1000us的低电平

     {TL0=-1000;             

      TH0 = -1000>>8;}         //重新定时1ms

    Else                       //如果i= =1 则输出200us的低电平                   

    {TL0=-200;                

     TH0 = (-200)>>8;}        //重新定时200us

     P1_0=i^0;                //按位取i的第0位

    }

void Timer0Init( void )       //设置一个Timer01Init初始化的子函数

{   TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1 与INT0无关定时器模式

    P1_0=0;                        //输出一个低电平

    TL0 = -1000;                  //定时1ms  单片机采用12M晶体

    TH0=(-1000)>>8;

    TR0 = 1;                      //允许T0开始计数

    ET0=1;                    //允许T0中断

    EA=1;                     //中断总允许位,CPU开放中断

}

void main( void )                 //主函数

{

 Timer0Init();                 //time0初始化

 while(1);                    //死循环

 }                          ////等待硬件定时 到 并输出波形

 

11、图11 来源于程序:测周期测频  完成功能:用查询的方法测一个方波的频率,并送数码管显示

 

说明:这个题在做的时候,会出现一些问题,就是说当方波频率比较低的时候,会产生溢出,这样的数码管驱动就可能不对!按照老师的方法,我这里加进了一个原本程序没有的中断程序,其中我用红色标注,这样程序就能记低频,希望大家能自己验证一下。

程序如下:

    #include"at89x52.h"       //头文件

    #define uchar unsigned char

    #define uint  unsigned int

    uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};

    uchar code  a[]={0x3f,0x06,0x5b,0x4f,

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

                     0x6f,0x77,0x7c};

    uchar data  led[4];

    unsigned long int data f;    //定义长整形全局变量f

    int s=0;

 

    void delay(void)     //延时函数

     {

    uint i;

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

     }

 

 

      ledxianshi()      //显示函数,也就是数码管驱动

        {

          uchar k,i;

          led[0]=f/10000;  //取万位数(可能不够,可加)

          led[1]=f%10000/1000;  //取千位数

          led[2]=f%1000/100;  //取百位数

          led[3]=f%100/10;  //取十位数

          led[4]=f%10;  //取个位数

           

        for(k=0;k<4;k++)

         { i=led[k];

           P0=a[i];

           if(k= =1){P0|=0x80;}  //固定在第2个数码管输出一个小数点

           P2=tv[k];

           delay();

         }

     }

void kT1( void ) interrupt 3

     {s++;

      TF1=0;         //溢出清零

      TH1=0;         //寄存器清零

      TL1=0;         //寄存器清零

     }

    void main()

         {   EA=1;   //CPU开放中断

             ET1=1;   //允许T1中断

TMOD=0x10;   //使T1工作在定时方式,用方式1

             TH1=0;        //寄存器清零

             TL1=0;         //寄存器清零

 

         while(1)

         {while(P3_5= =0);   //等待一个低电平

          while(P3_5= =1);   //等待一个高电平

          TR1=1;            //允许T1开始定时

          while(P3_5= =0);    //等待一个低电平

          while(P3_5= =1);    //等待一个高电平

          TR1=0;           //关定时定时器T1

                f=(TH1<<8)+TL1+s*65536;  //把定时送入变量f\

                S=0;

                f=100000000/f;     //f=1000000L/f; //周期的倒数是频率

          while(1)                 //死循环    

          {ledxianshi();}

         }

     }

 12、 图12 来源于程序:中断测频  完成功能:利用中断测方波频率,准确性更高

51单片机程序1(转) - 碧空雄鹰 - 碧空雄鹰的博客

程序如下:

#include"at89x52.h"

#include <math.h>    //函数头文件

#define uchar unsigned char

#define uint  unsigned int

uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};

uchar code  a[]={0x3f,0x06,0x5b,0x4f,

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

    0x6f,0x77,0x7c};

uchar data j,led[4];

uint  f=0,s;  //定义全局变量 并初始化

 

void delay(void)   //延时函数

{

    uint i;

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

}

 

void kINT1( void ) interrupt 2   //设置中断。中断号为2

{

    f=(TH1<<8)+TL1;       //把定时送到变量f里

    TH1=0;                //寄存器清零

    TL1=0;                //寄存器清零

    IE1 = 0;                //关外部中断INT1

}

 

 

      ledxianshi()  //显示函数

      {

          uchar k,i;

          led[0]=f/1000;

          led[1]=(f%1000)/100;

          led[2]=(f%100)/10;

          led[3]=f%10;

           

        for(k=0;k<4;k++)

         { i=led[k];

           P0=a[i];

           P2=tv[k];

           delay();

         }

     }

 

void main()

{

    EA=1;   //中断总允许位,CPU开放中断

    EX1=1;  //允许外部重点1中断

    IT1=1;   //允许外部中断INT1触发

    TMOD=0x50; // //初始化,开定时定时器T1,工作方式1 计数器模式

    TH1=0;      //寄存器清零

    TL1=0;      //寄存器清零

    TR1=1; //允许T1开始定时

    while(1)

    {

        ledxianshi();

    }

}

 

 

  评论这张
 
阅读(1498)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018