光强检测仪

#include <reg52.h>                             //头文件
#include <intrins.h>                       //_nop_()指令 12MHZ 1us#define uint unsigned int                  //全局声明            uint  (2^32)-1
#define uchar unsigned char                  //                    uchar (2^8)-1sbit RGB_RED = P3^6;                        //定义RBG引脚  共阴
sbit RGB_GREEN = P3^5;
sbit RGB_BLUE = P3^4;
sbit BUZZER = P3^7;                             //定义蜂鸣器  @500Hz~4.5KHz脉冲频率驱动
sbit LCD_RS = P2^5;                          //定义LDC数据命令选择端
sbit LCD_RW = P2^6;                          //定义LCD读写选择端
sbit LCD_EN = P2^7;                          //定义LCD使能端
sbit ADC_WR = P3^0;                             //定义ADC写信号输入端
sbit ADC_RD = P3^1;                             //定义ADC读信号输入端
sbit KEY_SC = P3^2;                             //外部中断0位按键位uchar text1[] = "   UESTC   ";
uchar text2[] = "(Lux) ";
uchar text3[] = "High Vau:";
uchar text4[] = "Low  Vau:";              //LCD显示文本
uchar ASCII[]="0123456789";                   //ASCII
uchar Disbuf[]={0,0,0};                         //暂存空数组 百十个位
uchar Cmax[]={0,0,0};                           //存放最大值最小值 中断返回后重置 重新记录
uchar Cmin[]={0,0,0};
uchar CYCLE,PWM_ON;                          //T0定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms,定义高电平时间
uchar T1RH,T1RL;                             //T1 重载值的高低字节
uint max=0;min=600;                            //赋相对值 确保有比较
uint candela=0;                              //光强值
uint scale=0;                                //T1占空比控制变量/*****************************延时函数*****************************/void Delay_ms(uint z)                       //毫秒ms级延时函数{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void delay_us(unsigned int cnt)            //微秒us级延时函数{ while(--cnt); }
/******************************************************************//***************************LCD1602驱动***************************/uchar Lcd1602_ReadBusy()                    //判断lCD是否处于忙的状态,即读忙{uchar temp;LCD_RS=0;LCD_RW=1;_nop_();P0=0xff;                                   //读某IO口数据前,先将该口置为1            _nop_();LCD_EN=1;_nop_();temp=P0;                                   //读取此时lcd1602的状态字_nop_();LCD_EN=0;return (temp&0x80);                        //最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙}void Lcd1602_WriteCom(uchar com)            //写LCD命令{while(Lcd1602_ReadBusy());                 //判忙LCD_RS=0;                                  //命令LCD_RW=0;                                  //写_nop_();P0=com;                                    //准备发送命令_nop_();LCD_EN=1;                                  //由时序图知,使能端为高电平时才允许数据交换_nop_();_nop_();LCD_EN=0;                                  //由时序图知,使能端在完成数据交换后要拉低_nop_();_nop_();   }void Lcd1602_WriteData(uchar dat)           //写LCD数据{while(Lcd1602_ReadBusy());                 //判忙LCD_RS=1;                                  //数据LCD_RW=0;                                  //写_nop_();P0=dat;                                     //发送的是ASCII码 变量数值+0x30  /  或转码_nop_();                      LCD_EN=1;                   _nop_();_nop_();LCD_EN=0;_nop_();_nop_();   }void Lcd1602_init()                         //初始化LCD函数{Lcd1602_WriteCom(0x38);                    //显示模式设置Lcd1602_WriteCom(0x0c);                    //显示开Lcd1602_WriteCom(0x01);                    //显示清屏Lcd1602_WriteCom(0x06);                    //显示光标}
/******************************************************************//****************************ADC0804驱动***************************/
void Adc0804()                               //adc的初始化函数{                           ADC_WR=0;                                //采样_nop_();ADC_WR=1;                                //跳变高电平,触发一次ADC转换}uchar Read0804()                            //读取ADC模数转换值{uchar r;P1=0xff;                                      //P0口复位       _nop_();                                  //延时    ADC_RD=0;                                  //rd拉低_nop_();                                  //延时r=P1;                                      //读取P0口数据_nop_();                                   //延时ADC_RD=1;                                  //rd拉高return(r);                                //返回读到的数据}/******************************************************************//****************************自定义函数****************************/ void Transform(uchar dat)                     //单片机将接收到adc0804的数据进行处理转换{ candela=dat*2.353;                         //将adc数据倍增得到一个介于0-600之间的数值Disbuf[0]=candela/100;                    // 百位Disbuf[1]=candela%100/10;                  // 十位Disbuf[2]=candela%10;                      // 个位     (/除取整,%除取余)}void Max_Min()                                 //获得光强最大值 最小值{uchar i;if(candela>max)                            //光强>最大值 保存{max=candela;for(i=0;i<3;i++)Cmax[i]=Disbuf[i];}if(candela<min)                            //光强<最小值 保存{min=candela;for(i=0;i<3;i++)Cmin[i]=Disbuf[i];   }}void Display_Lcd(uchar state)                         //LCD显示{ uchar i;switch(state){ case 0:                                             //检测显示Lcd1602_WriteCom(0x80);                   //第一行第0位for(i=0;i<13;i++)Lcd1602_WriteData(text1[i]);             //写入文本1Lcd1602_WriteCom(0x80|0x40+0x0a);       //第二行 a(10)位for(i=0;i<6;i++)                            Lcd1602_WriteData(text2[i]);            //写入文本2Lcd1602_WriteCom(0x80|0x40+0x02);for(i=0;i<3;i++)                             Lcd1602_WriteData(ASCII[Disbuf[i]]);break;case 1:                                       //外部中断0后LCD显示Lcd1602_WriteCom(0x80);                    //第一行第0位for(i=0;i<9;i++)Lcd1602_WriteData(text3[i]);          //写入文本1Lcd1602_WriteCom(0x80|0x40);             //第二行第0位for(i=0;i<9;i++)                          Lcd1602_WriteData(text4[i]);            //写入文本2Lcd1602_WriteCom(0x80+0x0a);            for(i=0;i<3;i++)                          Lcd1602_WriteData(ASCII[Cmax[i]]);  //光强最大值Lcd1602_WriteCom(0x80|0x40+0x0a);for(i=0;i<3;i++)                             Lcd1602_WriteData(ASCII[Cmin[i]]);  //光强最小值            break;}}void Buzz(uchar frequ)                           //可调频率(波形)无源蜂鸣器{static uint reload;                               //计算所需的定时器重载值  静态全局变量TMOD = 0x01;                                      //配置 T0 工作在模式 1reload = 65536-(12000000/12)/(frequ*2);           //由给定频率计算定时器重载值T1RH = (uchar) (reload >> 8);                     //16 位重载值分解为高低两个字节T1RL = (uchar) (reload);TH1 = 0xFF;                                       //设定一个接近溢出的初值,以使定时器马上投入工作TL1 = 0xFE;TR1 = 1;                                          //启动 T1 计时ET1 = 1;                                          //开启 T1 中断}void Display_RGB_GREEN()                             //绿色呼吸灯
{ bit Flag; TMOD = 0x01;                                        //定时器设置 0.1ms in 12M crystal TH0=(65536-100)/256; TL0=(65536-100)%256;                                //定时0.1mS EA=1;ET0=1;                                              //打开T0中断 TR0=1;                                           //开启计时CYCLE = 10;                                         // 时间可以调整 这个是10调整 8位PWM就是256步 if(!Flag)                                             { delay_us(3000);                                   //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON++;                                         //这个使用较长延时,以便能看清楚变化过程 if(PWM_ON == CYCLE) {                                                //可添加其他操作 到最亮时候控制对应操作 Flag=1; } } if(Flag)                                            //亮度递减 相反过程 { delay_us(3000);                                   //延迟时间为4000*0.4=1600usPWM_ON--; if(PWM_ON == 0) { Flag=0; }}
}/******************************************************************//***************************INT0 T0 T1中断*************************/void INT0_Max_Min() interrupt 0                      //外部中断0 显示最大值最小值{Delay_ms(300);                             Lcd1602_init();                                   //重置LCD内容 否则进入后屏幕数据重叠乱码Display_Lcd(1);                                      //显示内容while(KEY_SC);                                    //中断按键按下 才能退出中断Lcd1602_init();                                      //重置LCD内容 否则返回后屏幕数据重叠乱码max=0;min=600;                                     //重置比较值Delay_ms(300);}void T0_RGB_GREEN() interrupt 1                       //定时器T0 RBG绿呼吸灯
{ static unsigned char count; TH0=(65536-100)/256; TL0=(65536-100)%256;                                 //重载 if (count==PWM_ON) { RGB_GREEN = 1;                                 //亮} count++; if(count == CYCLE) { count=0; if(PWM_ON!=0)                                     //如果开启时间是0 保持原来状态 {RGB_GREEN = 0;                                  //灭}}
}void T1_Buzz() interrupt 3                           //定时器T1 蜂鸣器发声{TH1 = T1RH;                                         //重新加载重载值TL1 = T1RL;BUZZER = ~BUZZER;                                   //反转蜂鸣器控制电平}
/******************************************************************//***************************INT0 T0 T1中断*************************/void main()                                         //主程序{IT0=0;                                           //设置中断0为低电平触发  下降沿触发出现一直进入中断的BUGEX0=1;                                             //INT0中断开EA=1;                                                 //总中断开Lcd1602_init();                                   //lcd初始化while(1){     Adc0804();                                        //adc初始化 采样 模数转换Transform(Read0804());                              //加载DB口 读取电压数字值 数据处理Max_Min();                                       //提取最大光强和最小光强 用于外部中断显示Display_Lcd(0);                                  //lcd显示if(candela<=400){RGB_BLUE=0;RGB_RED=0;                             //LED重置ET1 = 0; TR1 = 0;                                  //关闭定时器T1(关闭蜂鸣器)Display_RGB_GREEN();                              //调用绿呼吸函数Delay_ms(100);}else if(400<candela&&candela<500)                 //不能用400<candela<500的写法 会导致candela>=500进不去{RGB_RED=0;RGB_GREEN=0;RGB_BLUE=1;               //LED重置ET0=0; TR0=0;                                      //关闭定时器T0(关闭绿呼吸灯)ET1 = 0;TR1 = 0;                                 //关闭定时器T1(关闭蜂鸣器)   Delay_ms(200);}else if(candela>=500){RGB_RED=~RGB_RED;RGB_GREEN=0;RGB_BLUE=0;         //红电平反转 闪烁 LED 重置ET0=0; TR0=0;                                    //关闭定时器T0(关闭绿呼吸灯)Buzz(500);                                       //蜂鸣器响@1KHZDelay_ms(200);                                      //适当延时调节光强变化敏感度 过短飘屏 过长迟钝}        }}

