虽然c51单片机已经算是过时了,但是确是初学者最好的选择,因为很容易上手,其他开发板的操作也是大同小异,学会了stc89c52之后,再学习其他板子就会相对简单很多。其实学习stc89c52开发板感觉是挺简单的,至于开发板的组成、电子元件、电路布线等问题还需要大家自己去其他地方研究,今天就记录点亮一个LED灯以及用左移实现流水灯。
目录
3、总结:
1、点亮一个LED
我们先看一下stc89c52rc的LED模块的原理图
我们看到在左端提供了一个电源,所以左边为高电平,要想点亮哪个LED,则只需要给相应LED的右端给低电平即可。如果我们要点亮D1,那么就只将P20端口赋低电平即可。
第一种方式:
#include<reg52.h> //包含头文件
//因为我们使用的单片机可用内存都不是很大,所以在使用相应类型时还是需要有一定的考虑
typedef unsigned char u8; //重定义char类型(可表示范围0~2^7-1)
typedef unsigned int u16; //重定义int类型(可表示范围0~2^15-1)
sbit LED0 = P2^0; //重定义一下端口,便于使用
//我们可以从"reg52.h"这个头文件中查到定义端口的固定形式
void main()
{
while(1) //死循环,一般在单片机中的动作都需要不断重复,所以写入死循环中
{
LED0 = 0; //给P2.0端口赋低电平
}
}
第二种方式:
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
void main()
{
while(1)
{
P2 = 0xfe; //直接对P2端口整体赋值,P2.7-P2.0刚好8个端口
//从高位P2.7开始 1111 1110即16进制0xfe
}
}
2、左移实现流水灯
位运算操作位移:分为逻辑位移和算术位移, 逻辑移位是不考虑符号位的移位,算术移位是考虑符号位的移位。但是在我们的单片机的学习中,基本上都是逻辑位移。这里就简单给大家介绍一下逻辑左移和逻辑右移。
左移:<<
整体左移,舍去高位,低位补零。通俗讲就是 原数 *2^n(n为位移数)
右移:>>
整体右移,舍去低位,高位补零。通俗讲就是 原数 /2^n(n为位移数)
#include<reg52.h>
#include<intrins.h>//包含左移的库函数,但是他的左移有一点区别
typedef unsigned char u8;
typedef unsigned int u16;
#define LED_PORT P2//宏定义P2端口
void delay_ten_us(u16 ten_us)//延时函数,后面传参是以10us为单位,如delay_ten_us(1000)
//就是延时10000us = 10ms,但是实际上延时的时间可能介于5-10ms之间
{
while(ten_us--);
}
void main()
{
while(1)
{
u8 i = 0;
LED_PORT = 0xfe;//让第一个灯亮
delay_ten_us(50000);
for(i=0;i<7;i++)
{
LED_PORT = _crol_(LED_PORT, 1); //库函数实现左移,从D1亮到D8
delay_ten_us(50000);
/* P2 = ~(0x01<<i); //直接实现左移
delay_ten_us(50000); */
}
for(i=0;i<7;i++)
{
LED_PORT = _cror_(LED_PORT, 1);//库函数实现左移,从D8亮到D1
delay_ten_us(50000);
}
}
}
_crol_(LED_PORT, 1) ![](https://i-blog.csdnimg.cn/blog_migrate/d715740b5ee14a044328b45c8fc511af.png)
_cror_(LED_PORT, 1)也一样,只是函数名不同,大家可以自己理解推理 一下,有助于大家掌握知识。
3、总结:
这里主要就是学习对端口的操作,对硬件的理解,位移操作,以及看懂电路图。这实验虽然很简单,但是对于学习单片机以及各种开发板来说,都是理解的开始,以后的学习中其实内容可能大部分都是很相似,赋予某个端口高电平或者低电平即可,逐渐的了解各种实验,知识点才能得到扩展,今后会不断更新stc89c52的实验,从易到难,希望能帮到你。