关于MICROCHIP带AD的单片机机AD转换芯片XPT2046的问题

单片机芯片内部有ad,为什么还要用ad芯片_百度知道
单片机芯片内部有ad,为什么还要用ad芯片
我有更好的答案
天生缺陷(模拟部分电源不可避免受到数字内核部分影响)导致精度不足百度嫌我字数不够
采纳率:66%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。关于51单片机的AD转换出了问题,求教大神,谢谢~!_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:150,092贴子:
关于51单片机的AD转换出了问题,求教大神,谢谢~!收藏
我做的是基于51单片机的烟雾报警器,用的是ADC0808仿真,利用一块74芯片把单片机ALE输出的信号四分频到0808的CLK上,还用中断定时了4us翻转一次,可是CLK管脚电平一直没变化...是不是定时的程序写错了?另外,1602显示的两个数字,上面是可以设的报警值,下面是实时测的浓度,可我怎么调模拟的电压值换算的浓度都不对,该报警的没报警...我不知道哪里错了..以下是图加代码:#include &reg52.h&#define uint unsigned int #define uchar unsigned char#define Data_ADC0809 P1 //定义P1口Data_ADC0809 (之后的程序里Data_ADC0809即代表P口) sbit Ledg=P3^2; //绿灯sbit Ledr=P3^1;sbit Buzzer=P3^0; //蜂鸣器接口sbit LCDRS = P2^5;sbit LCDEN= P2^7;uchar code Init1[]=&SET E:000&;uchar code Init2[]=&NOW E:000&;uint yushe_yanwu=5000;//预设浓度值sbit CLK=P3^6;sbit ST=P3^3;sbit EOC=P3^4;sbit OE=P3^5;sbit jia=P2^3; //加按键sbit jian=P2^4; //减按键 //用于读取ADC数据 //函数声明extern uchar ADC0809();extern void Keyscan();void delay(uint z)
//延时函数大约延时z ms{uint i,j;for(i=0;i&z;i++)for(j=0;j&121;j++);}void LCDdelay(uint z)
//LCD延时,该延时大约100us(不精确,液晶操作的延时不要求很精确){
for(x=z;x&0;x--)
for(y=10;y&0;y--);}//写命令void write_com(uchar com){
LCDdelay(5);
LCDdelay(5);
LCDEN=0;}//写数据void write_data(uchar date){
LCDdelay(5);
LCDdelay(5);
LCDEN=0;}//1602初始化void Init1602(){
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80);//设置位置
for(i=0;i&9;i++)
{write_data(Init1[i]);
//显示数组1的数据
write_com(0x80+0x40);//设置位置
for(i=0;i&9;i++)
{write_data(Init2[i]);
//显示数组2的数据
}}void Display_1602(yushe_yanwu,temp){
//设置烟雾write_com(0x80+6);
write_data(0x30+yushe_yanwu/10000);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%100/10);write_data(0x30+yushe_yanwu%10);//实时烟雾write_com(0x80+0x40+6);write_data(0x30+yushe_yanwu/10000);write_data(0x30+yushe_yanwu%);write_data(0x30+temp%);write_data(0x30+temp%100/10);write_data(0x30+temp%10);}//ADC0809读取信息uchar ADC0809(){uchar temp_=0x00;//初始化高阻太OE=0;//转化初始化ST=0;//开始转换ST=1;ST=0;while(EOC==0) //外部中断等待AD转换结束OE=1;
//读取转换的AD值temp_=Data_ADC0809;OE=0;return temp_;}void Keyscan(){if(jia==0) //加按键{while(jia==0); //加按键按下时
yushe_yanwu++;
//浓度阀值设置
if(yushe_yanwu&=10000)
yushe_yanwu=10000;
write_com(0x80+6);
write_data(0x30+yushe_yanwu/10000);
write_data(0x30+yushe_yanwu%);
write_data(0x30+yushe_yanwu%);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
}if(jian==0)
//减按键{while(jian==0);yushe_yanwu--;
//同上if(yushe_yanwu&=0)yushe_yanwu=0;write_com(0x80+6);write_data(0x30+yushe_yanwu/10000);
write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%100/10);write_data(0x30+yushe_yanwu%10);}delay(200);
//延时write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁}/*****主函数*****/void main(){TMOD=0x01;//选择定时器0方式一工作为16位工作方式TH0=(6;
//四分频,定时4usCLK翻转一次 TL0=(6; TR0=1; ET0=1; EA=1;Init1602();
//调用初始化显示函数while(1)
//进入循环{temp=ADC0809();
//读取烟雾值Keyscan();
//调用按键函数
扫描按键 Display_1602(yushe_yanwu,temp);
//显示预设烟雾,温度值,烟雾值if(temp&=yushe_yanwu)
//烟雾值大于等于预设值时{Ledr=1;Ledg=0;
//红灯亮Buzzer=1;
//蜂鸣器报警}else
//烟雾值小于预设值时{Ledg=1;Ledr=0;
//绿灯亮Buzzer=0;
//蜂鸣器停止报警}}}void t0() interrupt 1{
CLK=~CLK;}.
超低功耗,256KB-512KB闪存,可扩展存储器,备有开发板
不好意思,代码有些错了,原本的改为uchar code Init1[]=&SET E:00000&;uchar code Init2[]=&NOW E:00000&;键盘扫描的按加键和按减键改为:if(jia==0) //加按键{while(jia==0); //加按键按下时
yushe_yanwu=yushe_yanwu+100;.....if(jian==0)
//减按键{while(jian==0);yushe_yanwu=yushe_yanwu-100;.....
这变量,,,
我粗略看下,,好多问题
已阅-------本人擅长长Ai、Fw、Fl、Br、Ae、Pr、Id、PS等软件 的安装与卸载,精通CSS、JavaScript、PHP、C、 C++、java、Ruby、Perl、Lisp、python、Obj ective-C、ActionScript等单词的拼写,熟悉windows、Linux、Mac、Android、IOS等系统的开关机。
51的程序怎么和pertous仿真联系到一块啊
睡前最后改的代码...CLK管脚接示波器还是没反应,不能转换...不知道代码出错在哪...PS:晶振是11.0562MHz,用的是MQ-2烟雾传感器,可测范围300~10000ppm.。求大神赐教,谢谢~#include &reg52.h&#define uint unsigned int #define uchar unsigned char#define Data_ADC0809 P1 //定义P1口Data_ADC0809 (之后的程序里Data_ADC0809即代表P口) sbit Ledg=P3^2; //绿灯sbit Ledr=P3^1;sbit Buzzer=P3^0; //蜂鸣器接口sbit LCDRS = P2^5;sbit LCDEN= P2^7;uchar code Init1[]=&SET E:00000&;uchar code Init2[]=&NOW E:00000&;uint yushe_yanwu=5000;//预设浓度值sbit CLK=P3^6;sbit ST=P3^3;sbit EOC=P3^4;sbit OE=P3^5;sbit jia=P2^3; //加按键sbit jian=P2^4; //减按键 //用于读取ADC数据 //函数声明extern uchar ADC0809();extern void Keyscan();void delay(uint z)
//延时函数大约延时z ms{uint i,j;for(i=0;i&z;i++)for(j=0;j&121;j++);}void LCDdelay(uint z)
//LCD延时,该延时大约100us(不精确,液晶操作的延时不要求很精确){
for(x=z;x&0;x--)
for(y=10;y&0;y--);}//写命令void write_com(uchar com){
LCDdelay(5);
LCDdelay(5);
LCDEN=0;}//写数据void write_data(uchar date){
LCDdelay(5);
LCDdelay(5);
LCDEN=0;}//1602初始化void Init1602(){
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80);//设置位置
for(i=0;i&9;i++)
{write_data(Init1[i]);
//显示数组1的数据
write_com(0x80+0x40);//设置位置
for(i=0;i&9;i++)
{write_data(Init2[i]);
//显示数组2的数据
}}void Display_1602(yushe_yanwu,temp){
//设置烟雾write_com(0x80+6);
write_data(0x30+yushe_yanwu/10000);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%100/10);write_data(0x30+yushe_yanwu%10);//实时烟雾write_com(0x80+0x40+6);temp=(uint)(temp/256*10000);write_data(0x30+temp/10000);write_data(0x30+temp%);write_data(0x30+temp%);write_data(0x30+temp%100/10);write_data(0x30+temp%10);}//ADC0809读取信息uchar ADC0809(){uchar temp_=0x00;//初始化高阻太OE=0;//转化初始化ST=0;//开始转换ST=1;ST=0;while(EOC==0) //外部中断等待AD转换结束OE=1;
//读取转换的AD值temp_=Data_ADC0809;OE=0;return temp_;}void Keyscan(){if(jia==0) //加按键{while(jia==0); //加按键按下时
yushe_yanwu=yushe_yanwu+100;
//浓度阀值设置
if(yushe_yanwu&=10000)
yushe_yanwu=10000;
write_com(0x80+6);
write_data(0x30+yushe_yanwu/10000);
write_data(0x30+yushe_yanwu%);
write_data(0x30+yushe_yanwu%);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
}if(jian==0)
//减按键{while(jian==0);yushe_yanwu=yushe_yanwu-100;
//同上if(yushe_yanwu&=0)yushe_yanwu=0;write_com(0x80+6);write_data(0x30+yushe_yanwu/10000);
write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%);write_data(0x30+yushe_yanwu%100/10);write_data(0x30+yushe_yanwu%10);}delay(200);
//延时write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁}/*****主函数*****/void main(){TMOD=0x01;//选择定时器0方式一工作为16位工作方式TH0=(6;
//四分频,定时4usCLK翻转一次TL0=(6;TR0=1;ET0=1;EA=1;Init1602();
//调用初始化显示函数while(1)
//进入循环{temp=ADC0809();
//读取烟雾值Keyscan();
//调用按键函数
扫描按键 Display_1602(yushe_yanwu,temp);
//显示预设烟雾,烟雾值 temp=(uint)(temp/256*10000);if(temp&=yushe_yanwu)
//烟雾值大于等于预设值时{Ledr=1;Ledg=0;
//红灯亮Buzzer=1;
//蜂鸣器报警}else
//烟雾值小于预设值时{Ledg=1;Ledr=0;
//绿灯亮Buzzer=0;
//蜂鸣器停止报警}}}void t0() interrupt 1{
CLK=~CLK;}
登录百度帐号51单片机 hc 搭载XPT2046的芯片 用这芯片写了段模数转换的代码_百度知道
51单片机 hc 搭载XPT2046的芯片 用这芯片写了段模数转换的代码
#include &reg52.h&
#include &intrins.h&
#define uchar unsigned char
#define uint unsigned int
sbit DOUT=P3^7;
sbit CLK=P3^6;
sbit DIN=P3^4;
sbit CS=P3^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0...
我有更好的答案
你好!程序要跟硬件电路结合到一起的,你的电路是怎么连接的?
就开发板默认的连接 没接其他东西
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。21ic官方微信-->
STC单片机AD转换误差的问题
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
本帖最后由 lizexi486 于
22:53 编辑
公司用的是宏晶STCL2LE5204AD单片机(8位转换精度),做一个充电器采集充电电池电压,但误差比较大,有时在0.05V,有时甚至超过0.1V的误差,这么大的误差不太能接收啊,问题会出在哪呢?请指教。AD采集后已经取了平均值还是如此大的有误差。
满意回复+10
第一,STC芯片没有内部基准,也没有外部基准引脚,用电源作为基准,首先你的电源精度要高,转换的结果精度才高。
第二,用这样芯片做充电控制,如果用锂电池的话 ...
对,要求严格可外接一个基准,每次先采样它(TL431即可),再采样其它电压。。。(见STC DS)
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
第一,STC芯片没有内部基准,也没有外部基准引脚,用电源作为基准,首先你的电源精度要高,转换的结果精度才高。
第二,用这样芯片做充电控制,如果用锂电池的话,不加特别措施,那是锂电池破坏器
第三,建议楼主多找找AD转换的相关资料看看
高级工程师, 积分 7522, 距离下一级还需 478 积分
高级工程师, 积分 7522, 距离下一级还需 478 积分
高级工程师, 积分 7522, 距离下一级还需 478 积分
高级工程师, 积分 7522, 距离下一级还需 478 积分
对,要求严格可外接一个基准,每次先采样它(TL431即可),再采样其它电压。。。(见STC DS)
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
中级技术员, 积分 178, 距离下一级还需 122 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
高级工程师, 积分 5875, 距离下一级还需 2125 积分
三楼这个办法不好,锂电池充电控制精度要1%
用8位AD的STC显然是不合适的
至少要用10位的AD
单片机中一般用除法用整除法,余数舍弃,除非你用浮点计算,或其他改良的计算方法
STC推荐的那个方法,仔细考虑还是欠妥
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
采用外部TL431B 进行基准定位,然后再进行软件滤波,如果只是做充电宝,你可以加上浮点运算,直接的使用芯片的内部10位AD就够了!5V的话,调试的好的话可以在0.01V是没问题的!!
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
补充一下,可以先平均滤波,然后在进行中位值滤波,这样子的话,你的数据就会比较的稳定了!个人的拙见!
中级技术员, 积分 165, 距离下一级还需 135 积分
中级技术员, 积分 165, 距离下一级还需 135 积分
中级技术员, 积分 165, 距离下一级还需 135 积分
中级技术员, 积分 165, 距离下一级还需 135 积分
赛元/芯海,ADC精度高,内部校准,分别是10bit/12bitADC,有效位数也是10位/12位,可索取资料QQ黄生
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 275, 距离下一级还需 25 积分
中级技术员, 积分 275, 距离下一级还需 25 积分
中级技术员, 积分 275, 距离下一级还需 25 积分
中级技术员, 积分 275, 距离下一级还需 25 积分
ADC线性度差,要做校正,与外接基准源与否没有必然关系。
扫描二维码,随时随地手机跟帖
无冕之王奖章
等级类勋章
时间类勋章
技术奇才奖章
人才类勋章
沉静之湖泊
发帖类勋章
奔腾之江水
发帖类勋章
技术导师奖章
人才类勋章
技术高手奖章
人才类勋章
时间类勋章
时间类勋章
您需要登录后才可以回帖
热门推荐 /7
MACOM在线研讨会正在召开~51单片机 AD转换,AD芯片型号选择_百度知道
51单片机 AD转换,AD芯片型号选择
AD要求1路输入,0-5V电压输入,在1ms中要有10-20次采样。
我有更好的答案
51单片机可以使用AD0809,满足你说的要求,而且编程简单,网上多的是,当然是有STC12或者STC15系列的内部AD也可。
采纳率:60%
选STC12C5A60S2或这个系列的单片机,自带AD,不需要外加AD芯片了。
我习惯用单片机内部AD
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 MICROCHIP带AD的单片机 的文章

 

随机推荐