LED 点阵实验
代码实现目标: 在点阵屏上点亮一个点
代码语言:javascript复制#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存
器
#include "intrins.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO 口--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
***********
* 函数名: Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函数功能: 通过595 发送四个字节的数据
* 输入: dat1:第4 个595 输出数值
* * dat2: 第5 个595 输出数值
* * dat3:第2 个595 输出数值
* * dat4:第1 个595 输出数值
* 输出: 无
*********************************************************************
**********/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a ) //发送8 位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a ) //发送8 位数
{
SER = dat2 >> 7; //从最高位开始发送
dat2 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a ) //发送8 位数
{
SER = dat3 >> 7; //从最高位开始发送
dat3 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a ) //发送8 位数
{
SER = dat4 >> 7; //从最高位开始发送
dat4 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
/********************************************************************
***********
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*********************************************************************
**********/
void main()
{
while(1)
{
Hc595SendByte(0xff,0xfe,0x00,0x01);
}
}
第1 个输出的是0xff,也就是后八列,列是低电平有效,所以这八列是无效的,点不亮。
第2 个输出的是0xfe,也就是前八列,列是低电平有效,所以这八列有七列是无效的,点不亮,只有第一列是低电平,是有效的,第一列上的灯可以点亮。
注意:这里是“可以”点亮, 还必须要行为高电平才一定点亮。
第3 个输出的是0x00,也就是后八行(P9-P16),行是高电平有效,所以这八列是无效的,点不亮:
第4 个输出的是0x01,也就是前八行(P1-P8),行是高电平有效,所以这八行有七行是无效的,点不亮,只有第一行是高电平,是有效的,第一行上的灯可以点亮。注意:这里是“可以”点亮,还必须要是列为低电平才一定点亮。
直流电机实验
在未学习PWM 之前,我们先简单使用GPIO 来控制电机的正反转和停止。不能直接使用GPIO 来驱动电机,而需要相应的驱动芯片来实现。
驱动芯片是ULN2003,该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来驱动我们的直流电机,还可用来驱动五线四相步进电机,比如28BYJ-48 步进电机。
代码实现目标
代码语言:javascript复制#include "reg52.h" //此文件中定义了单片机的一些特殊功能
寄存器
#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit moto=P1^0;
/****************************************************************
***************
* 函数名: delay
* 函数功能: 延时函数,i=1 时,大约延时10us
*****************************************************************
**************/
void delay(u16 i)
{
while(i--);
}
/****************************************************************
***************
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*****************************************************************
**************/
void main()
{
u8 i;
moto=0; //关闭电机
for(i=0;i<100;i ) //循环100 次,也就是大约5S
{
moto=1; //开启电机
delay(5000); //大约延时50ms
}
moto=0; //关闭电机
while(1)
{
}
}