江科大 51单片机入门教程
https://www.bilibili.com/video/BV1Mb411e7re?p=4&vd_source=169e0bcb4f2e42dcc73afa3b48bb3cac
●单片机 英文 MicroControllerunit 简称MCU
●内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能
●单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
●单片机跟计算机相比,算是一个袖珍版的计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但MCU成本低、体积小、结构简单,在生活和 工业控制领域大有所为
●学习使用单片机是了解计算机原理与结构的最佳选择
●51单片机是对兼容英特尔8051指令系统的单片机的统称
●所属系列:51单片机系列
●公司:STC公司
●位数:8位
●RAM:512字节
●ROM:8K(Flash)
●工作频率:12MHZ
●STC89C52系列单片机命名规则
STC – 公司
89 – 芯片系列 STC12T/6T 8051
C – 工作电压:C:5.5V-3.8V LE:3.6V-2.4V/3.4V-2.4V
52 – 程序空间及RAM空间大小。
如:
51是4K字节程序空间及512字节RAM空间;
52是8K字节程序空间及512字节RAM空间;
53是12K字节程序空间及512字节RAM空间;
14是14K字节程序空间及512字节RAM空间;
54是16K字节程序空间及1280字节RAM空间;
58是32K字节程序空间及1280字节RAM空间;
510是40K字节程序空间及1280字节RAM空间;
512是48K字节程序空间及1280字节RAM空间;
514是56K字节程序空间及1280字节RAM空间;
516是62K字节程序空间及1280字节RAM空间;
40 – 工作频率
I – 工作温度范围:I:工业级 -40℃-85摄氏度 C:商业级 0℃-70℃
PDIP – 封装类型:如 PDIP,LQFP,PLCC,PQFP
40 – 管脚数
在用STC-ISP将点灯程序下载到开发板上时,一直显示正在检测单片机,点灯失败;
失败原因:STC-ISP上单片机型号选择错误,需要严格按照所使用的的单片机型号选,我的单片机型号是STC89C52RC,我还按照视频教程选择了STC89C52
#include
void main()
{
P2 = 0x69; //0110 1001
while(1);
}
点灯代码和之前学的C还是有点不一样的,主函数不需要返回值;之前的是
int main()
{
...
return 0;
}
当我试着按照之前的习惯,return 0 时,出现warning
#include
void DelayXms( unsigned int X );
void main()
{
while(1){
P2 = 0xAA; //1010 1010
DelayXms(1000);
P2 = 0x55; //0101 0101
DelayXms(1000);
}
}
void DelayXms( unsigned int X )
{
unsigned char i,j;
while(X--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
1.枚举
#include
#include
void DelayXms( unsigned int X );
void DelayX500ms( unsigned int X );
void main()
{
while(1){
P2 = 0xFE; //1111 1110
// DelayXms(500);
DelayX500ms(2);
P2 = 0xFD; //1111 1101
DelayX500ms(2);
P2 = 0xFB; //1111 1011;
DelayX500ms(2);
P2 = 0xF7; //1111 0111;
DelayX500ms(2);
P2 = 0xEF; //1110 1111;
DelayX500ms(2);
P2 = 0xDF;
DelayX500ms(2);
P2 = 0xBF;
DelayX500ms(2);
P2 = 0x7F;
DelayX500ms(2);
}
}
void DelayXms( unsigned int X )
{
unsigned char i,j;
while(X--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void DelayX500ms( unsigned int X ) //@12.000MHz
{
unsigned char i, j, k;
while(X--){
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
}
2.位运算
#include
void DelayXms( unsigned int xms );
void main()
{
unsigned char LEDNum = 0;
while(1){
P2 = ~(0x01 << LEDNum);
LEDNum++;
LEDNum %= 8;
DelayXms(500);
}
}
void DelayXms( unsigned int xms )
{
unsigned char i,j;
while(xms--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
#include
void main()
{
while(1){
if(P3_1 == 0){
P2_0 = 0;
}else{
P2_0 = 1;
}
}
}
这里需要有一个非常重要的注意点,那就是按键抖动,有硬件消抖,也有软件消抖;我们这里采用软件消抖;
#include
void DelayXms( unsigned int xms );
void main()
{
while(1){
if(P3_1 == 0){
DelayXms(20);
while(P3_1 == 0);
DelayXms(20);
P2_0 = ~P2_0;
}
}
}
void DelayXms( unsigned int xms )
{
unsigned char i,j;
while(xms--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
#include
void DelayXms( unsigned int xms );
void main()
{
unsigned char LEDNum = 0;
while(1){
if(P3_1 == 0){
DelayXms( 20 );
while(P3_1 == 0);
DelayXms( 20 );
LEDNum++;
P2 = ~LEDNum;
}
}
}
void DelayXms( unsigned int xms )
{
unsigned char i,j;
while(xms--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
#include
void DelayXms( unsigned int xms );
void main()
{
unsigned char LEDNum = 0;
P2 = 0xFE;
while(1){
if(P3_1 == 0){
DelayXms( 20 );
while(P3_1 == 0);
DelayXms( 20 );
LEDNum++;
LEDNum %= 8;
P2 = ~(0x01 << LEDNum);
}
if(P3_0 == 0){
DelayXms( 20 );
while(P3_0 == 0);
DelayXms( 20 );
if(LEDNum == 0){
LEDNum = 7;
}else{
LEDNum--;
}
/* LEDNum += 7;
LEDNum %= 8;
*/
P2 = ~(0x01 << LEDNum);
}
}
}
void DelayXms( unsigned int xms )
{
unsigned char i,j;
while(xms--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
千里之行,始于足下。我已经会点灯,离做出智能机器人不远了!!!