找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14909|回复: 1
打印 上一主题 下一主题
收起左侧

关于51单片机AD转换的问题

[复制链接]
跳转到指定楼层
楼主
使用单片机自带的AD转换功能将模拟量转换为数字量,并以float输发送给串口调试助手,但是发现通过调试助手得到的电压值与实际测得的电压值不同,小弟C语言能力一般,请大神们帮助看看程序应该怎门改。附上程序和部分原理图。。。。。
#include "reg51.h"
#include "intrins.h"
#define FOSC 22118400L
#define BAUD 9600
#define V_SCALE (4.89f/1024)

typedef unsigned char BYTE;
typedef unsigned int WORD;

union float2int{
BYTE num[4];
float f;
}data_send;
/*声明与ADC有关的SFR*/
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xC5;//ADC控制寄存器
sfr ADC_DATA = 0xC6;//DC高8为结果寄存器
sfr ADC_LOW2 = 0xBE;//ADC结果寄存器低2位有效
sfr P1M0 = 0x91;//P1口模式控制寄存器0
sfr P1M1 = 0x92;//P1口模式控制寄存器1
/*定义ADC_CONTR中ADC操作常量*/
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC开始控制位
#define ADC_SPEEDLL 0x00 //1080
#define ADC_SPEEDL 0x20 //810
#define ADC_SPEEDH 0x40 //540
#define ADC_SPEEDHH 0x60 //270 clocks
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
void SendHello(BYTE dat);
void ADC_DataProcess(void);
//ADC channel NO.
BYTE ch = 2;
void main()
{
InitUart();
InitADC();
AUXR |= 0x10;//set EADCI
IE = 0xa0;//开中断
//EA = 1;
//SendHello('H');
while(1);
}
/**
* ADC interrupt service routine
*
*/
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &= !ADC_FLAG;//清ADC中断标志位
// SendData(ADC_DATA);
// SendData(ADC_LOW2);
// SendData('\n');
ADC_DataProcess();
// if((++ch) > 7)
// {
// ch = 0;
// SendData('\n');
// }
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
void ADC_DataProcess(void)
{
unsigned int temp;
unsigned int t2;
unsigned int t;
//float f;
temp = ADC_DATA;
t2 = ADC_LOW2;
temp = temp<<2;
temp = temp + t2;

t = temp * 478;//V_SCALE;
// SendData(data_send.num[3]);
// SendData(data_send.num[2]);
// SendData(data_send.num[1]);
// SendData(data_send.num[0]);
//f = f*1000.0;
SendData((t/100000) + '0');
SendData('.');
SendData((t/10000)%10 + '0');
SendData((t/1000)%10 + '0');
SendData(t%10 + '0');
SendData('\n');
}
/**
* Initial ADC sfr
*/
void InitADC()
{
P1 = P1M0 = P1M1 |= 0xff;//把P1设为开漏
ADC_DATA = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2);
}
/**
* Initial UART
*/
void InitUart()
{
//PCON &= 0x7F; //波特率不倍速
SCON = 0x52; //8位数据,可变波特率
//TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}

/**
* 发送一个字节数据
*/
void SendData(BYTE dat)
{
while(!TI); //等待
TI = 0;
SBUF = dat;
}
void SendHello(BYTE dat)
{
while(!TI); //等待
TI = 0;
SBUF = dat;
}

/**
* 软件延时
*/
void Delay(WORD n)
{
WORD x;
while(n--)
{
x = 5000;
while(x--);
}
}



搜狗截图14年05月18日1036_1.png (25.69 KB, 下载次数: 156)

搜狗截图14年05月18日1036_1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:159630 发表于 2017-4-6 15:02 | 只看该作者
看看晶振与程序是否一致
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表