求助:用光敏电阻做感应器件的照明控制系统数码管不亮的问题

2019-07-15 14:06发布

我的目标是:用光敏电阻做感应器件,当光照强度低于60lux时,由单片机控制继电器把灯打开,数码管前3个显示平均光强,后两个数码管显示光照阈值大小,但现在仿数码管不亮,是怎么回事
程序如下:
#include<reg52.h>
#include<intrins.h>            //51单片机的头文件
#define uchar unsigned char //类型定义,定义uchar类型
#define uint  unsigned int //类型定义,定义uint类型
uint Tcount,ADadv;//定义定时器溢出次数、数据平均值
uint ADnum[10];  //定义数据存储的数组
uint jishu;            //定义光照阈值基数符号
int q=0;                //存储数组的数量符号
int m=0;        //定义按键标志符号
sbit adcs=P2^7;//定义单片机P2.7管脚符号adcs
sbit adrd=P2^6;//定义单片机P2.6管脚符号adrd
sbit adwr=P2^5;//定义单片机P2.5管脚符号adwr
sbit led1=P2^0;//定义单片机P2.0管脚符号
sbit dula=P2^4; //定义单片机P2.4管脚、P2.3管脚符号为
sbit wela=P2^3; //dula、wela
sbit s1=P2^2;        //定义单片机P2.2管脚符号按键s1
sbit s2=P2^1;   //定义单片机P2.1管脚符号按键S2
void delayms(uint xms);
void key();
void ad_ini();
void display(uint,uint,uint,uint,uint);
uint A1,A2,A3,A4,L1,L2,L3;
uchar code table[]={       //共阴极段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,                                       
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void main()               
{   uint i,j;
        jishu=60;  //设置比较阈值的基数为60LX
        Tcount=0;                     
        TMOD=0x01; //设置定时器/计数器工作方式1
        TH0=(65536-50000)/256; //设置定时器/计数器的初值
        TL0=(65536-50000)%256;           
        EA=1;      //开全局中断允许
        ET0=1;     //开定时器/计数器T0中断允许
        EX0=1;     //开外部中断0中断允许
        TR0=1;     //启动定时器/计数器T0
        IT0=1;     //外部中断0下降沿触发
        ad_ini(); //AD初始化
        led1=1;
        while(1)                        
        {
                if(q>=10)                     
                        {
                                for(q=0;q<=9;q++)               
                                {ADadv=ADnum[q]+ADadv;}      
                                 q=0;
                                ADadv=ADadv/10;//AD采集数据满10个,取平均
                       }
                                         
                A1=ADadv/100; //计算数据的百位、十位、个位数字
            A4=ADadv%100;
            A2=A4/10;
            A3=ADadv%10;
            L3=jishu%100; //计算阈值百位、十位数字
            L1=L3/10;
            L2=jishu%10;
                if(m==0)                       
                {        key();                      //键盘扫描
                 display(A1,A2,A3,L1,L2);     //显示     
                }
            else                           
            for(i=500;i>0;i--)                  
                {         for(j=110;j>0;j--)
                        m=0;
                }
            if(jishu<ADadv) //光强值与阈值的比较
                {led1=1;}               
        else
        led1=0;  
        }
                               
}
void ad_ini() //AD命令管脚先置1 ,为启动做准备
{
        adcs=1;
        adrd=1;
        adwr=1;
}

void ad_start()         //AD转换启动程序
{       
        adcs=0;    //AD的片选信号cs
        adwr=0; //AD的写信号
        _nop_(); //等待一个机器周期
        _nop_();
        adwr=1;
        adcs=1;
}
void ad_int() interrupt 0        //转化结束后,INTO自动为0  ,进入该中断程序
{
        EX0=0;        //进入中断后关闭中断使能,防止中断再次进入
        P0=0xff; //读取单片机P0端口数据前先给P0端口写1操作
        adcs=0;   //AD片选信号为0
        adrd=0;   //AD读信号为0
        _nop_();  //等待一个机器周期
        _nop_();
        ADadv=P0;  //将AD转换完成的数字通过P0口读取
        adrd=1;          //为下一次AD启动做准备
        adcs=1;
        q=q+1;           
        EX0=1;              //开外部中断0使能
}
void T0_int()  interrupt 1         //定时中断        50ms产生个中断,使Tcount加1
{
        TH0=(65536-50000)/256;  //定时器赋初值TH0、TL0
        TL0=(65536-50000)%256;
        Tcount++;            //进入该中断的次数
        if(Tcount>=10)
                {
                        ad_start(); //中断次数增加到10时,启动一次AD
                        Tcount=0;   //重新计数中断次数
                }
}
void delayms(uint xms)         //定义延迟程序 定时时间单位是ms,定时数值
{        uint i,j;             //        由xms值大小决定。
        for(i=xms;i>0;i--)                                                                       
        for(j=110;j>0;j--);
}

void key()
{  if(s1==0)       //判断按键是否按下
   delayms(5);     //延迟5ms
   if(s1==0);     //再次判断按键是否按下
   {jishu=jishu+1; m=1;}  //基数上加1,m为按键标志
   if(s2==0)         //判断按键是否按下
   delayms(5);     //延迟5ms
   if(s2==0)       //再次判断按键是否按下
   { jishu=jishu-1;m=1;}   //基数上减1操作
}

void display(uint A1,uint A2,uint A3,uint L1,uint L2)
{
        P1=0x00;       //消影
        dula=1;        //选择段选锁存器
        P1=table[A1];  //把数据的百位(断码)送入锁存器输入端口
        dula=0;         //把段选锁存器输出端口数据锁存
        P1=0xff;       //消影
        wela=1;        //选择位选锁存器
        P1=0xfe;       //把位选数据送到位选锁存器输入端口
        wela=0;       //把位选锁存器输出端口锁存
        delayms(5);     //延迟5ms

        P1=0x00;           //消影
        dula=1;          //选择段选锁存器
        P1=table[A2];      //把数据的十位(断码)送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xfd;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(5);         //延迟5ms

        P1=0x00;           //消影
        dula=1;          //选择段选锁存器
        P1=table[A3];       //把数据的个位(断码)送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xfb;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(5);         //延迟5ms

        P1=0x00;           //消影
        dula=1;          //选择段选锁存器
        P1=table[L1];     //把数据的阈值十位送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xf7;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(5);         //延迟5ms

        P1=0x00;           //消影
        dula=1;          //选择段选锁存器
        P1=table[L2];       //把数据的阈值个位送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xef;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(5);         //延迟5ms
}

QQ图片20160504181049.png
QQ图片20160504181032.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。