救急!请问单片机C语言IO口如何定义啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了救急!请问单片机C语言IO口如何定义啊相关的知识,希望对你有一定的参考价值。

我单片机使用C语言编写,我想调用P1.0和P1.1口,但是开头得定义,请问高手如何定义啊

参考技术A 首先要有这个头文件: #include <AT89X52.H> //根据你用的单片机类型而定
这个头文件已经有了端口的定义,不过用的时候不能写 P1.1,而应该是P1_1(注意:P要大写)

如果要自己重新定义的话:打开这个头文件,修改就行了(里面的内容很简单的,一看就可以明白它是怎样定义的)

也可以调用头文件后在程序里重新给它命名,但没有什么必要。

(对了,我用的软件是keil)
参考技术B /**-------------------------------------------------------------------------------
〖说明〗配置文件
〖文件〗d:\user\BCB\C51BBS 仿真器\编程器\config.h @2002.07.05
〖作者〗新太科技 开发八部 张晓龙 E-mail: c51bbs@vip.163.com
〖修改〗 改为PICC用 叶存树 E-mail: ycs_5968@163.com
〖版本〗V1.00A Build 0705
---------------------------------------------------------------------------------*/
typedef unsigned char BYTE; //注意:有分号
typedef unsigned int WORD;
typedef unsigned long DWORD;

#define Byte unsigned char //注意:无分号
#define Word unsigned int
#define DWord unsigned long

#define bool bit
#define true 1
#define false 0
/**********************
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;

sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;

sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
sbit P3_2 = P3^2;
sbit P3_3 = P3^3;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;
********************************/
//以下是二进制输入宏
#define B0000_0000 0x00
#define B0000_0001 0x01
#define B0000_0010 0x02
#define B0000_0011 0x03
#define B0000_0100 0x04
#define B0000_0101 0x05
#define B0000_0110 0x06
#define B0000_0111 0x07
#define B0000_1000 0x08
#define B0000_1001 0x09
#define B0000_1010 0x0A
#define B0000_1011 0x0B
#define B0000_1100 0x0C
#define B0000_1101 0x0D
#define B0000_1110 0x0E
#define B0000_1111 0x0F

#define B0001_0000 0x10
#define B0001_0001 0x11
#define B0001_0010 0x12
#define B0001_0011 0x13
#define B0001_0100 0x14
#define B0001_0101 0x15
#define B0001_0110 0x16
#define B0001_0111 0x17
#define B0001_1000 0x18
#define B0001_1001 0x19
#define B0001_1010 0x1A
#define B0001_1011 0x1B
#define B0001_1100 0x1C
#define B0001_1101 0x1D
#define B0001_1110 0x1E
#define B0001_1111 0x1F

#define B0010_0000 0x20
#define B0010_0001 0x21
#define B0010_0010 0x22
#define B0010_0011 0x23
#define B0010_0100 0x24
#define B0010_0101 0x25
#define B0010_0110 0x26
#define B0010_0111 0x27
#define B0010_1000 0x28
#define B0010_1001 0x29
#define B0010_1010 0x2A
#define B0010_1011 0x2B
#define B0010_1100 0x2C
#define B0010_1101 0x2D
#define B0010_1110 0x2E
#define B0010_1111 0x2F

#define B0011_0000 0x30
#define B0011_0001 0x31
#define B0011_0010 0x32
#define B0011_0011 0x33
#define B0011_0100 0x34
#define B0011_0101 0x35
#define B0011_0110 0x36
#define B0011_0111 0x37
#define B0011_1000 0x38
#define B0011_1001 0x39
#define B0011_1010 0x3A
#define B0011_1011 0x3B
#define B0011_1100 0x3C
#define B0011_1101 0x3D
#define B0011_1110 0x3E
#define B0011_1111 0x3F

#define B0100_0000 0x40
#define B0100_0001 0x41
#define B0100_0010 0x42
#define B0100_0011 0x43
#define B0100_0100 0x44
#define B0100_0101 0x45
#define B0100_0110 0x46
#define B0100_0111 0x47
#define B0100_1000 0x48
#define B0100_1001 0x49
#define B0100_1010 0x4A
#define B0100_1011 0x4B
#define B0100_1100 0x4C
#define B0100_1101 0x4D
#define B0100_1110 0x4E
#define B0100_1111 0x4F

#define B0101_0000 0x50
#define B0101_0001 0x51
#define B0101_0010 0x52
#define B0101_0011 0x53
#define B0101_0100 0x54
#define B0101_0101 0x55
#define B0101_0110 0x56
#define B0101_0111 0x57
#define B0101_1000 0x58
#define B0101_1001 0x59
#define B0101_1010 0x5A
#define B0101_1011 0x5B
#define B0101_1100 0x5C
#define B0101_1101 0x5D
#define B0101_1110 0x5E
#define B0101_1111 0x5F

