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个实例,希望您从这些实例中获得帮助!