51单片机课程设计:光照强度预警器(AD转换)
51单片机课程设计:光照强度预警器(AD转换)
本程序与MQ-3酒精浓度报警器一样,都是将对应的模拟信号转换为数字信号,然后通过单片机监控预警,程序也基本相同,接线方法也一样,AD转换器型号为AD0804。相关工程文件、开发板电路图以及模块资料在最下方附件下载。
关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。
/*************************************说明***********************************此程序只采集模块信号的大小需要转换为对应的值还需要转换公式连接方式见下方定义关于接线光照强度报警器连接电源然后AO接学校板子上A/D模拟信号输入端在程序刚运行,会要求你设置光照预警值(适用于吉农51开发板)2016-12-29-----------------------SWorld****************************************************************************/#include<reg52.h>//头文件#include<intrins.h>#defineucharunsignedchar//宏定义无符号字符型#defineuintunsignedint//宏定义无符号整型#defineGPIO_DIGP0//位选以及段选数据输出端口定义unsignedcharcodeDIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码数码管字跟unsignedcharDisplayData[8];//用来存放要显示的8位数的值sbitcs=P3^5;//分别接学校单片机的ADCSADRDADWRsbitrd=P3^6;//sbitwr=P3^7;//sbitCLK=P3^3;//时钟脉冲sbitDUC=P2^2;//DUC段选信号sbitWEC=P2^3;//WEC位选信号sbitbell=P3^4;sbitsetwarn=P2^7;//确定sbitadd=P2^6;//数值增加sbitsub=P2^5;//数值减少uintz,x,c,v,AD0809,date,ok;//定义数据类型uintnum;//默认报警值/********************************************************************************函数名:Delay10ms*函数功能:延时函数,延时10ms*输入:无*输出:无*******************************************************************************/voidDelay10ms(unsignedintc)//误差0us{unsignedchara,b;//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//for(;c>0;c--){for(b=38;b>0;b--){for(a=130;a>0;a--);}}}/*-----------------------------键盘扫描------------------------------------------------------*/unsignedcharKey_Scan(){unsignedcharkeyValue=0,i;//保存键值//--检测按键1--//if(setwarn!=1)//检测按键K1是否按下{Delay10ms(1);//消除抖动if(setwarn!=1)//再次检测按键是否按下{keyValue=3;i=0;while((i<50)&&(setwarn!=1))//检测按键是否松开{Delay10ms(1);i++;}}}//--检测按键1--//if(add!=1)//检测按键K1是否按下{Delay10ms(1);//消除抖动if(add!=1)//再次检测按键是否按下{keyValue=1;i=0;while((i<50)&&(add!=1))//检测按键是否松开{Delay10ms(1);i++;}}}//--检测按键1--//if(sub!=1)//检测按键K1是否按下{Delay10ms(1);//消除抖动if(sub!=1)//再次检测按键是否按下{keyValue=2;i=0;while((i<50)&&(sub!=1))//检测按键是否松开{Delay10ms(1);i++;}}}returnkeyValue;//将读取到键值的值返回}/********************************************************************************函数名:DigDisplay*函数功能:使用数码管显示*输入:无*输出:无*******************************************************************************/voidDigDisplay(){unsignedchari;unsignedintj;for(i=0;i<8;i++){WEC=1;DUC=0;switch(i)//位选,选择点亮的数码管,{case(0):GPIO_DIG=0x7F;break;//显示第0位case(1):GPIO_DIG=0xBF;break;//显示第1位case(2):GPIO_DIG=0xDF;break;//显示第2位case(3):GPIO_DIG=0xEF;break;//显示第3位case(4):GPIO_DIG=0xF7;break;//显示第4位case(5):GPIO_DIG=0xFB;break;//显示第5位case(6):GPIO_DIG=0xFD;break;//显示第6位case(7):GPIO_DIG=0xFE;break;//显示第7位}WEC=0;DUC=1;GPIO_DIG=DisplayData[i];//发送段码j=15;//扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}}/**********************************************************************数码管动态扫描*********************************************************************/voidxianshi()//显示函数{if(AD0809>250)AD0809=250;//找到对应公式替换掉,就可以实现光照检测date=250-AD0809;date*=5;if(date>num){bell=0;}else{bell=1;}//uintz,x,c,v;z=date/1000;//求千位x=date%1000/100;//求百位c=date%100/10;//求十位v=date%10;//求个位DisplayData[6]=DIG_CODE[z];DisplayData[5]=DIG_CODE[x];DisplayData[4]=DIG_CODE[c];DisplayData[3]=DIG_CODE[v];DigDisplay();}/*************************************************************************CLK振荡信号**************************************************************************/voidtimer0()interrupt1//定时器0工作方式1{TH0=(65536-2)/256;//重装计数初值TL0=(65536-2)%256;//重装计数初值CLK=!CLK;//取反}/*************************************************************************主函数**************************************************************************/voidmain(){uintxx=0;num=100;TMOD=0X01;//定时器中断0bell=1;CLK=0;//脉冲信号初始值为0TH0=(65536-2)/256;//定时时间高八位初值TL0=(65536-2)%256;//定时时间低八位初值EA=1;//开CPU中断ET0=1;//开T/C0中断TR0=1;cs=0;ok=0;while(1){if(ok==1)//无限循环{if(xx==20){wr=0;_nop_();wr=1;_nop_();_nop_();rd=0;_nop_();AD0809=P1;//读取数据rd=1;xx=0;}else{xx++;}xianshi();//数码管显示函数}else//以下为设置报警值代码{switch(Key_Scan()){case3:ok=1;break;case1:num-=2;break;case2:num+=2;break;}z=num/1000;//求千位x=num%1000/100;//求百位c=num%100/10;//求十位v=num%10;//求个位DisplayData[6]=DIG_CODE[z];DisplayData[5]=DIG_CODE[x];DisplayData[4]=DIG_CODE[c];DisplayData[3]=DIG_CODE[v];DigDisplay();}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。