> 文章列表 > 单片机 | 51单片机实践

单片机 | 51单片机实践

单片机 | 51单片机实践

【金善愚】 单片机应用实践——基础篇 笔记整理
课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid=144001

仿真软件:Proteus 8.13
安装链接:https://pan.baidu.com/s/1-1fscykdvulV60xA4Hygaw?pwd=xeob

代码软件:Keil μvision V5.14.2
安装链接:https://pan.baidu.com/s/1MRdG2EkxORr6M6XH-n5ang?pwd=l2rm

文章目录

  • 一、点亮LED 灯
    • 1.仿真原理图
    • 2.代码
    • 2.软硬件关联
  • 二、LED 闪烁
    • 1.基本数据类型
    • 2.代码
    • 2.调试
  • 二、LED 流水灯
    • 1.用简单顺序语句的方法实现
    • 2.用数组的方法实现(多文件)
    • 3.用库函数的方法实现
    • 4.用移位运算符的方法实现
  • 三、蜂鸣器
  • 总结

一、点亮LED 灯

1.仿真原理图

单片机 | 51单片机实践

电阻 RES
电容 CAP
晶振 crystal
按键 button

2.代码


//包含单片机的头文件,建立软件和硬件的联系
#include<reg51.h>//sbit LED0 = P1^0;  //位操作,取P1的0位命名为LED
//sbit LED1 = P1^1; 
//sbit LED2 = P1^2; 
//sbit LED3 = P1^3; void main()
{while(1) //保持循环执行{P1 = 0xF0; //P1.7 - P1.0 赋值 1111_0000//LED0 = 0;//LED1 = 0;//LED2 = 0;//LED3 = 0;  //P1其他位默认为1}
}

2.软硬件关联

(1)生成HEX文件

a.点击图示的快捷图标
单片机 | 51单片机实践

b.生成
单片机 | 51单片机实践

c.编译
单片机 | 51单片机实践

d.文件位置
单片机 | 51单片机实践

(2)仿真中关联代码

a.双击单片机,找到HEX文件位置,关联代码
单片机 | 51单片机实践

(3)开始仿真
单片机 | 51单片机实践

单片机 | 51单片机实践

二、LED 闪烁

1.基本数据类型

单片机 | 51单片机实践

2.代码

(1)用循环语句方式

#include<reg5l.h>void main ( )
{unsigned int i;//无符号整形0~65535while (1){i =20000;P1 = 0xFO;//1111 0000while ( i--){}i = 20000;P1 = 0x0F;//0000 1111while ( i--);//for(i = 0 ; i<50000;i++) //用for语句}
}

(2)用延时函数方式


#include<reg51.h>void delay();//声明函数void main()
{while(1) {P1 = 0xf0;delay();P1 = 0x0f;delay();	}
}void delay()
{unsigned int ms = 500000;while(ms--){		}}

(3)用带参数的延时函数

/****************************************
功  能:带有参数的延时函数实现小灯的闪烁
时  间:****/**/**
****************************************/#include<reg51.h>//声明引脚
sbit LED = P1^7;//函数声明
void DelayXms(unsigned int xms);/****************************************
函数名: main
功  能: 主函数
参  数: 无
返回值: 无
****************************************/
void main()
{while(1) {LED = 0;DelayXms(1000);//调用函数LED = 1;DelayXms(1000);	}
}/****************************************
函数名: DelayXms
功  能: 延时函数
参  数: unsigned int
返回值: 无
****************************************/
void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--){for(j = 124;j>0;j--){}}
}

2.调试

(1)设置

晶振和仿真
单片机 | 51单片机实践
单片机 | 51单片机实践

(2)进入调试模式
单片机 | 51单片机实践

(3)时间等状态
单片机 | 51单片机实践

(4)分步调试
单片机 | 51单片机实践
①运行到鼠标所在位置
②单步运行
③进入函数
④运行全部(直至断点)
⑤设置断点

二、LED 流水灯

1.用简单顺序语句的方法实现

