|
本帖最后由 hscaihong 于 2013-4-7 22:52 编辑
单片机是mega128,晶振 11.0592m,外扩ram62256,硬件连接正确,已测试,
用下面的程序,串口接收到的是:电流有效值。
之后就停顿了,如果把发送字符串那段去掉,则收到的是:111111……
如果定义为I[1000],则正确转换与接收,
请问原因?
程序如下:
/********************************************************************
晶振 11.0592m
型号 mega128
串口波特率 57600
*********************************************************************/
#include "config.h"
#define ext_PORT2 ((volatile unsigned int *)0x3000)
unsigned int *I=(unsigned int *)ext_PORT2;
//unsigned int *I;
void InitIO(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0xEF;
DDRD = 0x10;
PORTE = 0xFF; //设置RXD0和TXD0
DDRE|=(1<<PE1);
DDRF=0xD7;
PORTG = 0x06;
DDRG = 0xFF;
}
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = (1<<REFS0)|(1<<MUX0)|(1<<MUX2);
ACSR = (1<<ACD);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);
}
void usart0_char_send(unsigned char i)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}
void usart0_str_send(char *s)
{
while(*s)
{
usart0_char_send(*s);
s++;
}
}
unsigned int get_I()
{
unsigned char Temp;
unsigned int Result;
ADMUX = (1<<REFS0)|(1<<MUX0)|(1<<MUX2);
ADCSRA|=BIT(ADIF); //清除ADC 转换结束位
ADCSRA|=BIT(ADSC); //AD 转换开始
do
{
Temp=ADCSRA; //读取状态
Temp&=BIT(ADIF); //与运算
}while(!(Temp)); //判断是否转换结束
ADCSRA&=~BIT(ADSC); //手动关闭“开始转换”
Result=ADCL; //读取ADC 数据寄存器第八位
Result=Result+ADCH*256; //读取ADC 数据寄存器高八位和进行整合
return Result; //返回结果
}
unsigned int I_SUM()
{
unsigned int Result[10],Final_Result=0,Temp;
unsigned char i;
for(i=0;i<10;i++)
Result=get_I(); //读取AD 转换结果,赋予数组
for(i=0;i<10;i++)
Final_Result+=Result; //求结果总和
return (Final_Result); //返回和值
}
void main(void)
{
unsigned char *adc_str="2.031 \n\n";
unsigned int i;
unsigned int j;
unsigned int textI;
unsigned long SUMI=0;
CLI();
InitIO();
Com_init();
SEI();
MCUCR = 0x80; // 允许外部并行扩展接口
XMCRA = 0x00; //0x00 external memory
XMCRB = 0x00; // 全部用作高位
adc_init();
while(1)
{
textI=I_SUM();
if(textI>1200)
{
for(i=0;i<2000;i++)
{
I=get_I(); //读取转换结果
}
for(i=0;i<2000;i++)
{
SUMI+=I;
}
SUMI=(unsigned int)(SUMI/2000*4.88);
usart0_str_send("电流有效值 \n\n");
delay_nms(100);
adc_str[0]=(unsigned int)SUMI/1000+0x30;
adc_str[2]=((unsigned int)SUMI%1000)/100+0x30;
adc_str[3]=((unsigned int)SUMI%100)/10+0x30;
adc_str[4]=(unsigned int)SUMI%10+0x30;
Com_putstring (adc_str,7,&RTbuf_UART0);
delay_nms(100);
usart0_str_send("电流 \n\n");
for(i=0;i<2000;i++)
{
I=I*0.5/1.024*10;
adc_str[0]=(unsigned int)I/1000+0x30;
adc_str[2]=((unsigned int)I%1000)/100+0x30;
adc_str[3]=((unsigned int)I%100)/10+0x30;
adc_str[4]=(unsigned int)I%10+0x30;
Com_putstring (adc_str,7,&RTbuf_UART0);
}
textI=0;
}
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|