51单片机的红色按钮有什么用?为什么我的单片机光发的很弱,是不是接触不良?
1条回答 默认 最新
关注 - 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7599095
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:51单片机练习题:1.采用两种定时方式,使发光二极管闪烁。2.采用中断的方式,利用数码管显示,编写从100开始倒计时的程序(可显示高位0)。
- 除此之外, 这篇博客: 51单片机~光敏传感器,比较器(模电,运放,放大原理)原理芯片中的 51单片机之光敏传感器,比较器原理芯片 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
(一)光敏传感器说明:
(二)电压比较器功能:
(二)输出模式:
由于比较器的输出电压在0~36V,所以要是把Vout接在比较器的VCC上的话,Vout的电压便也输出 0~ 36V,导致比较器无法和芯片沟通传递数据,所以要在Vout上加一个开漏输出的上拉电阻,使其输出5V电压,方便和其他电器和芯片沟通。
(2).强推挽输出:(当输出为高(低)电平时,还有驱动能力,因为驱动电流比较大)
既可以输出高电平也可以输出低电平,当输入为1时,下方晶体管(当三极管来看待),导通右边Vout输出为低电平,此时有灌电流。
当输如=入为0时,下方晶体管不导通,上方导通VDD电压下来,使Vout输出为高电平。
(3).难点:参数
共模输入电压:
就是限制比较器的V+和V-的电压范围,以此来使Vout的输出在一个正常范围内。
我们单片机上是VCC-1.5V或者2V。
所以我们输入的两个电压必须在0~3.5V(VCC-1.5V=3.5V)。
(3).输入失调电压:(输入失调电流是由输入失调电压导致的)
计算:(放大倍数)
(4).电路分析:(手写是电路原理)
GM-OUT就是Vout,U14就是LM393,J15就是电路板上的排针,只要把5和6连起来就可以将光敏电阻接到P1.7上,此时将KS-OUT,ZS-OUT,GM-out接到指示灯上,即可完成光敏控制电路。
(5)家用安全电压知识:
(6)代码:
光控电路代码:继电器控制光控电路:#include"reg52.h" typedef signed char int8; typedef signed int int16; typedef signed long int32; typedef unsigned char uint8; //字符型 typedef unsigned int uint16; typedef unsigned long uint32; sbit GK =P1^7; sbit JDQ = P2 ^ 0; sbit SHIFT_CLOCK_595 = P1 ^ 4; //74HC595 sbit data_A_595 = P1 ^ 0; sbit LATCH_CLOCK_595 = P2 ^ 3; void delay(uint16 x_ms) //延时毫秒 { uint16 i,j; for(i=x_ms;i>0;i--) for(j=114;j>0;j--); } void xp74HC595(uint16 dat) { uint16 i; for (i = 0; i < 8; i++) { data_A_595 = (dat << i) & 0X80; SHIFT_CLOCK_595 = 0; //时钟上升沿 SHIFT_CLOCK_595 = 1; } LATCH_CLOCK_595 = 0; //给锁存器脉冲,上升沿 LATCH_CLOCK_595 = 1; } int16 i; void main(void) { P1 =0XFF; //关闭流水灯 xp74HC595(0X40); //打开流水灯573锁存器的使能端 xp74HC595(0X00); //锁存关掉流水灯的数据 GK=1; //打开光敏控制孔,使其处于变暗状态 while(1) { if(GK==0) //因为光线偏暗就输出低电平 { delay(10); if(GK==0) { xp74HC595(0X08); //控制打开继电器 } } else { xp74HC595(0X00); //光线偏亮,控制关闭继电器 } } }
(7).作业:
作业代码:#include"reg52.h" typedef signed char int8; typedef signed int int16; typedef signed long int32; typedef unsigned char uint8; //字符型 typedef unsigned int uint16; typedef unsigned long uint32; sbit GK =P1^7; //光控模块 sbit key1 = P3 ^ 7; //独立按键接口 sbit key2 = P3 ^ 6; sbit key3 = P3 ^ 5; sbit key4 = P3 ^ 4; sbit JDQ = P2 ^ 0; sbit SHIFT_CLOCK_595 = P1 ^ 4; //74HC595 sbit data_A_595 = P1 ^ 0; sbit LATCH_CLOCK_595 = P2 ^ 3; sbit duanxuan = P2 ^ 5; //段选控制数字显示 sbit weixuan = P2 ^ 6; //位选控制有几个或者第几个显示数字 //自加变量,用来测试编码表 uint8 code zifu[19] = { 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0X7F,0XBF }; uint8 code wei_test[8] = { 0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80 };//位选数组 void delay(uint16 x_ms) //延时毫秒 { uint16 i,j; for(i=x_ms;i>0;i--) for(j=114;j>0;j--); } void Disp() //数码管显示OFF { duanxuan=0; //首先归零 weixuan=0; P0= zifu[0]; //控制输入 , 自加变量,测试编码表 duanxuan=1; duanxuan=0; //以上是我们锁存器芯片段选的控制 duanxuan=0; //再次归零 weixuan=0; P0= 0X20; //位选输入 weixuan=1; //位选控制 weixuan=0; //位选锁存 delay(1); //通过计算得出,视觉暂留的时间为5.2毫秒 、 /*****************************************************/ duanxuan=0; //首先归零 weixuan=0; P0= zifu[15]; //控制输入 , 自加变量,测试编码表 duanxuan=1; duanxuan=0; //以上是我们锁存器芯片段选的控制 duanxuan=0; //再次归零 weixuan=0; P0= 0X40; //位选输入 weixuan=1; //位选控制 weixuan=0; //位选锁存 delay(1); //通过计算得出,视觉暂留的时间为5.2毫秒 、 /*****************************************************/ duanxuan=0; //首先归零 weixuan=0; P0= zifu[15]; //控制输入 , 自加变量,测试编码表 duanxuan=1; duanxuan=0; //以上是我们锁存器芯片段选的控制 duanxuan=0; //再次归零 weixuan=0; P0= 0X80; //位选输入 weixuan=1; //位选控制 weixuan=0; //位选锁存 delay(1); //通过计算得出,视觉暂留的时间为5.2毫秒 、 /*****************************************************/ } void Disp2() //控制数码管显示ON { duanxuan=0; //首先归零 weixuan=0; P0= zifu[0]; //控制输入 , 自加变量,测试编码表 duanxuan=1; duanxuan=0; //以上是我们锁存器芯片段选的控制 duanxuan=0; //再次归零 weixuan=0; P0= 0X40; //位选输入 weixuan=1; //位选控制 weixuan=0; //位选锁存 delay(1); //通过计算得出,视觉暂留的时间为5.2毫秒 、 /*****************************************************/ duanxuan=0; //首先归零 weixuan=0; P0= zifu[16]; //控制输入 , 自加变量,测试编码表 duanxuan=1; duanxuan=0; //以上是我们锁存器芯片段选的控制 duanxuan=0; //再次归零 weixuan=0; P0= 0X80; //位选输入 weixuan=1; //位选控制 weixuan=0; //位选锁存 delay(1); //通过计算得出,视觉暂留的时间为5.2毫秒 、 /*****************************************************/ } void xp74HC595(uint16 dat) { uint16 i; for (i = 0; i < 8; i++) { data_A_595 = (dat << i) & 0X80; SHIFT_CLOCK_595 = 0; //时钟上升沿 SHIFT_CLOCK_595 = 1; } LATCH_CLOCK_595 = 0; //给锁存器脉冲,上升沿 LATCH_CLOCK_595 = 1; } int16 i; void sunshine() //光控电路 { if(GK==0) //因为光线偏暗就输出低电平 { delay(10); if(GK==0) { xp74HC595(0X08); //控制打开继电器 Disp2(); //显示OFF } } else { xp74HC595(0X00); //光线偏亮,控制关闭继电器 Disp(); } } void mos1() { sunshine(); //调用sunshine函数写出光控电路 } uint16 num; void mos2() //人工控制电路 { num=0; //初始化key2按键按下次数 if(num%2==0) //按下key2键次数为偶数 { if(key2==0) //检测到按键按下 { xp74HC595(0X04); //继电器闭合 GK ==1; //灯亮 Disp(); //显示ON delay(10); //按键消抖 while(key2==0) //松手检测 { //空:因为保持原状即可,无需再进行操作 num++; } } } else { if(key2==0) { xp74HC595(0X00); //继电器断开 GK ==0; //灯灭 Disp2(); //显示OFF delay(10); while(key2==0) //松手检测 { //空:因为保持原状即可,无需再进行操作 num++; } } } } void main(void) { P1 =0XFF; //关闭流水灯 xp74HC595(0X40); //打开流水灯573锁存器的使能端 xp74HC595(0X00); //锁存关掉流水灯的数据 key1 =1; //初始化按键 key2 =1; i=0; //用i来控制按下key1的次数,用来判断模式1or2 GK=1; //打开光敏控制孔,使其处于变暗状态 while(1) { if(i%2==0) { i++; mos2(); //如果为偶数,则是模式2 } else { i++; mos1(); //为奇数,则是模式1 } } }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 STM32F103上电短路问题
- ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
- ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
- ¥15 (标签-python|关键词-char)
- ¥15 python+selenium,在新增时弹出了一个输入框
- ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
- ¥20 学生成绩管理系统设计
- ¥15 来一个cc穿盾脚本开发者
- ¥15 CST2023安装报错
- ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办