数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1614|回复: 24

[C51] 已解决,STC控制12v继电器问题

[复制链接]
发表于 2022-9-17 16:34:32 来自手机浏览器 | 显示全部楼层
tjjtds1 发表于 2022-9-17 16:01
stc15F104w,用的p3^1,正常的弱上拉

弱上拉驱动能力不足,改为推挽方式。
回复 支持 反对

使用道具 举报

发表于 2022-9-17 21:06:19 | 显示全部楼层
tjjtds1 发表于 2022-9-17 20:23
不会啊

那个寄存器推挽输出部分写的看不懂,也不会算.
  1. P3M1&=(~(0x01<<1));
  2. P3M0|=(0x01<<1);
复制代码



回复 支持 反对

使用道具 举报

发表于 2022-9-18 15:35:05 | 显示全部楼层
tjjtds1 发表于 2022-9-18 11:22
为什么这么写呢?原理我懂,这个写的方法,stc文档看了半小时没看明白。
从p31-p37都怎么写啊? ...

从STC的文档看,PxM1第n位设置为0、PxM0第n位设置为1,I/O设置为推挽输出模式,以P31为例,这里的x就是3,n就是1。P3M1第1位设置为0,就是第1位与上0其它位与上1,就是P3M1与上二进制数11111101,就是十六进制数0xFD,对我来说,瞬间算出第1位为0其它位为1这个数是多少是比较困难的,这个活可以让编译器来做。

第n位为1的数可以这样写:
0为为1:(0x01<<0)
1为为1:(0x01<<1)
2为为1:(0x01<<2)
……
7为为1:(0x01<<7)

第n位为1的数按位取反可以这样写:
0为为1按位取反:(~(0x01<<0))
1为为1按位取反:(~(0x01<<1))
2为为1按位取反:(~(0x01<<2))
……
7为为1按位取反:(~(0x01<<7))


二进制数11111101就是二进制数00000010按位取反,就是(~(0x01<<1))。

如果要同时操作多个位,同时与、或就可以了,如同时把P31和P37设置为推挽输出,可以这样写:
  1. P3M1&=(~((0x01<<1)|(0x01<<7)));
  2. P3M0|=((0x01<<1)|(0x01<<7));
复制代码
虽然这样写没问题,但如果要操作的位数很多时,表达式会很长,写起来和看起来都不方便,可以把第n位为1的数都定义成好理解的宏,使用时引用宏即可,如:
  1. #define        BIT0        0x01
  2. #define        BIT1        0x02
  3. #define        BIT2        0x04
  4. #define        BIT3        0x08
  5. #define        BIT4        0x10
  6. #define        BIT5        0x20
  7. #define        BIT6        0x40
  8. #define        BIT7        0x80

  9. #define        BIT8        0x0100
  10. #define        BIT9        0x0200
  11. #define        BIT10        0x0400
  12. #define        BIT11        0x0800
  13. #define        BIT12        0x1000
  14. #define        BIT13        0x2000
  15. #define        BIT14        0x4000
  16. #define        BIT15        0x8000
复制代码
上面举例的同时把P31、P37设置为推挽输出可以这样写:
  1. P3M1&=(~(BIT1|BIT7));
  2. P3M0|=(BIT1|BIT7);
复制代码



回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-26 14:14 , Processed in 0.093600 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表