




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附录A原理图附录B程序清单#include<reg52.h>#include<intrins.h>#include<UART.H>#defineucharunsignedchar //以后unsignedchar就可以用uchar代替#defineuintunsignedint //以后unsignedint就可以用uint代替sbitLED=P1^0; //模式指示灯,亮是自动模式,灭是手动模式sbitLamp=P1^4; //台灯控制引脚sbitKey1=P1^1; //按键1,模式切换按键sbitKey2=P1^2; //按键2,亮度减少按键sbitKey3=P1^3; //按键3,亮度增加按键sbitADC_CS=P2^3; //ADC0832的CS引脚sbitADC_CLK=P2^0; //ADC0832的CLK引脚sbitADC_DAT=P2^1; //ADC0832的DI/DO引脚sbitModule=P2^2; //人体红外检测模块sbitJDQ_OUT=P1^7;uchargCount=0; //全局计数变量uchargIndex; //亮度变量,0是最暗,9是最亮,一共10档uintgTime=0; //计时变量,用于计时多久没检测到有人/*********************************************************///毫秒级的延时函数,time是要延时的毫秒数/*********************************************************/voidDelayMs(uinttime){ uinti,j; for(i=0;i<time;i++) for(j=0;j<112;j++);}/*********************************************************///ADC0832的时钟脉冲/*********************************************************/voidWavePlus(){ _nop_(); ADC_CLK=1; _nop_(); ADC_CLK=0;}/*********************************************************///获取指定通道的A/D转换结果/*********************************************************/ucharGet_ADC0832(){ uchari; uchardat1=0; uchardat2=0; ADC_CLK=0; //电平初始化 ADC_DAT=1; _nop_(); ADC_CS=0; WavePlus(); //起始信号 ADC_DAT=1; WavePlus(); //通道选择的第一位 ADC_DAT=0; WavePlus(); //通道选择的第二位 ADC_DAT=1; for(i=0;i<8;i++) //第一次读取 { dat1<<=1; WavePlus(); if(ADC_DAT) dat1=dat1|0x01; else dat1=dat1|0x00; } for(i=0;i<8;i++) //第二次读取 { dat2>>=1; if(ADC_DAT) dat2=dat2|0x80; else dat2=dat2|0x00; WavePlus(); } _nop_(); //结束此次传输 ADC_DAT=1; ADC_CLK=1; ADC_CS=1; if(dat1==dat2) //返回采集结果 returndat1; else return0;}/*********************************************************///定时器初始化/*********************************************************/voidTimerInit(){ TMOD=0x01; //使用定时器0,工作方式1 TH0=252; //给定时器0的TH0装初值 TL0=24; //给定时器0的TL0装初值 ET0=1; //定时器0中断使能 EA=1; //打开总中断 TR0 =1; //启动定时器0}/*********************************************************///手动控制/*********************************************************/voidManualControl(){ //亮度减少 if((Key2==0)||(UART_Data==2)) //如果按键2被按下去 { UART_Data=0; if(gIndex>0) //只要当前亮度不为最低才能减少亮度 { gIndex--; //亮度降低一档 DelayMs(300); //延时0.3秒 } } //亮度增加 if((Key3==0)||(UART_Data==3)) //如果按键3被按下去 { UART_Data=0; if(gIndex<9) //只要当前亮度不为最高才能增加亮度 { gIndex++; //亮度增加一档 DelayMs(300); //延时0.3秒 } }}/*********************************************************///自动控制/*********************************************************/voidAutoControl(ucharnum){ if(num<59) //最亮 gIndex=9; elseif((num>65)&&(num<81)) //第二亮 gIndex=8; elseif((num>87)&&(num<103)) //第三亮 gIndex=7; elseif((num>109)&&(num<125)) gIndex=6; elseif((num>131)&&(num<147)) gIndex=5; elseif((num>153)&&(num<169)) gIndex=4; elseif((num>175)&&(num<191)) gIndex=3; elseif((num>197)&&(num<213)) gIndex=2; elseif((num>219)&&(num<235)) gIndex=1; elseif(num>241) //最暗 gIndex=0;}/*********************************************************///主函数/*********************************************************/voidmain(){ ucharret; TimerInit(); //定时器初始化 UART0_Init(); LED=0; //指示灯点亮(自动模式指示灯) ret=Get_ADC0832(); //获取AD采集结果(环境光照强度) AutoControl(ret); //上电先进行一次自动亮度控制 AutoControl(ret+7); while(1) { /*模式切换控制*/ if((Key1==0)||(UART_Data==1)) //如果按键1被按下去 { UART_Data=0; LED=~LED; //切换LED灯状态 DelayMs(10); //延时消除按键按下的抖动 while(!Key1); //等待按键释放 DelayMs(10); //延时消除按键松开的抖动 } if(UART_Data==4) { UART_Data=0; JDQ_OUT=~JDQ_OUT; } /*亮度控制*/ if(LED==1) //如果LED是灭的 { ManualControl(); //则进行手动控制 } else //如果LED是亮的 { if(gTime<60000) { ret=Get_ADC0832(); //获取AD采集结果(环境光照强度) AutoControl(ret); //进行自动控制 DelayMs(200); } } /*检测是否有人*/ if(Module==1) { gTime=0; //检测到有人,则把60秒计时清零 } if(gTime>60000) //如果gTime的值超过了60000 { gTime=60000; //则把gTime的值重新赋值为60000,避免过大溢出 gIndex=0; //如果1分钟检测不到有人,则把台灯熄灭 } }}/*********************************************************///定时器0服务程序,1毫秒/*********************************************************/voidTimer0(void)interrupt1{ TH0=252; //给定时器0的TH0装初值 TL0=24; //给定时器0的TL0装初值 gTime++; //每1毫秒,gTime变量加1 gCount++; //每1毫秒,gCount变量加1 if(gCount==10) //如果gCount加到10了 { gCount=0; //则将gCount清零,进入新一轮的计数 if(gIndex!=0) //如果说台灯不是最暗的(熄灭) { Lamp=0; //则把台灯点亮 } } if(gCount==gIndex) //如果gCount计数到和gIndex一样了 { if(gIndex!=9) //如果说台灯不是最亮的 { Lamp=1; //则把台灯熄灭 } }}#include<UART.H>volatileunsignedcharUART_Data=0;voidUART0_Init(void){ TMOD|=0X20; //T1方式2,8位自动重装 TH1=0Xfd; TL1=0Xfd; //9600 TR1=1; //定时器1启动 SM0=0; //设置串口的工作模式 SM1=1; //方式1 REN=1; //允许串口接收数据 ES=1; //串口中断应许 EA=1; //开启中断 }/******************************************************************************************************************////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////函数voidreceive(void)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 语文学习的历史与未来发展趋势试题及答案
- 柑橘栽培新技术培训经典
- 新课标汇报课件模板范文
- 精炼技巧:CPSM考试试题及答案
- 江苏省高邮市2024-2025学年高三下学期第一次联考数学试题含答案
- 2025年度港口码头施工场地借用安全责任协议
- 全面掌控2024年图书管理员考试试题与答案
- 2024证券从业资格考试学习资源有效利用试题及答案
- 文学表现技巧的多样性试题及答案
- 学校心理辅导与德育教育的关系分析
- 医院等级评审现场检查(药事组)
- 毕业设计振动筛式花生收获机
- 大数据可视化知到章节答案智慧树2023年浙江大学
- 2023年(第九届)全国大学生统计建模大赛 论文模板及说明
- 大学成绩单(大专)
- 龋病的治疗 深龋的治疗
- 微山湖风景区进行旅游项目策划方案
- JJF 1367-2012烘干法水分测定仪型式评价大纲
- 医院麻醉药品、精神药品考试试题及答案
- GB/T 31586.1-2015防护涂料体系对钢结构的防腐蚀保护涂层附着力/内聚力(破坏强度)的评定和验收准则第1部分:拉开法试验
- GB/T 18337.3-2001生态公益林建设技术规程
评论
0/150
提交评论