专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
关于将模拟信号转变成数字信号然后送入单片机内进行处理
2019-07-16 05:16
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
4983
11
1094
一直都很疑惑如何将由传感器得到的模拟信号经过转变,然后送入
单片机
内进行处理。请高手指教,最好有个实例讲解,小生不胜感激,这个问题困扰好久了,找了好久都没有答案
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
獊韹→狼
2019-07-16 12:12
关键是想用什么样的AD芯片!我用的是PCF8591!
#include <reg52.h>
#define unint unsigned int
#define unchar unsigned char
#define PCF8591_WRITE 0x90 //本机的PCF8591芯片地址为 1001 0000 即为低四位的前三位为000.不同开发板可能不同
#define PCF8591_READ 0x91
unchar ge,shi,bai,idata receive_da;
sbit SDA=P2^1;
sbit SCL=P2^0;
sbit dula=P1^0;
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unchar AD_CHANNEL;
void delay() //响应函数
{ ; ; }
void init() //总线初始化函数
{
SDA=1;
delay();
SCL=1;
delay();
}
void iic_start() //启动函数
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
/*SCL=0;
delay(); */
}
void STOP_I2C() //停止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void ACK_I2c() // 应答
{
unint i;
SCL=1;
delay();
while((SDA=1)&&(i<255)) i++;
SCL=0;
delay();
}
void NOACK_I2c() //非应答
{
SCL=1;
delay();
SDA=0;
SCL=0;
delay();
}
void write_byte(unchar date )
{
unchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
// SCL=1; 调试时的错误
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
}
unchar read_byte()
{
unchar k,j;
SCL=0; // 为下一步SDA=1作准备
delay();
SDA=1;//置“读取数据”模式
delay();
//以便数据变化
for(j=0;j<8;j++)
{
SCL=1;///让数据稳定才能读操作
delay();
k=(k<<1)|SDA;
SCL=0;//完成一个时钟
delay();
}
return k;
}
unchar ADC_PCF8591(unchar controlbyte) //完整的AD转换函数,注意要先写后读
{
unchar c,i=0;
iic_start();
write_byte(PCF8591_WRITE);
ACK_I2c();
write_byte(controlbyte); //控制字
ACK_I2c();
iic_start();
write_byte(PCF8591_READ);
ACK_I2c();
c=read_byte();
NOACK_I2c();
STOP_I2C();
return(c); //返回读的数据
}
void main()
{ unchar i,j;
unchar LedOut[8];
unint D[10];
init();
while(1)
{/********以下AD-DA处理*************/
switch(AD_CHANNEL)
{
case 0:
D[0]=ADC_PCF8591(0x41)*2; //ADC0 模数转换1 放大2倍显示
break;
case 1:
D[1]=ADC_PCF8591(0x42)*2; //ADC1 模数转换2
break;
case 2:
D[2]=ADC_PCF8591(0x43)*2; //ADC2 模数转换3
break;
case 3:
D[3]=ADC_PCF8591(0x40)*2; //ADC3 模数转换4
break;
// case 4: DACconversion(0x90,0x40, D[4]/4); //DAC 数模转换
break;
}
// D[4]=400; //数字--->>模拟输出
//D[4]=D[0]; // 把模拟输入 采样的信号 通过数模转换输出
if(++AD_CHANNEL>4) AD_CHANNEL=0;
/********以下将AD的值送到LED数码管显示,本程序只使用了两个通道即D1和D2*************/
LedOut[0]=Disp_Tab[D[1]%10000/1000];
LedOut[1]=Disp_Tab[D[1]%1000/100];
LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;
LedOut[3]=Disp_Tab[D[1]%10];
LedOut[4]=Disp_Tab[D[0]%10000/1000];
LedOut[5]=Disp_Tab[D[0]%1000/100];
LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;//含小数点
LedOut[7]=Disp_Tab[D[0]%10];
for( i=0; i<8; i++)
{ P0 = LedOut[i];
switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间
}
P0 = 0;
}
}
//本例中暂时只有模数转换,数模转换需要修改程序
加载中...
查看其它11个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <reg52.h>
#define unint unsigned int
#define unchar unsigned char
#define PCF8591_WRITE 0x90 //本机的PCF8591芯片地址为 1001 0000 即为低四位的前三位为000.不同开发板可能不同
#define PCF8591_READ 0x91
unchar ge,shi,bai,idata receive_da;
sbit SDA=P2^1;
sbit SCL=P2^0;
sbit dula=P1^0;
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unchar AD_CHANNEL;
void delay() //响应函数
{ ; ; }
void init() //总线初始化函数
{
SDA=1;
delay();
SCL=1;
delay();
}
void iic_start() //启动函数
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
/*SCL=0;
delay(); */
}
void STOP_I2C() //停止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void ACK_I2c() // 应答
{
unint i;
SCL=1;
delay();
while((SDA=1)&&(i<255)) i++;
SCL=0;
delay();
}
void NOACK_I2c() //非应答
{
SCL=1;
delay();
SDA=0;
SCL=0;
delay();
}
void write_byte(unchar date )
{
unchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
// SCL=1; 调试时的错误
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
}
unchar read_byte()
{
unchar k,j;
SCL=0; // 为下一步SDA=1作准备
delay();
SDA=1;//置“读取数据”模式
delay();
//以便数据变化
for(j=0;j<8;j++)
{
SCL=1;///让数据稳定才能读操作
delay();
k=(k<<1)|SDA;
SCL=0;//完成一个时钟
delay();
}
return k;
}
unchar ADC_PCF8591(unchar controlbyte) //完整的AD转换函数,注意要先写后读
{
unchar c,i=0;
iic_start();
write_byte(PCF8591_WRITE);
ACK_I2c();
write_byte(controlbyte); //控制字
ACK_I2c();
iic_start();
write_byte(PCF8591_READ);
ACK_I2c();
c=read_byte();
NOACK_I2c();
STOP_I2C();
return(c); //返回读的数据
}
void main()
{ unchar i,j;
unchar LedOut[8];
unint D[10];
init();
while(1)
{/********以下AD-DA处理*************/
switch(AD_CHANNEL)
{
case 0:
D[0]=ADC_PCF8591(0x41)*2; //ADC0 模数转换1 放大2倍显示
break;
case 1:
D[1]=ADC_PCF8591(0x42)*2; //ADC1 模数转换2
break;
case 2:
D[2]=ADC_PCF8591(0x43)*2; //ADC2 模数转换3
break;
case 3:
D[3]=ADC_PCF8591(0x40)*2; //ADC3 模数转换4
break;
// case 4: DACconversion(0x90,0x40, D[4]/4); //DAC 数模转换
break;
}
// D[4]=400; //数字--->>模拟输出
//D[4]=D[0]; // 把模拟输入 采样的信号 通过数模转换输出
if(++AD_CHANNEL>4) AD_CHANNEL=0;
/********以下将AD的值送到LED数码管显示,本程序只使用了两个通道即D1和D2*************/
LedOut[0]=Disp_Tab[D[1]%10000/1000];
LedOut[1]=Disp_Tab[D[1]%1000/100];
LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;
LedOut[3]=Disp_Tab[D[1]%10];
LedOut[4]=Disp_Tab[D[0]%10000/1000];
LedOut[5]=Disp_Tab[D[0]%1000/100];
LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;//含小数点
LedOut[7]=Disp_Tab[D[0]%10];
for( i=0; i<8; i++)
{ P0 = LedOut[i];
switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间
}
P0 = 0;
}
}
//本例中暂时只有模数转换,数模转换需要修改程序
一周热门 更多>