一、认识单片机(主要为普中51单片机)
1.单片机概念
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
2.初识单片机
序号 | 模块 | 功能 |
1 |
步进电机驱动模块
|
使用 ULN2003 芯片,可驱
动直流电机、五线四相步
进电机等
|
2 |
动态数码管模块
|
使用 74HC245 芯片和和
74HC138 译码器驱动 2 个
四位一体共阴数码管
|
3 |
LCD1602/LCD12864 液晶
接口
|
连接 LCD1602 液晶屏或连
接 LCD12864 液晶屏
|
4 | EEPROM 模块 |
使用 AT24C02 芯片,存储
容量为 256 字节,可实现
IIC-EEPROM 功能,存储的
数据掉电不丢失
|
5 |
8*8 单色 LED 点阵模块
|
可独立控制 LED 显
示数字、字符、简单汉字
图形等
|
6 | 蜂鸣器模块 |
使用无源蜂鸣器,可实现
报警提示等功能
|
7 |
DS1302 时钟模块
|
使用 DS1302 时钟芯片,
可实现数字时钟功能
|
8 |
STC89C52 单片机接口座
和 IO 管脚
|
可固定单片机,并将单片
机 IO 口全部引出,方便
用户二次开发
|
9 | LED 流水灯模块 |
使用8个小灯,可实现LED
流水灯控制
|
10 | ADC 模块 |
使用 XPT2046 芯片,可实
现模拟信号采集转换,可
设计简易电压表等
|
11 |
DAC(PWM)模块
|
使用 LM358 芯片,可实现
模拟信号输出、PWM 控制
|
12 | USB 转 TTL 串口模块 |
使用 CH340 芯片,可实现
USB 转 TTL 串口功能,既
可下载程序,又可实现串
口通信
|
13 | 矩阵键盘模块 |
使用 4*4 矩阵键盘,可实
现键盘输入控制
|
14 | 独立按键模块 |
使用 4 个按键,可实现按
键控制
|
15 | NRF24L01 模块接口 |
支持 NRF24L01 模块,可
实现 2.4G 无线
|
16 |
DS18B20 接口
|
可接入 DS18B20 温度传感
器进行温度检测
|
17 | 红外接收模块 |
使用一体化红外接收头,
可实现红外遥控通信
|
18 | 复位按键 | 系统复位按钮 |
3.STC89C52芯片初识
1.管脚图
2.内部结构图
二、单片机学习
1.LED灯板块学习
1.LED电路连接图
2.led灯实现流水灯代码
法一:运用数组实现循环
前言:二进制图库
若要实现led闪烁,可依次点亮led(注:在16进制中要以0x开头,从右至左读)
代码如下
#include <STC89C5xRC.H>
#include<INTRINS.H>
void Delay100us(unsigned int ms) //@11.0592MHz
{
while(ms--)
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
}
unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i;
void main()
{
while(1)
{
for( i=0;i<8;i++)
{
P2=a[i];
Delay100us(500);
}
}
}
法二:运用移位运算符
定义初始P2=~0x01,随后依次左移
代码如图
#include <STC89C5xRC.H>
#include<INTRINS.H>
void Delay(unsigned char ms) //@11.0592MHz
{
unsigned char i;
while(ms--)
{
_nop_();
i = 43;
while (--i);
}}
void main()
{
unsigned char i;
for(i=0;i<=8;i++)
{
P2=~(0x01<<i);
Delay(1000);
}
}
法三:运用函数实现
#include <STC89C5xRC.H>
#include<INTRINS.H>
void Delay(unsigned char ms) //@11.0592MHz
{
unsigned char i;
while(ms--)
{
_nop_();
i = 43;
while (--i);
}
}
void main()
{
unsigned char led=0xfe;
while(1)
{
led=_crol_(led,1);
P2=led;
Delay(1000);
}
}
2.独立按键
1.认识独立按键
按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开
2.独立按键电路结构
根据电路图可知:第一个按键为P30(非P31)当按键被按下时为低电平即0
3.独立按键消抖程序
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图所示:
基于此,要对按键进行消抖处理
常见按键消抖方法:1.延时函数消抖 2.外围原件消抖 3.定时器消抖
(目前只讨论第一种消抖法)
延时函数消抖,代码如下
#include <STC89C5xRC.H>
#include<INTRINS.H>
void Delay(unsigned char ms) //@11.0592MHz
{
unsigned char i;
while(ms--)
{
_nop_();
i = 43;
while (--i);
}
}
void main()
{
if(P30==1)
{
Delay(20);
while(P30==0);//注意“;”不能漏掉,这里表示当按键按下时一直循环等待,当按键松开时执行下一代码
Delay(20);
//执行程序
................
}
}
3.led与独立按键结合
(此处只有代码)
#include <STC89C5xRC.H>
#include<INTRINS.H>
void Delay(unsigned char ms) //@11.0592MHz
{
unsigned char i;
while(ms--)
{
_nop_();
i = 43;
while (--i);
}
}
unsigned char a[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
int num=0;
void main()
{
P2=0xFf;
while(1)
{
if(P31==0)//依次相加
{
Delay(20);
while(P31==0);
Delay(20);
P2=P2<<1;
}
else if(P30==0)//依次相减
{
unsigned char i;
Delay(20);
while(P30==0);
Delay(20);
for(i=1;i<9;i++)
{
if(P2==a[i])
P2=a[i-1];
}
}
else if(P32==0)//二进制
{
Delay(20);
while(P32==0);
Delay(20);
num++;
P2=~num;
}
else if(P33==0)//流水灯
{
unsigned char i;
Delay(20);
while(P33==0);
Delay(20);
P2=0xfe;
Delay(500);
for(i=1;i<8;i++)
{
P2=~(0x01<<i);
Delay(500);
}
}
}
}
4.数码管
1.数码管电路
1.单个数码管
一个数码管是由a、b、c、d、e、f、g、dp八个二极管组成,八个LED一端接在一起,另一端引脚引出来。二极管如果阳极连在一起,就是共阳极数码管,阴极连在一起,就是共阴极数码管。
如上图,是一个共阴极数码管(1表示灯亮),要使数码管显示不同的数字,只需点亮对应LED即可。
2.多个数码管
即多个单个数码管组成,在使用时,需要程序选定使用哪几个数码管,这就是“位选”,选定数码管后再对选定的数码管进行操作,其操作与单个数码管的操作一致,这就是“段选”。
3.多位数码管与芯片引脚
1.数字显示
显示数字“0”,abcdef亮,状态值00111111——>0x3f
显示数字“1”,bc亮,状态值00000110——>0x06
显示数字“2”,abdeg亮,状态值01011011——>0x5b
显示数字“3”,abcdg亮,状态值01001111——>0x4f
显示数字“4”,bcfg亮,状态值01100110——>0x66
显示数字“5”,acdfg亮,状态值01101101——>0x6d
显示数字“6”,acdefg亮,状态值01111101——>0x7d
显示数字“7”,abc亮,状态值00000111——>0x07
显示数字“8”,abcdefg亮,状态值01111111——>0x7f
显示数字“9”,abcdfg亮,状态值01101111——>0x6f
同理,可推导其他,用数组储存,方便调用
2.数码管位次
要使一号数码管亮,即Led8亮,应输出111
二号:110......其他同理
3.动态数码管消影
动态扫描:这种显示方式与老式电视机的显示原理类似,利用的是人眼的视觉暂留效应。过程:位选(选择控制哪个数码管)->段选(控制显示内容)->位选 的循环,故在每次扫描需将上一次残影消除,即每一次“位选->段选”操作完,在极短的时间之内,完成将P0清零(P0=0x00;)的操作。
代码如下
#include <STC89C5xRC.H>
#include "delay.h"
int c[13]={0x3e,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
void chengxu(int a,int b)
{
switch(a)
{
case 1:P24=1;P23=1;P22=1;break;
case 2:P24=1;P23=1;P22=0;break;
case 3:P24=1;P23=0;P22=1;break;
case 4:P24=1;P23=0;P22=0;break;
case 5:P24=0;P23=1;P22=1;break;
case 6:P24=0;P23=1;P22=0;break;
case 7:P24=0;P23=0;P22=1;break;
case 8:P24=0;P23=0;P22=0;break;
}
P0=c[b];
Delay(1);
P0=0x00;
}