利用OLED打印调试信息: 控制PC13指示灯点灯的实验

打印 上一主题 下一主题

主题 1819|帖子 1819|积分 5457


  • Do口暗的时候才是高电平,由于光敏电阻传感器的高电平是依赖LM393电压比较器上引脚进入高阻态再加上上拉电阻上拉产生的高电平
  • DO口什么时候会输出高阻态?电压比较器的正极输入电压大于负极输入电压,而正极输入电压是光敏电阻分得的电压,光敏电阻的阻值越大,已分得的电压就越大,所以在光线较暗时,阻值大,分得电压大,如许的话更倾向于输出一个高阻态,也就是高电平.
  • pb6引脚输入的如果是低电平,说明负极的电压大,负极输入的电压是电位器的下半部分分得的电压,如许就需要调节电位器,一样平常来说,如果顺时针调电位器,负极分得的电压更多一点,如果调到临界就是明亮的状态,由于一旦进入明亮状态正极输入的电压就减小了,更有可能输出低电平.
  1. 控制电路中光敏电阻,控制PC13指示灯点灯的实验.
  2. #include "stm32f10x.h"
  3. #include "OLED.h"
  4. // 12_利用OLED打印调试信息
  5. // 初始化光敏电阻传感器的DO口GPIO引脚 PB6
  6. void LDRSensor_Init(void) {
  7.     // 开启 GPIOB 时钟
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  9.     // 配置 PB6 为上拉输入模式
  10.     GPIO_InitTypeDef GPIO_InitStructure;
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  15. }
  16. // 初始化PC13指示灯
  17. void LED_Init(void) {
  18.     GPIO_InitTypeDef GPIO_InitStructure;
  19.     // 开启 GPIOC 时钟
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  21.     // 配置 PC13 为开漏输出模式
  22.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  23.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出模式
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.     GPIO_Init(GPIOC, &GPIO_InitStructure);
  26.     // 设置PC13引脚默认输出高阻态,PC13指示灯熄灭
  27.     GPIO_SetBits(GPIOC, GPIO_Pin_13);
  28. }
  29. void OLED_UpdateDisplay(uint8_t pb6_state, uint8_t pc13_state) {
  30.     //pb6接的是光敏电阻传感器的DO口,所以这里监测的是光敏电阻传感器DO口输出的是高/低电平
  31.     // 先清屏
  32.     OLED_Clear();
  33.     // 第一行:光线状态
  34.     OLED_ShowString(1, 1, "Light:");
  35.     //pb6_state=1时,高电平,光线暗.前提是要调到临界的状态.
  36.     OLED_ShowString(1, 8, pb6_state ? "Dark" : "Bright");
  37.     //Do口暗的时候才是高电平,因为光敏电阻传感器的高电平是依靠LM393电压比较器
  38.     //上引脚进入高阻态再加上上拉电阻上拉产生的高电平
  39.     //DO口什么时候会输出高阻态?电压比较器的正极输入电压大于负极输入电压,
  40.     //而正极输入电压是光敏电阻分得的电压,光敏电阻的阻值越大,已分得的电压就越大
  41.     //所以在光线较暗时,阻值大,分得电压大,这样的话更倾向于输出一个高阻态,也就是高电平.
  42.     //pb6引脚输入的如果是低电平,说明负极的电压大,负极输入的电压是电位器的下半部分分得的电压,
  43.     //这样就需要调节电位器,一般来说,如果顺时针调电位器,负极分得的电压更多一点
  44.     //如果调到临界就是明亮的状态,因为一旦进入明亮状态正极输入的电压就减小了,更有可能输出低电平
  45.     // 第二行:PB6引脚输入状态
  46.     OLED_ShowString(2, 1, "DO Out:");
  47.     OLED_ShowString(2, 9, pb6_state ? "High" : "Low");
  48.     // 第三行:PC13引脚输出状态
  49.     OLED_ShowString(3, 1, "PC13 Out:");
  50.     OLED_ShowString(3, 11, pc13_state ? "Open" : "Low");
  51.     // 第四行:PC13指示灯状态
  52.     OLED_ShowString(4, 1, "PC13 LED:");
  53.     OLED_ShowString(4, 11, pc13_state ? "Off" : "On");
  54. }
  55. int main(void) {
  56.     // 初始化所有外设
  57.     LDRSensor_Init();
  58.     LED_Init();
  59.     OLED_Init();
  60.     uint8_t last_pb6_state = 0xFF; // 初始化为一个无效值
  61.     while (1) {
  62.         // 获取当前PB6引脚的输入电平以及PC13的输出电平
  63.         uint8_t current_pb6_state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6);
  64.         // 仅在状态变化时更新显示内容
  65.         if (current_pb6_state != last_pb6_state) {
  66.             // 控制LED
  67.             if (current_pb6_state == Bit_SET) {
  68.                 GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 点亮LED
  69.             } else {
  70.                 GPIO_SetBits(GPIOC, GPIO_Pin_13);   // 熄灭LED
  71.             }
  72.             // 更新显示内容
  73.             OLED_UpdateDisplay(current_pb6_state, GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13));
  74.             // 更新当前pb6引脚的状态
  75.             last_pb6_state = current_pb6_state;
  76.         }
  77.     }
  78. }
复制代码

PC13 open,open是高阻态,开路.



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表