单片机.C51基于LCD1602光强检测仪.光敏电阻.ADC0804相关推荐

  1. 8051单片机Proteus仿真与开发实例-光敏电阻+ADC0804仿真

    光敏电阻+ADC0804仿真 1.光敏电阻简单介绍 光导率是材料电导率增加的一种光学现象.当光被材料吸收时.当光落下时,即当光子落在设备上时,半导体材料价带中的电子被激发到导带.入射光中的这些光子的能 ...

  2. 基于51单片机多功能酒精浓度检测仪系统设计(毕业课设)

    本产品采用单片机+最小系统+LCD1602液晶显示模块+MQ-3模块+ADC0832模块+蜂鸣器模块+LED指示灯模块+按键模块设计而成. 单片机型号:STC89C52/51.AT89C52/51.A ...

  3. 基于matlab的电子时钟,基于LCD1602电子时钟毕业设计报告.doc

    PAGE PAGE 32 PAGE \* MERGEFORMAT 0 信息与电子工程学院课程设计报告 课 程单片机技术应用设计题目基于LCD1602电子时钟专 业班 级成 员姓 名学 号分工成 绩指导 ...

  4. 单片机c51语言变量,单片机c语言教程:C51变量

    上课所提到变量就是一种在程序执行过程中其值能不断变化的量.要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间.定义一个变量的格式如下: ...

  5. 单片机毕业设计 stm32空气质量检测仪

    文章目录 1 简介 2 系统设计概述 3 系统总体方案 4 硬件设计方案 4.1 stm32 主控 4.2 温度采集模块 4.3 甲醛浓度检测模块 4.4 PM2. 5 浓度检测模块 4.5 液晶显示 ...

  6. 单片机C51基础编程之跑马灯

    单片机C51跑马灯实验讲解 单片机C51的学习,记录并且分享. 分享--程序员必备的精神品质之一 本文主要讲述最基础的跑马灯实验的仿真,基于软件proteus和keil4进行代码编译,最终仿真实现,检 ...

  7. 单片机 C51 AAU_CS

    单片机 C51 AAU_CS 实验 01 清零和分支程序设计.Keil的使用 实验 02 数据区的数据传送与比较 实验 03 数据运算与数据比较 实验 04 闪烁灯 实验 05 花样流水灯 实验 06 ...

  8. c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt

    第3章节单片机c51语言程序的设计基本 第3章 单片机C51语言程序设计基础 3.1 语句与流程控制 3.2 函数 3.3 本章小结 3.4 实训三 简易十字路口交通信号灯控制 教学提示 教学要求 3 ...

  9. 51单片机C51程序

    51单片机51单片机 C51程序 C51程序 学习C51程序之前需要对C语言有一定的了解和学习:这里只介绍与C语言有区别的地方: 具体的不同如下: 1.C51中增加了几种针对MSC-51单片机的特有数 ...

