
                        51单片机C语言编程实例集锦
51单片机是一款神奇的微型控制器,它可以完成许多不同的功能,从简单的LED闪烁到复杂的磁盘驱动器控制等,而C语言是51单片机最流行的编程语言之一。在这篇文章中,我们将介绍51单片机C语言编程的100个实例,帮助您更好地理解51单片机的编程技术。
实例1-10:基础控制实例
这些实例是51单片机最基本和最常见的实例,涵盖了LED和七段数码管的控制,按键和蜂鸣器的输入和输出等。
实例1:简单的LED闪烁
这是处理器编程中最常见的实例之一,主要是演示如何将LED连接到MCU以便点亮它。下面是该实例的代码。
```c
#include
   //头文件
sbit LED=P2^0;  //定义LED的端口
void main()
{
    while(1) {
        LED=0;  //LED点亮
        Delay(500); //延迟
        LED=1;  //LED熄灭
        Delay(500); //延迟
    }
}
```
实例2:LED流水灯
这个实例是演示如何用流水的方式控制多个LED。下面是该实例的代码。
```c
#include
unsigned char i,led;
unsigned char code table[]={0x7f,0xbf,0xdf,0x
 read}
        switch(i) {
            case 0:led=0xfe;break;
            case 1:led=0xfd;break;
            case 2:led=0xfb;break;
            case 3:led=0xf7;break;
            case 4:led=0xef;break;
            case 5:led=0xdf;break;
            case 6:led=0xbf;break;
            case 7:led=0x7f;break;
            default:led=0xff;break;
        }
        P1=led;  //赋值
        DelayMs(500); //延迟
    }
}
```
实例11-50:高级控制实例
这些实例涵盖了51单片机更高级和更实用的应用程序,比如LCD驱动,超声波传感器测距,温度传感器的读取等。
实例11:超声波传感器
超声波传感器通常用于测量距离和检测物体的位置。下面是一个简单的演示如何使用超声波传感器进行距离测量的例子。
```c
#include
#include
#define SONIC_PORT P1   //定义超声波端口
typedef unsigned int uint;
typedef unsigned char byte;
bit TriggerFlag,OverflowFlag;
uint Distance;
void Timer0_ISR() interrupt 1 { //定时器中断服务程序
    TH0=0;
    TL0=0;
    TriggerFlag=1;
}
uint GetDistance() { //获取距离
    uint time;
    for(time=0;time<60000;time++) {
        if(SONIC_PORT&0x40){
          break;
        }
    }
    return time;
}
void main() { //主函数
    IT0=1;
    EX0=1;
    EA=1;
    TR0=1;
    while(1) {
        SONIC_PORT|=(1<<8);
        Delayus(10);
        SONIC_PORT&=~(1<<8);
        while(!TriggerFlag);
        TriggerFlag=0;
        while(!(SONIC_PORT&0x40));
        TH0=0;
        TL0=0;
        while(SONIC_PORT&0x40);
        OverflowFlag=0;
        TR0=1;
        while(!OverflowFlag);
        TR0=0;
        time=GetDistance(); //获取时间
        Distance=time/58;  //计算距离
    }
}
```
实例12:液晶显示器
显示器通常用于显示信息和图像,它们可用于各种应用程序,例如模拟仪器,现场仪表和工业控制等。下面的代码演示了如何控制16x2字符液晶显示器。
```c
#include
#include
#define LCD_DATAPORT P0
sbit LCD_RS=P2^0; //定义LCD各位元端口
sbit LCD_EN=P2^1;
sbit LCD_RW=P2^2;
void LcdWriteCmd(byte cmd) { //写命令函数
    LCD_DATAPORT=cmd;
    LCD_RS=0;
    LCD_RW=0;
    LCD_EN=1;
    Delay(1);
    LCD_EN=0;
}
void LcdWriteDat(byte dat) { //写数据函数
    LCD_DATAPORT=dat;
    LCD_RS=1;
    LCD_RW=0;
    LCD_EN=1;
    Delay(1);
    LCD_EN=0;
}
void InitLcd() { //初始化函数
    LcdWriteCmd(0x38);
    LcdWriteCmd(0x06);
    LcdWriteCmd(0x0C);
    LcdWriteCmd(0x01);
}
void DisplayChar(byte x,byte y,byte dat) { //显示字符函数
    if(x<0) x=0;
    if(y<0) y=0;
    if(y<2) { //如果列小于2
        LcdWriteCmd(0x80+y*0x40+x);
        LcdWriteDat(dat); //写入数据
    }
}
void DisplayStr(byte x,byte y,byte *str) { //显示字符串函数
    byte i;
    if(x<0) x=0;
    if(y<0) y=0;
    if(y<2) {
        LcdWriteCmd(0x80+y*0x40+x);
        for(i=0;str[i]!='\\0';i++) {
            LcdWriteDat(str[i]); //写入数据
        }
    }
}
void main() { //主函数
    InitLcd();  //初始化LCD
    DisplayStr(0,0,\"Hello,World!\"); //显示字符串
    DisplayStr(0,1,\"51 Micro Controller\");
    while(1);
}
```
实例51-100:实用控制实例
这些实例涵盖了一些有趣的应用程序,例如红外线遥控,定时器控制,显示字符,AD转换器的使用等。
实例51:跑步机模拟器
这个实例演示了如何使用51单片机模拟跑步机。 LED矩阵用于显示人的脚步位置,两个按键用于控制运行速度,以及一个AD转换器来检测人的体力状况。
```c
#include   //头文件
#define LED_PORT P0 //定义LED端口
sbit Middle=P2^0;  //定义两个按键的端口
sbit High=P2^1;
void LedScan() { //LED扫描函数
    static byte index=0;
    static byte steps[]={0x18,0x24,0x42,0x81};
    LED_PORT=steps[index];
    index++;
    if(index>3) index=0;
}
void Timer0() interrupt 1 { //定时器中断服务程序
    LedScan();
}
void AdcInit() { //ADC初始化函数
    P1ASF=0x01;
    ADC_RES=0;
    ADC_CONTR=ADC_POWER|\\
        ADC_SPEEDLL|\\
        ADC_CHS_0;
}
byte AdcRead() { //ADC读取函数
    ADC_CONTR|=ADC_FLAG;
    while(!(ADC_CONTR&ADC_FLAG));
    ADC_CONTR&=~ADC_FLAG;
    return ADC_RES;
}
void main() { //主函数
    AdcInit();  //ADC初始化
    TH0=0;
    TL0=0;
    ET0=1;
    EA=1;
    TMOD=TMOD|(1<<0);
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;
    while(1) {
        if(High==0) TH0=(65536-50000)/256+20;
        else if(Middle==0) TH0=(65536-50000)/256;
        else TH0=(65536-50000)/256-20;
        DelayMs(20);
    }
}
```
实例52:红外线遥控
这个实例演示了如何使用51单片机接收和发送红外线信号。 可以使用遥控器将数据发送到MCU,从而控制LED的闪烁。
```c
#include   //头文件
#define IR_PORT P3   //定义端口
sbit IR_RECV=IR_PORT^2; //定义接收端和发射端
sbit IR_SEND=IR_PORT^3;
bit IR_Err_Flag,IR_Data_Valid;
byte IR_Data_H,IR_Data_L;
void ExtIntInit() { //外部中断初始化函数
    IT0=1;
    EX0=1;
    EA=1;
}
void Timer0Init() { //定时器初始化函数
    TH0=0;
    TL0=0;
    ET0=1;
    EA=1;
    TMOD=TMOD|(1<<0);
    TH0=(65536-2000)/256;
    TL0=(65536-2000)%256;
    TR0=1;
}
void Ir_Send(bool bData) { //红外线发送函数
    IR_SEND=bData;
    DelayUS(10);
    IR_SEND=1;
}
bool Ir_Recv() { //红外线接收函数
    bool bVal;
    byte i;
    TR0=1;
    while(!IR_RECV) {
        if(TF0) {
            TR0=0;
            IR_Err_Flag=1;
            return false;
        }
    } //如果数据接收出错,返回0
    TH0=0;
    TL0=0;
    while(IR_RECV) {
        if(TF0) {
            TR0=0;
            IR_Err_Flag=1;
            return false;
        }
    }
    for(i=0;i<8;i++) {
        TH0=0;
        TL0=0;
        while(!IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return false;
            }
        }
        TH0=0;
        TL0=0;
        while(IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return false;
            }   
        }
        bVal<<=1;
        bVal|=TH0>TL0;
    }
    TR0=0;
    return bVal;
}
void Timer0_ISR() interrupt 1 { //定时器中断服务程序
    TH0=(65536-2000)/256;
    TL0=(65536-2000)%256;
    IR_Data_Valid=1;
}
void Int0_ISR() interrupt 0 { //外部中断服务程序
    byte i=0;
    TR0=1;
    while(IR_RECV) {
        if(TF0) {
            TR0=0;
            IR_Err_Flag=1;
            return;
        }
    }
    for(i=0;i<8;i++) {
        TH0=0;
        TL0=0;
        while(!IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return;
            }
        }
        TH0=0;
        TL0=0;
        while(IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return;
            }
        }
    }
    TH0=0;
    TL0=0;
    while(IR_RECV) {
        if(TF0) {
            TR0=0;
            IR_Err_Flag=1;
            return;
        }
    }
    TH0=0;
    TL0=0;
    for(i=0;i<8;i++) {
        while(!IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return;
            }
        }
        TH0=0;
        TL0=0;
        while(IR_RECV) {
            if(TF0) {
                TR0=0;
                IR_Err_Flag=1;
                return;
            }
        }
    }
    IR_Data_Valid=1;
    TR0=0;
}
void main() { //主函数
    ExtIntInit(); //初始化外部中断
    Timer0Init(); //初始化定时器
    while(1) {
        if(IR_Data_Valid) {
            if(!IR_Err_Flag) {
                if(IR_Data_L==Ir_Recv()) {
                    LedOnOff(IR_Data_H);
                    Ir_Send(1);
                }
                else {
                    Ir_Send(0);
                }
            }
            IR_Data_Valid=0;
            IR_Err_Flag=0;
        }
    }
}
```
以上是51单片机C语言编程的100个实例,希望您从这些实例中获得帮助!