专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51系列-C语言程序详解

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月19日   【字体:

 1.单个LED灯,单个按键

//C语言的头文件    //这是第一种注释方式;

#include

#include <> //预处理命令

 void main(void)                //主函数名,必须有一个主函数,void为数据类型

 {

 unsigned int a;           //定义变量,a为int类型,无符号整型。语句必须分号结尾

  

  do{                            //do-while 组成的循环过程,过程的开始

 for (a=0; a<500; a++);  //这是一个条件循环,判断a的值是否小于500,真循环-耗时,假转下句

P1_0 = 0;         //位赋值语句,设 P1.0 口为低电平—置0,点亮 LED

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1;             //设 P1.0 口为高电平,熄灭 LED

   }

 while(1);            //do-while 组成循环过程的末尾,需要对do的过程进行一次判断

}

 

程序说明:

While(条件语句) 与 for(条件语句) 单独使用所表达的循环,是在句首先执行判断,为真循环,为假转下一句执行。其中语句的括号内为判断条件语句。

Do-while合用,是需要对do的过程再进行一次判断。While(条件语句)为真循环,为假跳转。while(1)表示高电平为真循环do,否则,低电平跳转。由于P1.0 口为高电平结尾,因此,又回到do再循环,无限反复。

 

2.多个LED灯,单个按键

#include

#include <> //预处理命令

 void main(void)                //主函数名,必须有一个主函数,void为数据类型

 {

 unsigned int a;           //定义变量,a为int类型,无符号整型。语句必须分号结尾

    do{                            //do-while 组成的循环过程,过程的开始

 for (a=0; a<500; a++);  //这是一个条件循环,判断a的值是否小于500,真循环-耗时,假转下句

P1_0 = 0;         //位赋值语句,设 P1.0 口为低电平—置0,点亮 LED

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1;             //设 P1.0 口为高电平,熄灭 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

   }

 while(1);            //do-while 组成循环过程的末尾,需要对do的过程进行一次判断

}

 

程序说明:

每个口用位赋值指令来开关P1口的各个LED。可以用字节赋值指令一次性的开关8位P1口LED。

P1=0;     //P1口8位置低电平,点亮8个LED

P1=1;      // P1口8位置低电平,关闭8个LED

 

#include

#include <> //预处理命令

 void main(void)                //主函数名,必须有一个主函数,void为数据类型

 {

 unsigned int a;           //定义变量,a为int类型,无符号整型。语句必须分号结尾

    do{                            //do-while 组成的循环过程,过程的开始

 for (a=0; a<500; a++);  //这是一个条件循环,判断a的值是否小于500,真循环-耗时,假转下句

P1 = 0;         //字节赋值语句,设 P1 口为低电平—置0,点亮 8个LED

for (a=0; a<500; a++);        //这又是一个判断循环

P = 1;             //设 P1 口为高电平,熄灭 LED

   }

 while(1);            //do-while 组成循环过程的末尾,需要对do的过程进行一次判断

}

 

 

l  LED循环问题(跑马灯):

每个口用位赋值指令来开关P1口的各个LED,用位指令赋值顺序开关,实现跑马灯。

 

#include

#include <> //预处理命令

 void main(void)                //主函数名,必须有一个主函数,void为数据类型

 {

 unsigned int a;           //定义变量,a为int类型,无符号整型。语句必须分号结尾

    do{                            //do-while 组成的循环过程,过程的开始

 for (a=0; a<500; a++);  //这是一个条件循环,判断a的值是否小于500,真循环-耗时,假转下句

P1_0 = 0;         //位赋值语句,设 P1.0 口为低电平—置0,点亮 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1;             //设 P1.0 口为高电平,熄灭 LED

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

 

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1; 

P1_1 = 1;

P1_2 = 0;

P1_3 = 1;

 

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

 

for (a=0; a<500; a++);        //这又是一个判断循环

P1_0 = 1;             //设 P1.0 口为高电平,熄灭 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

 

   }

 while(1);            //do-while 组成循环过程的末尾,需要对do的过程进行一次判断

}

 

用循环语句实现跑马灯,需要使用数组—表data。每个字节--8位来表达P1口各个位的电平高低,也就是亮与灭。

 

#include

#include <> //预处理命令

 void main(void)                //主函数名,必须有一个主函数,void为数据类型

 {

 unsigned int a;           //定义变量,a为int类型,无符号整型。语句必须分号结尾

    do{                            //do-while 组成的循环过程,过程的开始

 for (a=0; a<500; a++);  //这是一个条件循环,判断a的值是否小于500,真循环-耗时,假转下句

P1 = 0;         //字节赋值语句,设 P1 口为低电平—置0,点亮 8个LED

for (a=0; a<500; a++);        //这又是一个判断循环

P = 1;             //设 P1 口为高电平,熄灭 LED

   }

 while(1);            //do-while 组成循环过程的末尾,需要对do的过程进行一次判断

}

3.  键盘与数码管
 

//键盘扫描法--数码管显示键值。行P1.0~3  列P1.4~7

#include

unsigned char code tabyin[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

        0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0到F的16个键值

unsigned char code tabyang[ ]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,

0x88,0x83,0xc6,0xa1,0x86,0x8e};//0到F的16个键值

//延时函数

void Delayt(unsigned char t)

{

unsigned char i;

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

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

}

//键值判断函数

bit pkey(void)

{

P1=0xf0;

if(P1!=0xf0)

    {

    Delayt(25);

      if(P1!=0xf0)

      return 1;

      else

      return 0;

    }

else

      return 0;

}

 

//主函数

void main(void)

{

unsigned char key,j,k,s;

while(1)

  {

    if(pkey()==1)

    {

      P1=0xfe;

    k=0xfe;

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

       { 

                  s=P1&0xf0;

        switch(s)

         {

            case 0xe0: key=4*j+0; break;

             case 0xd0: key=4*j+1; break;

              case 0xb0: key=4*j+2; break;

               case 0x70: key=4*j+3; break;

            default: break;

         }

       k=(k<<1)|0x01;

       P1=k;

      }

    }

  P2=0x00;

   P3=0xff;

      P3=tabyang[key];

       Delayt(200);

        P2=tabyin[key];

         Delayt(250);

 

  }

}

关闭窗口

相关文章