不同光照强度下,数码管的数字随之变换
单片机源程序如下:
- #include <reg52.h>
- #include "iic.h"
- unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
- unsigned char dspbuf[]={10,10,10,10,10,10,10,10};
- unsigned char dspcom=0;
- unsigned char adc_pcf8591(void);
- bit adc_flag;//a-d转换的标志位
- unsigned int ms,value;
- void display();
- void dac_pcf8591(unsigned char date);
- void cls_buzz()
- {
- P0=0XFF;
- P2=P2&0X1F|0XA0;
- P2&=0X1F;
- }
- void cls_led()
- {
- P0=0XFF;
- P2=P2&0X1F|0X80;
- P2&=0X1F;
- }
- void main(void)
- {
- unsigned char value;
- cls_buzz();
- cls_led();
- TMOD=0X01;//用T0做;若用T1做,要改成0x10,TH1,TL1,ET1,TR1
- TH0=0XFC;
- TL0=0X66;
- EA=1;
- ET0=1;
- TR0=1;
- while(1)
- {
- if(adc_flag)
- {
- adc_flag=0;
- value=adc_pcf8591();
- dac_pcf8591(value);
- (value>=100)?(dspbuf[5]=value/100):(dspbuf[5]=10);//条件?满足:不满足
- (value>=10)?(dspbuf[6]=value%100/10):(dspbuf[6]=10);//条件?满足:不满足
- dspbuf[7]=value%10;
- }
- }
- }
- void int_t0() interrupt 1
- {
- TH0=0xfc;
- TL0=0x66;
-
- if(++ms==500)
- {
- ms=0;
- adc_flag=1;
- }
- display();
- }
- void display()
- {
- P0=0XFF;//消除鬼影
- P2=P2&0X1F|0XE0;
- P2&=0X1F;
-
- P0=1<<dspcom;
- P2=0X1F|0XC0;
- P2&=0X1F;
-
- P0=tab[dspbuf[dspcom]];
- P2=P2&0X1F|0XE0;
- P2&=0X1F;
-
- if(++dspcom==8)
- dspcom=5;
- }
- unsigned char adc_pcf8591(void)
- {
- unsigned char temp;//返回值变量
- IIC_Start();
- IIC_SendByte(0X90);
- IIC_WaitAck();
- IIC_SendByte(0X01);
- IIC_WaitAck();
-
- IIC_Start();
- IIC_SendByte(0X91);
- IIC_WaitAck();
- temp=IIC_RecByte();//读数据
- IIC_Ack(1);//发送应答
- IIC_Stop();
- return temp;
- }
- void dac_pcf8591(unsigned char date)
- {
- IIC_Start();//起始信号
- IIC_SendByte(0X90);//发送pcf8591写地址
- IIC_WaitAck();//等待应答
- IIC_SendByte(0X40);//选择D/A转换
- IIC_WaitAck();
- IIC_SendByte(date);//选择D/A转换
- IIC_WaitAck();
- IIC_Stop();
- }
- void write_delay(unsigned char t)
- {
- unsigned char i;
- while(t--)
- {
- for(i=0;i<112;i++);
- }
- }
复制代码
所有资料51hei提供下载:
光照强度检测.zip
(34.37 KB, 下载次数: 45)
|