完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
#include
#include ***it key1 =P2^4; //打开激光 ***it key2 =P2^5; //关闭激光 ***it key3 =P2^6; //加电流 ***it key4 =P2^7; //减电流 char i=0; unsigned int Ab=0; //设置电流的 /////////////////ADC控制//////////////////////// void AD_init(); void delay(unsigned char a); float AD_work(); float benc0[30],temp; unsigned int ADC_P; /////////////////ADC控制///////////////////// unsigned char table1[]={0xff,0x01,0x01,0x01,0x01,0x00,0x04}; //打开激光 unsigned char table2[]={0xff,0x01,0x01,0x01,0x00,0x00,0x03}; //关闭激光 unsigned char table3[]={0xff,0x01,0x01,0x02,0x00,0x00,0x04}; //加电流 unsigned char table4[]={0xff,0x01,0x01,0x05,0x2d,0xa0,0xd4}; //激光最小角度 void InitUART(void) { TMOD=0x21; //设置T0 T1 定时器为工作方式二 8位定时器计数器 SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收 IP = 0xF0; IPH = 0xf0; TR0=1; //启用T0定时器/计数器 PCON = 0x00; TH1 = 0xF4; //定时器1初值 2400 TL1 = 0xF4; TR1 = 1; //定时器1开始计数 EA = 1; //开总中断 // ES = 1; //开串口1中断 ES=0; } /****************串行口1发送****************/ void key_ALL() { if(key1==0) { while(!key1) {} ES=0; for(i=0;i<7;i++) { //UART_1SendOneByte(table1[i]); SBUF = table1[i]; while(!ti); //若TI=0,在此数据等待发送结束 TI = 0; } } if(key2==0) { while(!key2); {} for(i=0;i<7;i++) { SBUF = table2[i]; while(!TI); //若TI=0,在此数据等待发送结束 TI = 0; } } } void main() { InitUART(); AD_init(); while(1) { key_ALL(); if(key3==0) { while(!key3) {} Ab = Ab +5; if(Ab>254) { Ab = 254; } table4[4] =Ab; table4[6] =(5+Ab)%0x100; for(i=0;i<7;i++) { SBUF = table3[i]; while(!TI); //若TI=0,在此数据等待发送结束 TI = 0; } } } if(key4==0) { while(!key4) {} for(i=0;i<7;i++) { SBUF = table4[i]; while(!TI); //若TI=0,在此数据等待发送结束 TI = 0; } } } // ADC_P =AD_work()*1000 ; // if(ADC_P>2000) // { // for(i=0;i<7;i++) // { // SBUF = table3[i]; // while(!TI); //若TI=0,在此数据等待发送结束 // TI = 0; // } // } // else // { // for(i=0;i<7;i++) // { // SBUF = table4[i]; // while(!TI); //若TI=0,在此数据等待发送结束 // TI = 0; // } // } /*AD模块数据处理,加数据平滑处理*/ float AD_work() { float AD_val = 0; //定义处理后的数值AD_val为浮点数 unsigned char i; unsigned char k; for(i=0;i<30;i++) //在这块位置提 { ADC_CONTR=0x88|0x00; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器 _nop_(); _nop_(); _nop_(); while(!(ADC_CONTR&0x10)); //等待转换完成 ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0 benc0[i]=(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制) } for(i=0;i<30;i++) //经典部分 数据排序 { for(k=0;k<30-i;k++) if( benc0[i]>benc0[i+1]) { temp=benc0[i];benc0[i]=benc0[i+1];benc0[i+1]=temp; } } AD_val=(benc0[14]+benc0[15]+benc0[16])/3; AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值 2的10次方 1024 return AD_val; } /*AD模块初始化*/ void AD_init() { P1ASF =0x01; //P1.0口全部作为模拟功能AD使用 ADC_RES=0; //清零转换结果寄存器高8位 ADC_RESL=0; //清零转换结果寄存器低2位 ADC_CONTR=0x80; //开启AD电源 delay(3); //等待1ms,让AD电源稳定 } void delay(unsigned char a_time) //延时约1ms { unsigned int i_time; while (--a_time!=0) //1T单片机i_time=600,若是12T单片机i_time=125 for(i_time=600;i_time>0;i_time--); } |
|
相关推荐
2个回答
|
|
|
第四部分?哪个部分
|
|
|
|
|
|
这个是什么问题,要说清楚哦
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
331 浏览 0 评论
532 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
842 浏览 0 评论
1383 浏览 2 评论
824 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16911 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 11:08 , Processed in 0.552235 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3638