用滑动电位器分压来代替采集的电压信号光敏电阻
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
仅参考,文件中包括仿真,文档和程序,有问题评论下工程文件可到本帖附件中下载)
- //程序名:ADC0804 模/数转换
- #include <reg51.h>
- #include <intrins.h> //包含头文件
- sbit adc_rd=P3^7; //RD
- sbit adc_wr=P3^6; //WR
- sbit s1=P2^0;
- sbit s2=P2^1;
- sbit s3=P2^2;
- sbit s4=P2^3; //四个数码管位选端
- sbit key=P2^4; //按键控制输出(选配)
- sbit out=P2^5; //输出控制(选配)
- unsigned char Disbuf[]={0,0,0}; //显示暂存空数组
- unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数字显示编码
- void display(); //声明函数
- void dsxms() //延时
- {
- unsigned char i;
- for(i=0;i<250;i++);
- }
- void display() //显示函数
- {
- unsigned char i;
- for(i=0;i<10;i++) //每次循环10次
- {
- P1=tab[Disbuf[2]]; //显示个位
- s4=0; //打开位
- dsxms(); //延时
- s4=1; //关闭位
-
- P1=tab[Disbuf[1]];//显示十位,&0x7f是显示小数点
- s3=0; //打开位
- dsxms(); //延时
- s3=1; //关闭位
-
- if(Disbuf[0]==0) //如果百位是0时
- P1=0xff; //该位不显示
- else //百位不为0时
- P1=tab[Disbuf[0]]; //显示百位数据
- s2=0; //打开位
- dsxms(); //延时
- s2=1; //关闭位
- P1=0xff; //显示空白
- s1=0; //打开位
- dsxms(); //延时
- s1=1; //关闭位
- }
- }
- void adc() //adc的初始化函数
- {
- adc_wr=0;
- _nop_();
- adc_wr=1;
- }
- unsigned char read() //读AD转换值
- {
- unsigned char r;
- P0=0xff; //P0口复位
- _nop_(); //延时
- adc_rd=0; //rd拉低
- _nop_(); //延时
- r=P0; //读取P0口数据
- _nop_(); //延时
- adc_rd=1; //rd拉高
- return(r); //返回读到的数据
- }
-
复制代码
Keil代码与Proteus8.13仿真下载:
基于51单片机的光照强度检测系统 .zip
(290.72 KB, 下载次数: 48)
|