No.33723 作者:goo 邮件:larnk@netease.com ID:12895 登陆:3次 文章数:5篇 最后登陆IP:210.14.179.251 最后登陆:2003/6/16 17:49:16 注册:2003/6/9 9:29:15 财富:83 发帖时间:2003/6/9 9:58:34 发贴者IP:210.14.179.251 标题:goo:神啊,救救我吧。(程序很奇怪的问题,恳求高手) 摘要:No.33723神啊,救救我吧。(程序很奇怪的问题,恳求高手) 我学着用Keil C,CPU是AT89C52,写的是一个AD转换。 源码如下: #--------------------------------------------adc0809.h---------------------------------------- #define XBYTE ((unsigned char volatile xdata *)0x0) #define AdcAddress XBYTE[0] //ADC0809编在地址0,用P1.4做片选信号。 //中断用IT1 /*typedef struct { unsigned char ADC_DATA_READY; unsigned char CHANNEL; unsigned char ADC_DATA; }ADC_DATA;*/ unsigned char startadc(unsigned char channel); void init_adc(void); #-------------------------------------------adc0809.c------------------------------------------ #include "reg591.h" #include "adc0809.h" unsigned char adc_data_ready,adc_data; void init_adc(void) { adc_data_ready=1; IT1=1;//下降延触发。 T2CON_1=0; //以下用T2产生clock信号给ADC0809.//大约700khz. T2CON_2=1; T2MOD=0x02; RCAP2L=0xfa; RCAP2H=0xff; } unsigned char startadc(unsigned char channel) { if(adc_data_ready==0) return 0; EX1=1;//Enable ADC Interrupt; P1_4=0; adc_data_ready=0; //ADC工作中 AdcAddress=channel; P1_4=1; return 1; } void interrupt_read_adc(void) interrupt 2 { // toggle_red_led(1); 我测试用的,亮个灯而已。 EX1=0; //Disable ADC Interrupt P1_4=0; adc_data=AdcAddress; P1_4=1; adc_data_ready=1; //问题就处在这里啊这里啊。 } #-----------------------------------------------main.c-------------------------------------------- #include "reg591.h" #include "adc0809.h" extern unsigned char adc_data_ready,adc_data; unsigned int timer1tick;//定时器用的。 unsigned int t1reload; void init_timer1 (unsigned int reload) { t1reload = reload; timer1tick = 0; TR1 = 0; /* timer 1: stop */ TMOD |= 0x10; /* mode 1 */ IP1 |= 2; /* priority */ TH1 = reload / 256; TL1 = reload % 256; TR1 = 1; /* timer 1: start */ ET1 = 1; /* enable timer 1 int */ EA = 1; } void t1isr (void) interrupt 3 { TR1 = 0; /* timer 1: stop */ TH1 = t1reload / 256; TL1 = t1reload % 256; /* reload value */ TR1 = 1; /* timer 1: restart */ timer1tick++; } void main(void) { init_adc(); init_timer1(45535); while(1){ if (timer1tick> =100) { if (startadc(0)){ timer1tick=0; while(adc_data_ready==0);//问题是这里永远都是0,郁闷啊。 //adc_data然后我们就可以处理ADC_DATA了。 } } } } #-----------------------------------reg591.h------------------------------------------------------- /* (c) Copyright PHYTEC ELEKTRONIK GmbH. 1999, All rights reserved. */ /* 80591 Processor Declarations */ /* PWM names corrected by ESAcademy, June 2000 */ /* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IEN0 = 0xA8; sfr IEN1 = 0xE8; sfr IP0 = 0xB8; sfr IP0H = 0xB7; sfr IP1 = 0xF8; sfr IP1H = 0xF7; sfr S0CON = 0x98; sfr S0BUF = 0x99; sfr S0ADDR= 0xCB; sfr S0ADEN= 0xF9; sfr S0PSL = 0xFA; sfr S0PSH = 0xFB; sfr S1CON = 0xD8; sfr S1ADR = 0xDB; sfr S1DAT = 0xDA; ......
>>返回讨论的主题
|