单片机学习(1)

一、认识单片机(主要为普中51单片机)

1.单片机概念

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

2.初识单片机

序号模块功能
1
步进电机驱动模块
使用 ULN2003 芯片,可驱
动直流电机、五线四相步
进电机等
2
动态数码管模块
使用 74HC245 芯片和和
74HC138 译码器驱动 2 个
四位一体共阴数码管
3
LCD1602/LCD12864 液晶
接口
连接 LCD1602 液晶屏或连
接 LCD12864 液晶屏
4EEPROM 模块
使用 AT24C02 芯片,存储
容量为 256 字节,可实现
IIC-EEPROM 功能,存储的
数据掉电不丢失
5
8*8 单色 LED 点阵模块
可独立控制 LED 显
示数字、字符、简单汉字
图形等
6蜂鸣器模块
使用无源蜂鸣器,可实现
报警提示等功能
7
DS1302 时钟模块
使用 DS1302 时钟芯片,
可实现数字时钟功能
8
STC89C52 单片机接口座
和 IO 管脚
可固定单片机,并将单片
机 IO 口全部引出,方便
用户二次开发
9LED 流水灯模块
使用8个小灯,可实现LED
流水灯控制
10ADC 模块
使用 XPT2046 芯片,可实
现模拟信号采集转换,可
设计简易电压表等
11
DAC(PWM)模块
使用 LM358 芯片,可实现
模拟信号输出、PWM 控制
12USB 转 TTL 串口模块
使用 CH340 芯片,可实现
USB 转 TTL 串口功能,既
可下载程序,又可实现串
口通信
13矩阵键盘模块
使用 4*4 矩阵键盘,可实
现键盘输入控制
14独立按键模块
使用 4 个按键,可实现按
键控制
15NRF24L01 模块接口
支持 NRF24L01 模块,可
实现 2.4G 无线
16
DS18B20 接口
可接入 DS18B20 温度传感
器进行温度检测
17红外接收模块
使用一体化红外接收头,
可实现红外遥控通信
18复位按键系统复位按钮

3.STC89C52芯片初识

1.管脚图

2.内部结构图

二、单片机学习

1.LED灯板块学习

1.LED电路连接图

LED 采用共阳接法 即所有 LED 阳极管脚接电源 VCC,阴极管脚通过一个470 欧的限流电阻接到 P2 口上,要让 LED 发光即对应的阴极管脚就应该为低电平,若为高电平则熄灭(即 LED出现0为亮,1为熄灭

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);
		}
}
法三:运用函数实现
左移函数是_crol_(),右移函数是_cror_(),要使用这两个函数在我们的程序中
必须要包含 intrins.h 头文件
代码如下
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值