我的目标是:用光敏电阻做感应器件,当光照强度低于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
}
一周热门 更多>