#define B0110_0000 0x60
#define B0110_0001 0x61
#define B0110_0010 0x62
#define B0110_0011 0x63
#define B0110_0100 0x64
#define B0110_0101 0x65
#define B0110_0110 0x66
#define B0110_0111 0x67
#define B0110_1000 0x68
#define B0110_1001 0x69
#define B0110_1010 0x6A
#define B0110_1011 0x6B
#define B0110_1100 0x6C
#define B0110_1101 0x6D
#define B0110_1110 0x6E
#define B0110_1111 0x6F

#define B0111_0000 0x70
#define B0111_0001 0x71
#define B0111_0010 0x72
#define B0111_0011 0x73
#define B0111_0100 0x74
#define B0111_0101 0x75
#define B0111_0110 0x76
#define B0111_0111 0x77
#define B0111_1000 0x78
#define B0111_1001 0x79
#define B0111_1010 0x7A
#define B0111_1011 0x7B
#define B0111_1100 0x7C
#define B0111_1101 0x7D
#define B0111_1110 0x7E
#define B0111_1111 0x7F

#define B1000_0000 0x80
#define B1000_0001 0x81
#define B1000_0010 0x82
#define B1000_0011 0x83
#define B1000_0100 0x84
#define B1000_0101 0x85
#define B1000_0110 0x86
#define B1000_0111 0x87
#define B1000_1000 0x88
#define B1000_1001 0x89
#define B1000_1010 0x8A
#define B1000_1011 0x8B
#define B1000_1100 0x8C
#define B1000_1101 0x8D
#define B1000_1110 0x8E
#define B1000_1111 0x8F

#define B1001_0000 0x90
#define B1001_0001 0x91
#define B1001_0010 0x92
#define B1001_0011 0x93
#define B1001_0100 0x94
#define B1001_0101 0x95
#define B1001_0110 0x96
#define B1001_0111 0x97
#define B1001_1000 0x98
#define B1001_1001 0x99
#define B1001_1010 0x9A
#define B1001_1011 0x9B
#define B1001_1100 0x9C
#define B1001_1101 0x9D
#define B1001_1110 0x9E
#define B1001_1111 0x9F

#define B1010_0000 0xA0
#define B1010_0001 0xA1
#define B1010_0010 0xA2
#define B1010_0011 0xA3
#define B1010_0100 0xA4
#define B1010_0101 0xA5
#define B1010_0110 0xA6
#define B1010_0111 0xA7
#define B1010_1000 0xA8
#define B1010_1001 0xA9
#define B1010_1010 0xAA
#define B1010_1011 0xAB
#define B1010_1100 0xAC
#define B1010_1101 0xAD
#define B1010_1110 0xAE
#define B1010_1111 0xAF

#define B1011_0000 0xB0
#define B1011_0001 0xB1
#define B1011_0010 0xB2
#define B1011_0011 0xB3
#define B1011_0100 0xB4
#define B1011_0101 0xB5
#define B1011_0110 0xB6
#define B1011_0111 0xB7
#define B1011_1000 0xB8
#define B1011_1001 0xB9
#define B1011_1010 0xBA
#define B1011_1011 0xBB
#define B1011_1100 0xBC
#define B1011_1101 0xBD
#define B1011_1110 0xBE
#define B1011_1111 0xBF

#define B1100_0000 0xC0
#define B1100_0001 0xC1
#define B1100_0010 0xC2
#define B1100_0011 0xC3
#define B1100_0100 0xC4
#define B1100_0101 0xC5
#define B1100_0110 0xC6
#define B1100_0111 0xC7
#define B1100_1000 0xC8
#define B1100_1001 0xC9
#define B1100_1010 0xCA
#define B1100_1011 0xCB
#define B1100_1100 0xCC
#define B1100_1101 0xCD
#define B1100_1110 0xCE
#define B1100_1111 0xCF

#define B1101_0000 0xD0
#define B1101_0001 0xD1
#define B1101_0010 0xD2
#define B1101_0011 0xD3
#define B1101_0100 0xD4
#define B1101_0101 0xD5
#define B1101_0110 0xD6
#define B1101_0111 0xD7
#define B1101_1000 0xD8
#define B1101_1001 0xD9
#define B1101_1010 0xDA
#define B1101_1011 0xDB
#define B1101_1100 0xDC
#define B1101_1101 0xDD
#define B1101_1110 0xDE
#define B1101_1111 0xDF

#define B1110_0000 0xE0
#define B1110_0001 0xE1
#define B1110_0010 0xE2
#define B1110_0011 0xE3
#define B1110_0100 0xE4
#define B1110_0101 0xE5
#define B1110_0110 0xE6
#define B1110_0111 0xE7
#define B1110_1000 0xE8
#define B1110_1001 0xE9
#define B1110_1010 0xEA
#define B1110_1011 0xEB
#define B1110_1100 0xEC
#define B1110_1101 0xED
#define B1110_1110 0xEE
#define B1110_1111 0xEF

#define B1111_0000 0xF0
#define B1111_0001 0xF1
#define B1111_0010 0xF2
#define B1111_0011 0xF3
#define B1111_0100 0xF4
#define B1111_0101 0xF5
#define B1111_0110 0xF6
#define B1111_0111 0xF7
#define B1111_1000 0xF8
#define B1111_1001 0xF9
#define B1111_1010 0xFA
#define B1111_1011 0xFB
#define B1111_1100 0xFC
#define B1111_1101 0xFD
#define B1111_1110 0xFE
#define B1111_1111 0xFF