#include<reg51.h>void DelayXms(unsigned int xms); //函数声明,或者将延迟函数放在main()函数前面,否则会报错void main()
{while(1) {P1 = 0xfe; //1111 1110DelayXms(1000); //调用函数P1 = 0xfd; //1111 1101DelayXms(1000);	P1 = 0xfb; //1111 1011DelayXms(1000);P1 = 0xf7; //1111 0111DelayXms(1000);P1 = 0xef; //1110 1111DelayXms(1000);P1 = 0xdf; //1101 1111DelayXms(1000);P1 = 0xbf; //1011 1111DelayXms(1000);P1 = 0x7f; //0111 1111DelayXms(1000);}
}//延时函数
void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--)for(j = 124;j>0;j--);
}

2.用数组的方法实现(多文件)

1.创建工程目录下新建4个文件夹,并修改设置下的存放路径

Listings  放中间文件
Output   放输出HEX等文件
Project   放工程文件
Source  放 .c、 .h文件

单片机 | 51单片机实践

2.创建模块的 .c文件并创建其对应的.h文件

  • .c文件负责函数的定义及变量的定义
  • .h文件负责函数的声明及变量的声明(不允许赋初值)以及常量和I/O口的宏定义

(1) delay.c

#include"delay.h" //""头文件会在当前目录下查找。< >头文件一般是系统头文件,会在安装目录下寻找/*************************************
函数名:DelayXms
功  能:毫秒级延时函数
参  数: unsigned int(1 - 65535)
返回值:无
***********************************/void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--)for(j = 124;j>0;j--);
}

(2) delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void DelayXms(unsigned int xms); //声明加分号#endif

2.创建main函数的 .c文件,可直接引用模块头文件使用

main.c

#include<reg51.h> 
#include"delay.h"unsigned char code LEDBUF[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
//创建数组,常量可存放在ROM中,添加关键词code。变量可存放在RAM中void main()
{unsigned char cnt;//unsigned char 类型范围是0 -255while(1) {for (cnt = 0; cnt<8;cnt++){P1 = LEDBUF[cnt];DelayXms(1000);}}
}

3.用库函数的方法实现

1._crol_函数

_crol_函数功能:将 c 进行b位左位移,并将值以unsigned char类型返回

//文档定义
#include <intrins.h>unsigned char _crol_ (
unsigned char c,        /* character to rotate left */
unsigned char b);       /* bit positions to rotate */

函数返回类型为unsigned char,函数的两个形参也是unsigned char类型。
c 为要被进行 位左移 的形式参数
b 为要进行的 位移数

注释:向左循环移位时,从左边出去会从右边重新补入

2._cror_函数

与_crol_函数类似,区别只是进行的是右位移

注释:向右循环移位时,从右边出去会从左边重新补入

3.main.c 代码

#include<reg51.h> 
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0xfe; //1111 1110while(1){P1 = temp;temp = _crol_(temp,1);DelayXms(1000);}
}

4.用移位运算符的方法实现

1.位运算符 及 位表达式

单片机 | 51单片机实践⚠️注意:位表达式c<<1的值是0011 1100B,而c的值并未改变,仍是1001 1110B。移出补0。

2.代码

(1)main.c 用移位+补位方法

#include<reg51.h> 
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0xfe; //1111 1110while(1){P1 = temp;			// 输出DelayXms(1000);		// 延时if (temp & 0x80)	// 判断temp最高位是否为1{temp = temp<<1;	// 左移temp = temp|1; 	// 如果左移之前temp最高位为1,则在temp的最低位补1}else{temp<<=1;		// 左移}}
}

(2)main.c 用移位+补位方法

#include<reg51.h> 
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0x1; //0000 0001unsigned char i;while(1){P1 = ~(temp<<i++);			DelayXms(1000);		if (8 == i)	i=0;	}
}

三、蜂鸣器

1.蜂鸣器工作电路
单片机 | 51单片机实践
图中 D4为 续流二极管:
一种配合电感性负载使用的二极管,当电感性负载的电流有突然的变化或减少时,电感二端会产生突变电压,可能会破坏其他元件。配合续流二极管时,其电流可以较平缓地变化,避免突波电压的发生。

1.原理图

单片机 | 51单片机实践

2.代码

#include<reg51.h> #include"delay.h"sbit Sound = P3^7;
void main()
{unsigned int i;while(1){for(i = 0;i<100;i++){Sound = ~Sound;DelayXms(1);}for(i = 0;i<100;i++){Sound = ~Sound;DelayXms(5);}}
}

总结

以上就是本文要讲的内容。

美味小吃