完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
uchar ADC0832(uchar channel)//写入3为串行数据命令来决定工作方式:cho单端输入
{uchar i=0; uchar j; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; //DI为1 _nop_(); //延时两个指令周期 _nop_(); ADCS=0; //拉低cs,选通;确定数据输入开始 _nop_(); _nop_(); ADCLK=1; //时钟信号为高 _nop_(); _nop_(); ADCLK=0; //时钟信号为低,此处为第一个下降沿 _nop_(); _nop_(); ADCLK=1; //时钟信号为高 ADDI=channel&0x1; // 和0x01相位与,将channel的高七位变成0得到最低位 _nop_(); //如果是0,ADDI为0,如果是1,ADDI是1 _nop_(); ADCLK=0; //时钟信号为低,此处为第二个下降沿 _nop_(); _nop_(); ADCLK=1; //时钟信号为高 ADDI=(channel>>1)&0x1; //先右移一位,再与;如果是0,ADDI是1,如果是1,ADDI是1 _nop_(); _nop_(); ADCLK=0; //时钟信号为低,此处为第三个下降沿 ADDI=1; //DI为1 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) 就是这下面的看不懂 { dat|=ADDO;//收DO口数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; //左移一位。如果是0,ADDO为0,如果是1,ADDO为2,如果是2,ADDO为4, if(i==7) dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收DO数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉高CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端回到初始状态 dat<<=8; dat|=ndat; return(dat); //return ad k } |
|
相关推荐
13个回答
|
|
下面的就是串行接收数据,一次一位数据,8次是一个字节数据。
|
|
|
|
|
|
|
|
你好,看一下我的这个程序吧,很简单的,看下你就明白了,有哪里不懂的我们再讨论。 /********************************************************/ /*********************************包含头文件********************************/ #include /*********************************端口定义**********************************/ ***it CS = P3^4; ***it Clk = P1^0; ***it DIO = P1^1; /*******************************定义全局变量********************************/ unsigned char adval; //AD值 /**************************************************************************** 函数功能:AD转换子程序 入口参数:CH 出口参数:adval ****************************************************************************/ unsigned char A_D(bit CH) { unsigned char i; CS = 0; //片选 Clk = 0; //时钟拉低 Clk = 1; //时钟拉高 DIO = 1; //启动信号 if ( CH == 0 ) //通道选择 { Clk = 0; Clk = 1; DIO = 1; //通道0的第一位 Clk = 0; Clk = 1; DIO = 0; //通道0的第二位 } else { Clk = 0; Clk = 1; DIO = 1; //通道1的第一位 Clk = 0; Clk = 1; DIO = 1; //通道1的第二位 } Clk = 1; Clk = 0; for( i = 0;i < 8;i++ ) //读取八位AD值 { Clk = 1; Clk = 0; if ( DIO ) adval = (adval>>1) | 0x80; else adval = (adval>>1) | 0x00; } CS = 1; //释放ADC0832 return(adval); //返回采样值 } |
|
|
|
楼上的程序很专业,楼主发的程序一看就是很业余的!
|
|
|
|
谢谢,确实你的程序思路非常清楚,也很好懂 |
|
|
|
你好!我用您的程序在proteus中仿真,无论选择哪个通道。显示的都是通道1的值。很晕啊。什么问题? 谢谢! |
|
|
|
真的不错
|
|
|
|
最后面的那个if语句表示什么意思啊? |
|
|
|
好像运行不合适啊。
|
|
|
|
|
|
|
|
DIO = 1; //通道1的第二位 } Clk = 1; Clk = 0; for( i = 0;i < 8;i++ ) //读取八位AD值 { Clk = 1; 这部分运行有问题,望老师能解答 |
|
|
|
谢谢楼上分享和解答,但是怎么运行调用还是有点不懂,希望能分享一下主程序调用的例子
|
|
|
|
进来学习!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11787 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:49 , Processed in 0.883688 second(s), Total 97, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号