最新文章

  1. React组件常用设计模式之Render Props
  2. Leangoo领歌敏捷项目管理工具新增测试管理功能
  3. 七、处理机调度概念、层次
  4. python详细教程-python入门(非常详细的教程)
  5. 国产木乃伊走进CTO编辑部
  6. 如何在Raspberry Pi上安装Fedora 25
  7. Fortran95学习笔记
  8. 8086CPU中14个寄存器的详解
  9. QT QLabel中字体行间距怎么设置?
  10. 磁力链接文件服务器,什么是磁力链接(BT、磁力链这些词语是什么意思?)
  11. ssm教务系统网站毕业设计源码290915
  12. html响应式布局手机屏幕导航条,美图响应式布局导航条效果
  13. 冬令时 java_java-时间处理夏令时冬令时跨时区问题处理
  14. 笔记本html外接显示器,笔记本电脑外接显示器怎么设置?笔记本电脑接显示器实现双屏教程...
  15. Linux下调整屏幕分辨率
  16. 超实用的油猴脚本推荐(持续更新)
  17. linux 自定义欢迎界面 /etc/motd文件
  18. 诺基亚n78微信显示服务器忙,诺基亚N78系统详细解析
  19. 百度 oppo 滴滴出行 面试问题总结 阿里
  20. 第三方个人免签支付工具

热门文章

  1. win10系统使用VMware偶尔出现蓝盘的问题解决
  2. Zynq术语详解,不懂啥是PL,PS,APU,SCU?那就进来看看吧
  3. 《图解HTTP》阅读总结(上)
  4. 工信部装备司文件首提数字孪生关键技术
  5. ETL开发过程中遇到的问题
  6. 每周一计-自己动手做的电源
  7. 批量(清除)删除Word回车符
  8. 安卓开发: Jetpack compose + kotlin 实现 俄罗斯方块游戏
  9. PS磨皮从此不求人 运用高斯模糊 无需插件
  10. 4.3实训任务 Zookeeper安装与配置