1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STC12C5A60S2 四路AD同时采集,怎么把采集到的数据放到一个数组里,。。。。。。。我写的程序能够采集,但必须是每路采集后必须通过串口发出去,在进行下一路采集,不能同时放到一个数组里,否则采集的数据都是一样的。。。。。 ADC.c (1.73 KB )
|
|
相关推荐
14个回答
|
|
回复【2楼】Badu_Space:
------------------------------- 我写的程序是把采集到每路的值分别放到数组的每个元素里,最后把数组里的元素分别通过出口显示出来,结果发现元素的值都是一样的,如果不放到数组里,采集完一路就显示出来,那会每路都不一样。这是为什么呀? |
|
|
|
对数组每个元素进行操作即可
|
|
|
|
直接贴代码吧
|
|
|
|
#include"12.h"
#include"intrins.h" #define uint8 unsigned char #define uint16 unsigned int uint8 datah0=0; uint8 datah1=0; uint8 datah2=0; uint8 datah3=0; uint8 tab[4]; void StartUART( void ); void R_S_Byte(uint8 R_Byte); void ADC_Init0(void) { P1ASF=0x0F;//P1.0,P1.1,P1.2,P1.3口作为模拟功能AD使用。 ADC_CONTR=0X80;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD转换控制位初始化为0,选择P1.0作为AD输入来用。 EA=1; EADC=1;//中断允许控制为 AUXR1=0X00;//低两位存放在ADCRESL低两位中,高八位存放在ADCRES中 //PADC=0; } void ADC_Init1(void) { ADC_CONTR=0X81;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD转换控制位初始化为0,选择P1.1作为AD输入来用。 } void ADC_Init2(void) { ADC_CONTR=0X82; } void ADC_Init3(void) { ADC_CONTR=0X83; } void display(uint8 num) { uint8 hundred,ten,one; float a; intb; a=(num+0.005)/51; a=a*100; b=a; hundred=b/100; ten=b%100/10; one=b%10; } void main() { uint8 i; StartUART(); ADC_Init0(); ADC_Init1(); ADC_Init2(); ADC_Init3(); while(1) { ADC_CONTR=0X88;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD开始转换,选择P1.0作为AD输入来用。 _nop_(); _nop_(); _nop_(); _nop_();/*以上是四个时钟延时*/ // R_S_Byte(datah0); tab[0]=datah0; ADC_CONTR=0X89;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD开始转换,选择P1.1作为AD输入来用。 _nop_(); _nop_(); _nop_(); _nop_(); /*以上是四个时钟延时*/ // R_S_Byte(datah1); tab[1]=datah1; ADC_CONTR=0X8A; _nop_(); _nop_(); _nop_(); _nop_(); // R_S_Byte(datah2); tab[2]=datah2; ADC_CONTR=0X8B; _nop_(); _nop_(); _nop_(); _nop_(); // R_S_Byte(datah3); tab[3]=datah3; R_S_Byte('#'); for(i=0;i<4;i++) { R_S_Byte(tab); } R_S_Byte('@'); } } void adc_isr() interrupt 5 { ADC_CONTR=0X80; _nop_(); _nop_(); _nop_(); _nop_(); datah0=ADC_RES; /***************************/ ADC_CONTR=0X81; _nop_(); _nop_(); _nop_(); _nop_(); datah1=ADC_RES; ADC_CONTR=0X82; _nop_(); _nop_(); _nop_(); _nop_(); datah2=ADC_RES; ADC_CONTR=0X83; _nop_(); _nop_(); _nop_(); _nop_(); datah3=ADC_RES; } void StartUART( void ) { //波特率9600 SCON = 0x50; TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD;  CON = 0x00; TR1 = 1; } //************************************通过串口将接收到数据发送给PC端************************************** void R_S_Byte(uint8 R_Byte) { SBUF = R_Byte; while( TI == 0 ); //查询法 TI = 0; } 这样写。。。。。。。。。。。数值都一样。。。。。。。。。。。。。。。。。。。 如果// R_S_Byte(datah0); // R_S_Byte(datah1); // R_S_Byte(datah2); // R_S_Byte(datah3);不注释掉。。。。。。。。。各通道数值就不会影响 |
|
|
|
思路不错,R_S_Byte这个函数得改下,先判断标志在放上数据
|
|
|
|
判断什么标志位,怎么判断?
|
|
|
|
这个函数
void R_S_Byte(uint8 R_Byte) { SBUF = R_Byte; while( TI == 0 ); //查询法 TI = 0; } 改为这样 void R_S_Byte(uint8 R_Byte) { while( TI == 0 ); //查询法 SBUF = R_Byte; TI = 0; } |
|
|
|
|
|
|
|
|
|
|
|
你能帮我解决吗?
|
|
|
|
没有板子,看着逻辑可以啊
|
|
|
|
同时采集?好像只能一个一个通道采集吧.
|
|
|
|
#include"REG51.h"
#include"intrins.h" #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; /*Declare SFR associated with the ADC */ sfr ADC_CONTR = 0xBC; //ADC control register sfr ADC_RES = 0xBD; //ADC high 8-bit result register sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register sfr P1ASF = 0x9D; //P1 secondary function control register /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC power control bit #define ADC_FLAG 0x10 //ADC complete flag #define ADC_START 0x08 //ADC start control bit #define ADC_SPEEDHH 0x60 //70 clocks void InitUart(); void InitADC(); void SendData(BYTE dat); BYTE GetADCResult(BYTE ch); void Delay(WORD n); void ShowResult(BYTE ch); void main() { InitUart(); //Init UART, use to show ADC result InitADC(); //Init ADC sfr while (1) { ShowResult(0); ShowResult(1); } } /*---------------------------- Send ADC result to UART ----------------------------*/ void ShowResult(BYTE ch) { SendData(ch); //Show Channel NO. SendData(GetADCResult(ch)); //Show ADC high 8-bit result SendData(ADC_LOW2); //Show ADC low 2-bit result } /*---------------------------- Get ADC result ----------------------------*/ BYTE GetADCResult(BYTE ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //Return ADC result } /*---------------------------- Initial UART ----------------------------*/ void InitUart() { SCON = 0x5a; //8 bit data ,no parity bit TMOD = 0x20; //T1 as 8-bit auto reload TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate TR1 = 1; //T1 start running } /*---------------------------- Initial ADC sfr ----------------------------*/ void InitADC() { P1ASF = 0xff; //Open 8 channels ADC function ADC_RES = 0; //Clear previous result ADC_CONTR = ADC_POWER | ADC_SPEEDHH; Delay(2); //ADC power-on and delay } /*---------------------------- Send one byte data to PC Input: dat (UART data) Output:- ----------------------------*/ void SendData(BYTE dat) { while (!TI); //Wait for the previous data is sent TI = 0; //Clear TI flag SBUF = dat; //Send current data } /*---------------------------- Software delay function ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } 这是OK的,你 |
|
|
|
#include"REG51.h"
#include"intrins.h" #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; /*Declare SFR associated with the ADC */ sfr ADC_CONTR = 0xBC; //ADC control register sfr ADC_RES = 0xBD; //ADC high 8-bit result register sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register sfr P1ASF = 0x9D; //P1 secondary function control register /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC power control bit #define ADC_FLAG 0x10 //ADC complete flag #define ADC_START 0x08 //ADC start control bit #define ADC_SPEEDHH 0x60 //70 clocks void InitUart(); void InitADC(); void SendData(BYTE dat); BYTE GetADCResult(BYTE ch); void Delay(WORD n); void ShowResult(BYTE ch); void main() { InitUart(); //Init UART, use to show ADC result InitADC(); //Init ADC sfr while (1) { ShowResult(0); ShowResult(1); } } /*---------------------------- Send ADC result to UART ----------------------------*/ void ShowResult(BYTE ch) { SendData(ch); //Show Channel NO. SendData(GetADCResult(ch)); //Show ADC high 8-bit result SendData(ADC_LOW2); //Show ADC low 2-bit result } /*---------------------------- Get ADC result ----------------------------*/ BYTE GetADCResult(BYTE ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //Return ADC result } /*---------------------------- Initial UART ----------------------------*/ void InitUart() { SCON = 0x5a; //8 bit data ,no parity bit TMOD = 0x20; //T1 as 8-bit auto reload TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate TR1 = 1; //T1 start running } /*---------------------------- Initial ADC sfr ----------------------------*/ void InitADC() { P1ASF = 0xff; //Open 8 channels ADC function ADC_RES = 0; //Clear previous result ADC_CONTR = ADC_POWER | ADC_SPEEDHH; Delay(2); //ADC power-on and delay } /*---------------------------- Send one byte data to PC Input: dat (UART data) Output:- ----------------------------*/ void SendData(BYTE dat) { while (!TI); //Wait for the previous data is sent TI = 0; //Clear TI flag SBUF = dat; //Send current data } /*---------------------------- Software delay function ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } 这是OK的程式,你试一下 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1173浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 12:12 , Processed in 1.470177 second(s), Total 106, Slave 86 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号