如何巧妙利用4个IO口驱动12个LED灯

在电路设计过程中有时经常遇到单片机的IO口不够用的情况。对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题。例如当我们在设计中遇到许多LED灯需要控制的时候,而单片机的IO口又不够用,我们又不希望增加成本,此时我们可以采用“查理复用”(Charlieplexing)的方式去解决这个问题。

“查理复用”(Charlieplexing)作为一种LED显示器多路复用的方法,能够使人们利用少量的IO口控制很多的LED灯,在LED领域应用广泛。

当使用 Charlieplexing 方法,n引脚可以有nx(n-1)个组合。也就是说,它可以用n个引脚驱动nx(n-1)个LED二极管。而传统的行列复用则需要更多的引脚来驱动相同的LED二极管,也就是说要驱动6个LED,用行列式需要5个口,而这种方法只要3个IO口。LED越多,节省的IO越多。比方说驱动20个LED,行列式要用9个,而这种只要5个。

下面我们来看看设计的原理吧!!!!!

一、原理图分析

这个电路用到了单片机GPIO的三种状态:

  • 高电平

  • 低电平

  • 高阻态

所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。

各个LED灯单独亮起,分为12种情况。(原理图中的二极管为LED灯)

1、当只有D1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)

2、当只有D2亮起时,单片机各GPIO的状态如下:

3、当只有D3亮起时,单片机各GPIO的状态如下:

4、当只有D4亮起时,单片机各GPIO的状态如下:

5、当只有D5亮起时,单片机各GPIO的状态如下:

6、当只有D6亮起时,单片机各GPIO的状态如下:

7、当只有D7,D8,D9,D10,D11,D12任意一个亮起时,单片机各GPIO的状态如上分析,这里不在叙述了。

二、设计要求

这种方式能够实现的基础是:

  • 单片机GPIO的三个状态:高电平、低电平、高阻态。

  • GPIO能承受的电流要大于LED灯流过的电流。

  • LED具有单向导电性。

查理复用设计的方法:

  • 任意两个GPIO引脚之间串入两个LED,这两个LED为并联,且LED方向相反。

  • 当你想要点亮某个特定的LED时,就将其两端所连接到的GPIO引脚分别设定为高电平和低电平,其它剩余的GPIO引脚设定为高阻态。

程序的编写和控制简介

对于使用了 查理复用算法的LED控制电路,程序开发步骤如下:

  • 初始化所有端口为高阻态。

  • 初始化指定LED 灯对应的两个管脚为推挽输出。

  • 设置两个管脚的高低电平。

三、设计中的问题

查理复用“这样的电路接法也会引发一些问题如下:

首先,LED亮起时完全由单片机的GPIO输出电流驱动,所以对于GPIO的电流驱动能力有一定的要求。设计电路时要注意查询自己使用的MCU的电流驱动能力,下图是GD32和STM32单片机中对GPIO电流驱动能力的说明:

GD32E230C8T6单片机GPIO最大输出电流如下:

STM32F105,STM32F107单片机GPIO输出电流如下:

其次,如果出现了某个LED开路或短路的情况,电流的流向会被打乱,LED亮起来的逻辑会变得错乱。最坏的情况下,电路会对GPIO索取大电流,导致单片机损坏。下图是假设D1和D3短路,那么在点亮D11时,D5也会亮起:

四、进阶设计

问题:如果要同时亮起两个以上的LED,怎么办?

方法:交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。

注意:如果要同时亮起较多LED灯,比如大规模的LED点阵,还要注意一些新的问题,这里不在展开叙述了。

要求:在任意时刻只要有一个端口高电平,一个端口低电平,其余两个端口高阻态,那么就只有一个LED发光。依次循环扫描就成流水灯,速度快了就达到视觉全亮。想控制任意几个LED亮灭就与控制多位数码管动态显示一样。唯一的前提条件是MCU的端口可以设置为推挽和高阻模式。

拓展:有了上述方法之后,我们可以利用1个GPIO控制2个LED显示4种状态。

要实现4种状态:

  • 红灯亮,绿灯灭

  • 红灯灭,绿灯亮

  • 都灭

  • 都亮

分析同上,这里不在叙述了。(也是需要单片机IO口模式能设置为推挽模式和高阻态)

注意;两个LED灯总的导通压降要求大于3.3V。若总压降小于3.3V可能会出现当Port设为浮空高阻态时,出现两个LED灯同时点亮的风险。(当Port设为浮空高阻态时,需要同时灭)

以上是关于救急!请问单片机C语言IO口如何定义啊的主要内容,如果未能解决你的问题,请参考以下文章

我看的是郭天祥老师的51单片机C语言教程,关于“串行口打印在调试程序中的应用”一节中

单片机c语言宏定义有几种

单片机C语言里怎么定义BYTE型的数组?

请问51单片机最大可以运行多大的程序,最好是STC的,C语言

请问单片机c语言中可不可以把一个字符串转化成变量名?

单片机C语言编译器的问题