51单片机c语言编程100例(51单片机C语言编程实例集锦)

万能朋友说 2023-08-22 09:46:22 68833 作者: 双枪
51单片机c语言编程100例(51单片机C语言编程实例集锦) 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个实例,希望您从这些实例中获得帮助!

注:本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即后台留言通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意