附录:
附1:元器件明细表
器件名称 电容 光敏电阻 电阻 芯片底座 芯片 学习板 插针 杜邦线 LED灯 规格 150PF 10千欧 20pin ADC0804 高亮灯 数量 1个 1个 4个 1个 1个 1个 若干 19根 一个 附2:电路图图纸
实物图
11
附3:程序清单
基本要求的程序:
#include
#define uint unsigned int #define uchar unsigned char sbit adcs=P1^7; sbit adrd=P3^7; sbit adwr=P3^6; sbit led=P1^5; sbit Seg_ce=P1^0; sbit Dig_ce=P1^1;
uchar tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0到9 uint ad_data,m=0,n=0,t1=5,t2=25; //ad_data表示AD输出8位2进制,t1为定时5秒后启动光采集电路,t2为定时25秒后关闭光采集电路 void delay(uint i) {
uint j;
for(i;i>0;i--)
for(j=124;j>0;j--); }
void keyscan(uint num) //显示5秒 {
uint ge,shi; ge=num;
12
shi=num/10;
P0=0; Seg_ce=1;Seg_ce=0; //清段选 P0=0xff; Dig_ce=1;Dig_ce=0; //清位选 P0=tab[ge]; Seg_ce=1;Seg_ce=0;
P0=0xfe; Dig_ce=1;Dig_ce=0; //显示5秒 }
void read_ad() {
adcs=0;
adwr=0;delay(1);adwr=1;delay(1); //启动AD,开始采样(/wr低电平保持的最短时间为100ns启动转换后必须加入一个延时以等待AD采样结束 adrd = 0;delay(1);ad_data =P2;delay(1);adrd=1; //读数据读取转换结果(/rd>200ns) adcs=1; }
void main() { P0=0;
P1=0x2c; //初始化P1_5为低(灯一开始是灭的)
TMOD=0x01; //方式1,16位定时器 TH0=(65536-50000)/256;
TL0=(65536-50000)%6; //设置定时器初值 IE=0x82; //设置中断允许 TR0=1; //启动定时器 while(1) {
if(m==0)keyscan(t1);
if(t1==0) //5秒已完,启动光采集电路 {
while(t2)
{ read_ad();
if(ad_data<125) //当外界很亮的时候关灯
{
led=1; } else {
led=0; //亮灯 delay(1); } }
if(t2==0) led=0; //25秒已完 ,forever亮
} }
13
}
void T0_timer()interrupt 1 //定时器T0中断函数 {
TH0=(65536-50000)/256; TL0=(65536-50000)%6;
if(t1!=0)m++; //不为0说明光采集电路还未启动,还在5秒之内
if(m==20) //1秒 时间 {
m=0; t1--; }
if(t2!=0)n++; //不为0说明还在25秒之内
if(n==20) //1秒 时间 {
n=0; t2--; } }
#include
sbit Dig_ce = P1^1; sbit Seg_ce = P1^0; sbit Key_ce = P1^3; sbit led= P1^5; uint z;
uchar tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9
void delay(uint i) {
uint j;
for(i;i>0;i--)
for(j=19;j>0;j--); }
void keyscan() {
uchar Temp1,Temp2;
P0=0;Seg_ce=1;Seg_ce=0;
P0=0xfe;Dig_ce=1;Dig_ce=0;delay(1); //扫描第一行,将第一行置低电平
Key_ce=0; //将P1_3口拉低,74LS244使能
Temp1=P0; //读P0口数据
14
Temp1=Temp1&0x0f; //提取按键相关数据-P0口的低四位
if(Temp1!=0x0f) //判断是否有按键按下 {
delay(10); //延时消抖
Temp2=P0;Temp2=Temp2&0x0f; //再读P0口,并提取P0口低四位数据
if(Temp1==Temp2) {
switch(Temp2) {
case 0x0e:z=z+10; break; // 按K0键每按一次键就增加10%的亮度,从而逐渐变亮,若低四位的值与0x0e相等,就执行其后的语句
case 0x0d:z=z-10;break; // 按K1键每按一次键就减少10%的亮度,从而逐渐变暗
case 0x07:z=0; break; //按K3键清零 default:break;
} //等待按键释放
while(Temp2!=0x0f) {
//不断地读取P0口数据,只要结果不等于0x0f,说明有按键没有被释放,直到释放,才退出 Temp2=P0;
Temp2=Temp2&0x0f; } } }
Key_ce=1; //关使能端 if(z<=100)
{ P0=0xff; Dig_ce=1;Dig_ce=0; //清段选 P0=tab[z]; Seg_ce=1;Seg_ce=0;delay(5); // 个位 P0=0xfe; Dig_ce=1;Dig_ce=0;delay(5);
P0=0xff; Dig_ce=1;Dig_ce=0;
P0=tab[(z/10)]; Seg_ce=1;Seg_ce=0;delay(5); // 十位 P0=0xfd; Dig_ce=1;Dig_ce=0;delay(5);
P0=0xff; Dig_ce=1;Dig_ce=0;
P0=tab[z/100]|0x80; Seg_ce=1;Seg_ce=0;delay(5); // 百位 P0=0xfb; Dig_ce=1;Dig_ce=0;delay(5); }
else z=0; }
void main()
15