/*****************
*adc0832.c
*AD转换,结果在数码管显示
******************/
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#include"delay.h"
//ADC0832引脚定义
sbit clk=P3^0;
sbit dio=P3^1;
sbit cs=P3^3;
code uchar dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段值表:
/*********************
*显示函数,参数dat是要显示的数据
*********************/
void display(uint dat)
{
uchar xxx=0;
xxx=(dat/100); //百位
P2=0xff;
P0=dis_code[xxx];
P2=0xfe;
delay_ms(2);
xxx=((dat%100)/10); //十位
P2=0xff;
P0=dis_code[xxx];
P2=0xfd;
delay_ms(2);
xxx=(dat%10); //个位
P2=0xff;
P0=dis_code[xxx];
P2=0xfb;
delay_ms(2);
}
/*********************
*初始化ADC0832
*********************/
void init_adc(void)
{
cs=1;
clk=1;
dio=1;
_nop_();_nop_();
}
/*********************
*在ADC0832的DI口输入起始信号
**********************/
void start_adc(void)
{
cs=0;
clk=0;
dio=1; //第1个时钟下降沿之前,DI高,开始
_nop_();_nop_();
clk=1; //第1个时钟信号开始
_nop_();_nop_();
}
/************************************
*在ADC0832的DI口输入通道选择
************************************/
void select_channel(uchar ch)
{
switch(ch)
{case 0: //此段SGL和ODD分别是1和0,单端、CH0转换
clk=0; //第1个时钟信号下降沿
dio=1; //第2个时钟下降沿之前,发送SGL信号选择单端
_nop_();_nop_();
clk=1;
_nop_();_nop_();
clk=0; //第2个时钟信号下降沿
dio=0; //第3个时钟下降沿之前,发送ODD信号选择通道
_nop_();_nop_();
clk=1;
_nop_();_nop_();
break;
//下面不能仿真。不知原因。
case 1: //此段SGL和ODD分别是1和1,单端、CH1转换
clk=0; //第1个时钟信号下降沿
dio=1; //第2个时钟下降沿之前,发送SGL信号选择单端
_nop_();_nop_();
clk=1;
_nop_();_nop_();
clk=0; //第2个时钟信号下降沿
dio=1; //第3个时钟下降沿之前,发送ODD信号选择通道
_nop_();_nop_();
clk=1;
_nop_();_nop_();
break;
}
}
/******************************
*从ADC0832的DO口读取数据
*返回:dat1非0转换的结果,0表示转换失败
******************************/
uchar adc0832(void)
{
uchar dat1=0;
uchar dat2=0;
uchar i=0;
uchar tmp=0;
clk=0; //第3个时钟下降沿
dio=1; //此时dio端口数据无效的
//可以理解下面要读数据了,必须把DIO置1,否则总线会逻辑冲突
_nop_();_nop_();
//第4--第11共8个下降沿进行数据转换,高位在前、低位在后
for(i=0;i<8;i++)
{
clk=1;
_nop_();_nop_();
clk=0;
_nop_();_nop_();
dat1=((dat1<<1)|dio);
}
//第11--18共8个下降沿转换数据,低位在前、高位在后
//注意:合用第11个下降沿
for(i=0;i<8;i++)
{
tmp=0;
tmp=dio;
dat2=(dat2|(tmp<<i));
clk=1;
_nop_();_nop_();
clk=0;
_nop_();_nop_();
}
cs=1;
_nop_();_nop_();
if(dat1==dat2)
{
return dat1;
}else
{
return 0;
}
}
/*********************
*主函数,转换结果在数码管显示
*********************/
void main(void)
{
uint tmp=0;
init_adc();
while(1)
{
start_adc();
select_channel(0);
tmp=adc0832();
tmp=(tmp*100)/51;
display(tmp);
}
}
ADC0832模数转换PROTEUS仿真与代码
4星 · 超过85%的资源 需积分: 47 108 浏览量
2014-04-02
12:35:04
上传
评论 4
收藏 58KB RAR 举报
nj-dzxx
- 粉丝: 1
- 资源: 3
最新资源
- 机器学习和数据挖掘课程设计-米其林餐厅数据挖掘管理系统源码+使用文档说明.zip
- html html html展示我与ai的对化
- 数据结构课程设计-全国交通出行咨询模拟系统C语言实现源码.zip
- cef-binary-109.0.1+gcd5e37a+chromium-109.0.5414.8-windows32
- 基于C语言的全国交通咨询系统模拟源码.zip
- 正点原子HAL库 STM32F4 DMA(学习自用附源码)
- 炫酷代码雨,超级炫酷哦!!!
- 基于物联网MQTT协议的智能停车场管理系统
- POETIZE个人博客系统源码 - 最美博客
- 基于深度学习的行人检测系统源码+项目说明(YoloV3+Tensorflow).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