找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

光控灯(强中弱)

查看数: 1880 | 评论数: 3 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-10-24 04:20

正文摘要:

光控灯 1.光线很弱时开灯 2.光线很强时启动蜂鸣器,通过按钮可以关闭蜂鸣器 3.光线正常时关灯和关闭蜂鸣器

回复

ID:278457 发表于 2025-11-29 03:06
谢谢分享。
ID:1121148 发表于 2025-11-12 14:22
我把这个程序改了移到STC8单片机上了
//#include "reg51.h"
//#include "intrins.h"
//sbit smg1=P2^0;//数码管
//sbit smg2=P2^1;
//sbit led1=P1^1;//LED强
//sbit led2=P1^2;//中
//sbit led3=P1^3;//弱
//sbit lamp=P3^5;//灯
//sbit beep=P3^6;//蜂鸣器
//sbit k1=P3^0;//按钮
//sbit CLK=        P1^5;//时钟,初始状态为0
//sbit DIO=        P1^6;//数据输入
////sbit DO=        P1^7; // 数据输出
//sbit CS=        P1^4;

#include<stc8.h>
#include "intrins.h"
sbit smg1=P5^4;  //数码管10位
sbit smg2=P5^5;  //数码管个位
sbit led1=P3^4;  //强
sbit led2=P3^5;  //中
sbit led3=P3^6;  //弱
sbit lamp=P3^7;  //灯
sbit CLK=        P3^0;//时钟,初始状态为0
sbit DIO=        P3^1;//数据输入
sbit CS=        P3^3;
//unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴0-9
unsigned char code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳0-9
unsigned char light=0;//光照
unsigned char time=0,flag=0;

void Delay_2us(void)
{
        _nop_();
        _nop_();
}
/*********************************************
读取ADC
**********************************************/
unsigned char ADC_read_data(bit channel)//通道ch0
{
        unsigned char i,dat0=0,dat1=0;  
        //-----第一次下降沿之前DI置高,启动信号-----
       
        CS=0;             //片选信号置低,启动AD转换芯片
        CLK=0;            //时钟置低电平
       
        DIO=1;            //开始信号为高电平
        Delay_2us();
        CLK=1;            //产生一个正脉冲,在时钟上升沿,输入开始信号(DI=1)
        Delay_2us();
        CLK=0;            //第1个时钟下降沿
        DIO=1;
        Delay_2us();
       
        CLK=1;            //第2个下降沿输入DI=1,表示双通道单级性输入
        Delay_2us();
       
        //-----在第2个下降沿,模拟信号输入模式选择(1:单模信号,0:双模差分信号)-----
        CLK=0; DIO=channel;     //第3个下降沿,设置DI,选择通道
        Delay_2us();
        CLK=1;
        Delay_2us();
       
        //-----在第3个下降沿,模拟信号输入通道选择(1:通道CH1,0:通道CH0)-----
        CLK=0;
        DIO=1;             //第4个下降沿之前,DI置高,准备接收数据
        Delay_2us();
        for(i=0;i<8;i++)          //第4~11共8个下降沿读数锯(MSB->LSB)
        {
                CLK=1;
                Delay_2us();
                CLK=0;
                Delay_2us();
                dat0=dat0<<1|DIO;
        }
        for(i=0;i<8;i++)          //第11~18共8个下降沿读数据(LSB->MSB)
        {
                dat1=dat1|((unsigned char)(DIO)<<i);
                CLK=1;
                Delay_2us();
                CLK=0;
                Delay_2us();
        }
        CS=1;
        return(dat0==dat1)?dat0:0;   //判断dat0与dat1是否相等
}
       
//        unsigned char temp0,temp1,i;
//        CS=0;
//        temp0=0;
//        temp1=0;
//        _nop_();
//        _nop_();
//        DI=1;//开始位
//        _nop_();
//        _nop_();
//        CLK=1;
//        _nop_();
//        _nop_();
//        CLK=0;
//        _nop_();
//        _nop_();
//        DI=0;
//        _nop_();
//        _nop_();
////选择通道0
//        DI=1;
//        _nop_();
//        CLK=1;//上升沿DI=1
//        _nop_();
//        CLK=0;//1个下降沿DI=1
//        _nop_();
//        DI=0;
//        _nop_();
//        CLK=1;
//        _nop_();
//        CLK=0;//第3个上升沿DI=0
//        _nop_();
//           DI=1;
////********通道选择结束开始读取转换后的二进制数****
////下降沿读数,一下进行判断和处理,共8次
//for(i=0;i<8;i++)
//   {
//        temp0=temp0<<1;
//        CLK=1;
//    if(DO)
//           temp0++;
//           _nop_();
//           CLK=0;
//   }
//for(i=0;i<8;i++)
//   {
//        temp1=temp1>>1;
//        CLK=1;
//    if(DO)
//           temp1=temp1 +0x80;
//           _nop_();
//           CLK=0;
//   }
//         CS=1;
//   return temp0;
//}

void delay(unsigned int i)//延时
{
        unsigned char j;
        for(j=0;j<i;j++);
}

void main()
{
        P1M0=0xFF;
        P1M1=0x00;
        P3M0=0x00;
        P3M1=0x00;
        P5M0=0x10;
        P5M1=0x00;
        led1=1;led2=1;led3=1;
        TMOD|=0X01;
        TH0=0X3C;
        TL0=0XB0;       
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器
        while(1)
        {
                //显示
//                P0=smgduan[light/10];//光照
//                smg1=0;
//                delay(100);
//                smg1=1;
//                P0=smgduan[light%10];
//                smg2=0;
//                delay(100);
//                smg2=1;
                P1=smgduan[light/10];//光照
                smg1=0;
                delay(100);
                smg1=1;
                P1=smgduan[light%10];
                smg2=0;
                delay(100);
                smg2=1;
                //停止报警
//                if(!k1)
//                {
//                        flag=1;
//                        beep=1;
//                }
        }
}
//定时器0中断
void Timer0() interrupt 1
{
        unsigned int i;
        if(time<10)//0.5s
                time++;
        else
        {
                time=0;
                i=ADC_read_data(0);
                light=i*60/256;
                //判断
                if((light>50)&&(flag==0))//强
                {
                lamp=1;
                        led1=0;led2=1;led3=1;
                }                       
                if((light<51)&&(light>20))//中
                {
                        led1=1;led2=0;led3=1;
                        //beep=1;
                        lamp=1;
                        flag=0;
                }
                if(light<21)//弱
                {
                        led1=1;led2=1;led3=0;
                        //beep=1;
                        lamp=0;
                        flag=0;
                }       
        }
        TH0=0X3C;
        TL0=0XB0;
}
ID:1102225 发表于 2023-12-9 09:01
你好,就是您的那篇光控灯的代码我烧在普中开发板上没有反应,是代码哪里需要修改吗,而且仿真图里用示波器测蜂鸣器也是没有波形

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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