1 单片机介绍
1.1 芯片名称
STC 89C52RC 40I-PDIP 0707
➢ STC: 公司名, AT(ATM), P(飞利浦), W(华邦), S(西门子), I(英特尔);
➢ 8: 80C51内核;
➢ 9: RAM型号, 9(Flash E2P-RAM), 0(Mark RAM), 7(EP-RAM);
➢ C: CMOS工艺, LV、 LE(低压产品), S(可串行化编程);
➢ 5: 固定;
➢ 2: 2X4KB, ROM;
➢ RC: 512B大小RAM, RD++(1080B);
➢ 40: 晶振频率40MHZ;
➢ I: I(工业级-40~85℃)、 C(商业级0~70℃)、 A(汽车-40~125℃)、 M(军品-55~150℃);
➢ PDIP: 封装形式, PDIP 双列直插式)、 PLCC(带引线的塑料封装)、 QFP/PFP(方形扁平式)、PGA(插针网格阵列)、 BGA(球栅阵列);
➢ 0707: 07年第07周;
1.2 电平特性
➢ CMOS/TTL: 5V、 3.3V、 2.5V、 1.8V;
➢ STC89C52: TTL电平,高电平5V,低电平0V;
➢ RS-232: 计算机串口,高电平-12V,低电平12V;
➢ MAX232: 实现计算机串口电平与单片机电平转换;
➢ TTL特点: 使用最多, 对于电源要求不高、热损耗低; 直接与集成电路相连不需要价格昂贵的线路驱动; 能够实现数据高速传输; 但是并行数据传输不能超过10英尺,由于并行接口不对称对可靠性有影响;
➢ CMOS特点: 输入端不能悬空,会导致逻辑混乱;电源电压可在大范围变化,不如TTL严格;
1.3 芯片引脚
➢ 第一类:电源与时钟引脚 - VCC(40)、 GND(20)、 XTAL1(19)、 XTAL2(18);
➢ 第二类:编程控制引脚 – RST/VPD(9)、 𝑃𝑆𝐸𝑁(29)、 ATL/PROG(30)、 𝐸𝐴/𝑉𝑃𝑃(31);
➢ 第三类: IO引脚 – P1(1~8)、 P3(10~17)、 P2(21~28)、 P0(32~39);
➢ VCC、 GND: 外接电源,需要使用滤波器过滤信号;
➢ XTAL1、 XTAL2:时钟引脚,外部时钟, XTAL2接地, XTAL1接输入信号,片内振荡,XTAL1输入信号, XTAL2输出信号,外接 电容10~30PF,保证程序能够执行到下一行,外加电容是为了获得交流信号,使其起振;
➢ RST/VPD: 第一功能复位计数器PC=0000H,连续输入两个机器周期以上的高电平有效,第二功能提供临时高电平,备用电源,防止数据丢失;
➢ 𝑷𝑺𝑬𝑵: 程序存储器允许输出控制端,低电平有效,低电平读取外部ROM,一机器周期两个脉冲,与外部ROM的OE口相连;
➢ ATL/PROG: 扩展外部RAM时, ALE控制P0口的输出低8位地址送锁存器,低电平有效;PROG为编程脉冲的输入端 ;
➢ 𝑬𝑨/𝑽𝑷𝑷: 高电平先读内部,再读外部,低电平只读外部ROM;
1.4 最小系统
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyNRKssl-1688306214837)(E:\Notes\1. 技术\1. STC89C52RC\images\最小系统.bmp)]
1.5 数据类型和头文件
➢ #include<reg52.h> 头文件比51多一个T2定时器;
➢ <regx52.h>头文件中也定义了特殊功能位 P1_0 = P1^0
➢ srf: 8位特殊功能寄存器声明;
➢ srf16: 16位特殊功能寄存器声明;
➢ sbit:特殊功能位声明;
➢ bit:位变量声明;
➢ short / unsigned short int 2;
➢ Int / unsigned int 2;
➢ long / unsigned long int 4;
➢ float 4 ;
➢ double 8;
➢ char / unsigned char 1;
2 点亮LED
2.1 LED结构原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdqz1XeK-1688306214838)(E:\Notes\1. 技术\1. STC89C52RC\images\LED原理.bmp)]
2.1 代码实现
bsp_delay.h
#ifndef BSP_DELAY_H__
#define BSP_DELAY_H__
#include <REGX52.H>
#include <intrins.h>
/*延迟Xms*/
void Delay(unsigned int ms);
#endif
bsp_delay.c
#include "bsp_delay.h"
void Delay(unsigned int ms){
unsigned char i, j;
while(ms--){
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
bsp_led.h
#ifndef BSP_LED_H__
#define BSP_LED_H__
#include <REGX52.H>
#include "bsp_delay.h"
#include <intrins.h>
/*引脚配置*/
#define LED_Port P2
/*点亮LED*/
#define LED_Pin_0 0xff // 全部熄灭
#define LED_Pin_1 0xfe // 点了第1个
#define LED_Pin_2 0xfd // 点亮第2个
#define LED_Pin_3 0xfb // 点亮第3个
#define LED_Pin_4 0xf7 // 点亮第4个
#define LED_Pin_5 0xef // 点了第5个
#define LED_Pin_6 0xdf // 点亮第6个
#define LED_Pin_7 0xbf // 点亮第7个
#define LED_Pin_8 0x7f // 点亮第8个
#define LED_Pin_9 0x00 // 全部点亮
/*点亮熄灭宏*/
#define ON 1
#define OFF 0
#define LED(X,LED_Pin) if(X) \
LED_Port = LED_Pin; \
else \
LED_Port = 0xff;
/*实现流水灯*/
void LED_Water(void);
#endif
bsp_led.c
#include "bsp_led.h"
void LED_Water(void){
LED_Port = LED_Pin_1;
while(1){
Delay(500);
LED_Port = _crol_(LED_Port,1);
}
}
main.c
#include <REGX52.H>
#include "bsp_led.h"
void main(void){
#if 0
LED_Water();
#endif
while(1){
LED(ON,LED_Pin_1);
}
}
3 独立按键
3.1 独立按键
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAGsvqVE-1688306214838)(E:\Notes\1. 技术\1. STC89C52RC\images\独立按键原理.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IPKQuutZ-1688306214839)(E:\Notes\1. 技术\1. STC89C52RC\images\独立按键开发板.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fo7Hormr-1688306214839)(E:\Notes\1. 技术\1. STC89C52RC\images\按键消除抖动.bmp)]
3.2 代码实现
bsp_skey.h
#ifndef BSP_SKEY_H__
#define BSP_SKEY_H__
#include <REGX52.H>
#include "bsp_delay.h"
/*
获取按键值,1、2、3、4
*/
unsigned char Key_Scan(void);
#endif
bsp_skey.c
#include "bsp_skey.h"
unsigned char Key_Scan(void){
if(P3_1 == 0){
Delay(20); // 消除抖动
while(P3_1 == 0); // 保证到松开
Delay(20); // 消除抖动
return 1;
}
if(P3_0 == 0){
Delay(20);
while(P3_0 == 0);
Delay(20);
return 2;
}
if(P3_2 == 0){
Delay(20);
while(P3_2 == 0);
Delay(20);
return 3;
}
if(P3_3 == 0){
Delay(20);
while(P3_3 == 0);
Delay(20);
return 4;
}
return 0;
}
main.c
#include <REGX52.H>
#include "bsp_led.h"
#include "bsp_skey.h"
#define uint8_t unsigned char
void main(void){
/*
按键点亮对于的灯
*/
uint8_t keyNum = 0;
while(1){
keyNum = Key_Scan();
if(keyNum){
LED(ON,_crol_(LED_Pin_1,keyNum - 1));
}
}
}
4 点亮数码管
4.1 数码管原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iF0voolz-1688306214839)(E:\Notes\1. 技术\1. STC89C52RC\images\数码管驱动方式.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oleAbQsP-1688306214840)(E:\Notes\1. 技术\1. STC89C52RC\images\数码管原理图1.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p25l8iaz-1688306214841)(E:\Notes\1. 技术\1. STC89C52RC\images\数码管原理图1.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fV5Y2x2h-1688306214841)(E:\Notes\1. 技术\1. STC89C52RC\images\点亮数码管TX.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTqlhzDI-1688306214841)(E:\Notes\1. 技术\1. STC89C52RC\images\数码管动态显示TX.bmp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TfzuI65l-1688306214842)(E:\Notes\1. 技术\1. STC89C52RC\images\数码管循环TX.bmp)]
4.2 代码实现
bsp_nixie.h
#ifndef BSP_NIXIE_H__
#define BSP_NIXIE_H__
#include <REGX52.H>
#include "bsp_delay.h"
#define A0 P2_2
#define A1 P2_3
#define A2 P2_4
#define NIXIE_PORT P0
static unsigned char code Nixie_Table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// 点了第x个数码管,显示y
void Nixie(unsigned char x,y);
#endif
bsp_nixie.c
#include "bsp_nixie.h"
extern unsigned char code Nixie_Table[10];
void Nixie(unsigned char x,y){
// 先段选
switch(x){
case 8: A0 = 0; A1 = 0; A2 = 0; break;
case 7: A0 = 1; A1 = 0; A2 = 0; break;
case 6: A0 = 0; A1 = 1; A2 = 0; break;
case 5: A0 = 1; A1 = 1; A2 = 0; break;
case 4: A0 = 0; A1 = 0; A2 = 1; break;
case 3: A0 = 1; A1 = 0; A2 = 1; break;
case 2: A0 = <
最低0.47元/天 解锁文章
2277

被折叠的 条评论
为什么被折叠?



