求51单片机实现AD转换及串口数据发送的程序?谢谢了!
AD:
/*-----------------------------------------------
名称:IIC协议 PCF8591 AD/DA转换
论坛:www.doflye.net
编写:shifang
修改:无
内容:使用4路AD中的1路检测外部模拟量输入
------------------------------------------------*/
#include
#include "i2c.h"
#include "delay.h"
#include "display.h"
#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
extern bit ack;
unsigned char ReadADC(unsigned char Chl);
bit WriteDAC(unsigned char dat);
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsigned char num=0;
Init_Timer0();
while (1) //主循环
{
num=ReadADC(0);
TempData[0]=dofly_DuanMa[num/100];
TempData[1]=dofly_DuanMa[(num%100)/10];
TempData[2]=dofly_DuanMa[(num%100)%10];
//主循环中添加其他需要一直工作的程序
DelayMs(100);
}
}
/*------------------------------------------------
读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
}
串口:
#include
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
while(1)
{
if(RI==1)
{
RI=0;
P1=SBUF;
}
}
}
void s() interrupt 0
{
RI=0;
P1=SBUF;
}
兄弟:不知道你玩不玩32 ,有个32 的在工程上用过,直接刷程序,串口连接电脑就可以输出AD 转换的结果。如果不玩32 的话。
首先第一步排查: 排查单片机能不能正确显示 你测试到的 AD 信号,显示正确不?
比如给他 3V 电压 ,用数码管显示出来。
第二: 串口发送,找个能正确发送数据的代码 ,直接把 ,你检查的数值给这个变量,让串口发送,
一步一步找问题,你绝对能解决的。我把AD0809 的代码给你用数码管测试
#include
#define uint unsigned int
#define uchar unsigned char
uchar code LEDData[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
sbit OE = P1^0;
sbit EOC = P1^1;
sbit ST = P1^2;
sbit CLK = P1^3;
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void Display_Result(uchar d)
{
P2 = 0xf7;
P0 = LEDData[d%10];
DelayMS(5);
P2 = 0xfb;
P0 = LEDData[d%100/10];
DelayMS(5);
P2 = 0xfd;
P0 = LEDData[d/100];
DelayMS(5);
}
void main()
{
TMOD = 0x02;
TH0 = 0x14;
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
P1 = 0x3f;
while(1)
{
ST = 0;
ST = 1;
ST = 0;
while(EOC == 0);
OE = 1;
Display_Result(P3);
OE = 0;
}
}
void Timer0_INT() interrupt 1
{
CLK = !CLK;
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar A1,A2,A3,A4;
sbit wr=P3^7;
sbit rd=P3^6;
sbit cs=P3^5;
sbit dian=P0^7;
uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示0到9的代码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar A1,uchar A2,uchar A3,uchar A4)//显示函数
{
P0=tab[A1];
P2=0x7f;
delay(1);
P0=tab[A2];
dian=1;
P2=0xbf;
delay(1);
P0=tab[A3];
P2=0xdf;
delay(1);
P0=tab[A4];
P2=0xef;
delay(1);
}
void main()
{ uchar a;
uint temp=0,sum=0;
P3=0xdf;//令AD 片选CS一直为选通状态
P1=0xff;
while(1)
{
for(a=255;a>0;a--)
{
display(A1,A2,A3,A4);
}
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
_nop_();
rd=1;
_nop_();
rd=0;
_nop_();
temp=P1;
rd=1;
temp=(temp*100*0.01961);//8位的ADC0804的分辨率为1/256,5x1/255=0.01961;
A1=temp/1000; // 数码管第一位显示数据
A2=temp%1000/100; // 数码管第二位显示数据
A3=temp%1000%100/10;//数码管第三位显示数据
A4=temp%1000%100%10; //数码管第四位显示数据
}
}
你按照AD的数据手册些时序就好了,AD不难,
单片机需要具体的型号吗?
51单片机采集的AD值的转换程序问题?
上次回答了你的问题,难道你上次选择的最佳答案,没有用吗?--- 0~2.5V,对应于AD_data = 0~11111...1111(24位二进制);那么1V就是:6710886(十进制)。用24位值AD_data除以6710886,得到的整数部分就是0~5,即为电压的整数部分。再把刚才除得的余数,再除以10,取整数将得到0~9,即为...
为什么51单片机还要外接什么AD转换,DA转换模块,单片机内部不是有这...
因为51单片机是一种比较经典的单片机,因此问世时间比avr时间长,它的芯片内部没有集成ad转换,而avr单片机芯片内部集成了ad转换,因此传统的51需要外接ad转换芯片,而avr不需要。不过随着时间的发展,新型的51单片机也有内部集成了ad芯片的,比如stc12c2052ad ...
51单片机做模数实验时,让数码管显示出AD芯片输出对应的值,可是为什么数 ...
A\/D转换电路的转换结果的最低位是会变化的,很正常,一是模拟电压不够稳定,要求非常稳定才能,可实际上做不到的,二是转换电压工作时会有点误差的,导致转换后的数字量的是低位是不稳定的,你用过,数字万能表吗,就是这种现象,不论测什么,最低位的数是不停在变化的,这是这个原因的。因为,...
51内核的单片机有带AD转换的吗?插针式最好是40脚的,请说明型号谢谢...
STC89系列的没有ADC。倒是AVR单片机中的Atmega16\/32\/8535是DIP40的,带10位ADC。
一个51单片机怎样能实现温度和AD两个数据同步传输到另一个单片机上,并...
串口通信方式,可以用无线串口模块(几元一个),蓝牙模块,wifi模块都可以实现。
51单片机ad转换的C语言程序怎么编写啊
芯片采样回来后,是一个AD值。需要转换成想要的一些内容的话,要做表格。如温度转换。首先要制作一个温度对应的AD表格。多大的值是多少度。查表可以采用顺序法进行。从表格的第一个开始查起,比第一个大时,再比较第二个,依次类推。每比较一次,将计数器累加一次。比上一个大,比下一个小时,就...
51单片机在ad中怎么找
51单片机在ad中怎么找,打开ad的原理图库,双击,鼠标移到原理图中就有你点击的原理图元器件了,运算符中选择包含,然后---范围---选择---库文件路径 搜索直接输入c51或者c52就行,引脚兼容的。
现有两片AD574A该如何与51单片机相连?
参考Z80的接线方式,根据你的需求简化一下。假设你的系统并没有其它占用并行总线的设备,那么A8接A0,A9A10分别作为两个片子的片选就可以了。51的P0口连接两片AD574A的DB7:DB0。51的RD#、WR#按照图中经过逻辑门分别连接AD574A的R\/C#和CE。51的P2.0接A0,P2.1、P2.2译码分别接两个AD574A...
为什么51单片机不能同时多路ad转换?如果只有一个ad芯片,那么要实现多 ...
虽然只有一个芯片,但多数AD芯片都 有多个输入通道(包括单片机内部的AD模块),且AD转换速度较高,因此可以分时复用,对于一些变化缓慢的信号,分时转换结果可以看作是”同时“转换得到的.对于只有一个输入通道的AD芯片我们也可以用CD4511等电子开关来选择切换不同的信号 ...
在51单片机中 什么是AD\/DA
AD就是模数转换,模拟量转换为数据量。DA就是数模转换,数据量转换为模拟量。
莫费安内: #include#include#define uchar unsigned char#define uint unsigned int uchar A1,A2,A3,A4; sbit wr=P3^7; sbit rd=P3^6; sbit cs=P3^5; sbit dian=P0^7; uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示0到9...
信阳市17876867348: 求51单片机控制AD转换及串口数据发送的程序? - ?
莫费安内: AD采集到0-5V电压信号转换为数值信号,经过单片机处理 通过串口发送给电脑,电脑用串口助手这个问题不是很慢解决啊,网上没有现成的程序的 需要解决说明编写的啊可以交流
信阳市17876867348: 51单片机怎么设置AD转换 - ?
莫费安内: 内部带AD转换器的可以对相关寄存器进行操作,然后进行采集,外置的可以编写相应的驱动函数,然后进行采集.
信阳市17876867348: 输入电压值到51单片机,求内部自带的ad转换的程序,谢谢大神们 - ?
莫费安内: stc的 PDF文档有例子,以下是STC12C5410AD单片机的AD程序 void adchange()//AD采集程序 {ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源 Delay1ms(1); //延时,等待内部电源稳定 P1M0=P1M0|0X07; //设置p1.0 P1.1和 ...
信阳市17876867348: 51单片机与AD转换程序 - ?
莫费安内: #include<reg51.h>#define uchar unsigned char#define uint unsigned int sbit wr=P2^6; sbit rd=P2^7; sbit adint=P2^5; delay(uint z) { uchar w; while(z--) { for(w=0;w<125;w++); } } ad_star() { wr=1; wr=0; wr=1; } main() { uchar a; while(1) { ad_star(); ...
信阳市17876867348: 51单片机怎么样转换AD数据 - ?
莫费安内: 如果用单 片机内部AD,可以参照厂商给的说文档,单 片机AD有8位和10位的,高档的有12位的,基准电压一般 是电源电压,对应输出数字量分别是0-255和0-1023 及0-4093,像 STC单 片机内AD是10位的,其说明文档中有C语言和汇编语言的例子
信阳市17876867348: 单片机AD采样结果如何以十进制发送到串口调试助手 - ?
莫费安内: 思路:假如你得到AD值是“1314”,那么就用除法把每位数据分出来并且变成ASCII码:'1' '3' '1' '4',然后通过串口发送.
信阳市17876867348: 求一个AD转换加上RS232的单片机串口通信程序 - ?
莫费安内: 用STC12C5201AD单片机就可以了,16脚的!#include #include #include #include #include #define uchar unsigned char#define uint unsigned int#define ADC_FLAG 0x10 #define ADC_START 0x08 uchar datt1=0; void delay(uint z) { uint x,y; for(x...
信阳市17876867348: 单片机AD转换 串行通讯 - ?
莫费安内: /*****************主函数**************/ void main() { init(); while(1) { AD(); P1 = ~AD_DATA[1]; ES=1; //允许串口中断--允许它中断,却没有它的处理函数! SBUF=AD_DATA[1];while(!TI); //--等待TI=1,但是,一旦TI=1,程序就跑飞了 TI=0; ES=0; } } 把:ES=1; //允许串口中断 删除试试.
信阳市17876867348: 求自带AD转换的51单片机,列举一下,举例应用电路及程序举例.?
莫费安内: 带AD的话,51都没有带的,一般是使用外置AD芯片,例如ADC0809 ;带AD的话,你可以选用Mega8,他内置AD转换模块的