马老师,能否帮忙看一下这段程序里的问题?长.....
#include <iom128v.h>#include <macros.h>
#include <limits.h>
#include "parme.h"
#define uchar unsigned char //定义无符号字符为 uchar
#define uintunsigned int //定义无符号整型
#define ulong unsigned long
uint cord = 53326;;//全局变量
ulong trans()
{
ulong dtr;
dtr = (ulong)compute(cord);//
usart0_char_send(dtr>>24);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr>>16);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr>>8);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr);/////通过单片机串口返回计算结果观察
}
ulong compute(uint data)//test
{
ulong result;
result = (ulong)data*(ulong)(data+1);
return(result);
}
void main()
{
trans();
}
上面的例子的计算结果应当是:53326*53327 = 0xA97FA812
可是串口返回的结果从高位至低位是:0xFF 0xFF 0xA8 0x12
高16位全变成了 “1”
有人跟我说在C51平台下测试程序是没问题的
是不是跟硬件平台有关?
这段程序是在AVR单片机上跑的
开发环境是ICCAVR 单独定义了一个测试数据
ulong dr = 0xA97FA812;
usart0_char_send(dr>>24);/////通过单片机串口返回计算结果观察
usart0_char_send(dr>>16);/////通过单片机串口返回计算结果观察
usart0_char_send(dr>>8);/////通过单片机串口返回计算结果观察
usart0_char_send(dr);/////通过单片机串口返回计算结果观察
输出结果是正确的 完整程序如下,硬件平台是ATmega128,环境是ICCAVR
#include <iom128v.h>
#include <macros.h>
#include <limits.h>
#define uchar unsigned char //定义无符号字符为 uchar
#define uintunsigned int //定义无符号整型
#define ulong unsigned long
uint cord = 53326;;//全局变量
ulong dr = 0xA97FA812;
//****************发送一个字符,查询方式******************************
void usart0_char_send(uchar i)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}
/******************端口初始化*******************************/
void port_init(void)
{
PORTA = (1<<PA7)|(1<<PA6)|(1<<PA5);
DDRA= 0xE0;
PORTB = 0xFF;
DDRB= 0xFF;
PORTC = 0xFF;
DDRC= 0x00;
PORTD = 0xFF;
DDRD= 0x08;//设置RXD1和TXD1
PORTE = 0xFF;
DDRE= 0x02;//设置RXD0和TXD0
//PORTF = 0x00;
// DDRF= 0xE0;//设置ADRO和ADRI
// PORTF = (1<<PF7)|(1<<PF6)|(1<<PF5);
DDRF= 0x00;//设置ADRO和ADRI
PORTF = 0xFF;
PORTG = 0xFF;
DDRG= 0x00;
}
/******************初始器件**************************************/
void init_devices(void)
{
port_init();
usart0_init();
usart1_init();
}
/*****************串口初始化*********************************/
void usart0_init(void)
{
UCSR0B = 0x00; //禁止发送和接收
UCSR0A = 0x02; //倍速异步模式USX0=1
UCSR0C = 0x06; //0000 0110,8位字符,1位停止位,无校验
UBRR0L = 0x1F; //波特率 4800
UBRR0H = 0x01; //参见ATMAGE128使用手册
UCSR0B = (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0) | (1 << TXCIE0) ; //允许发送和接收,接收和发送结束中断使能(写成UCSR0B = 0xD8也可以 ;)
}
void usart1_init(void)
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式USX1=1
UCSR1C = 0x06; //0000 0110,8位字符,1位停止位,无校验
UBRR1L = 0x17; //波特率 9600*6
UBRR1H = 0x00; //参见ATMAGE128使用手册
UCSR1B = (1 << TXEN1) | (1 << RXEN1) | (1 << RXCIE1) | (1 << TXCIE1) ;//允许发送和接收,接收和发送结束中断使能(写成UCSR1B = 0xD8也可以 ;)
}
ulong trans()
{
ulong dtr;
dtr = (ulong)compute(cord);//
usart0_char_send(dtr>>24);
usart0_char_send(dtr>>16);
usart0_char_send(dtr>>8);
usart0_char_send(dtr);
}
ulong compute(uint data)//test
{
ulong result;
// uchar r1,r2,r3,r4;
result = (ulong)data*(ulong)(((ulong)data)+1);
// r1 = result;
// r2 = (result>>8);
// r3 = (result>>16);
// r4 = (result>>24);
return(result);
}
voidmain()
{
init_devices();
trans();
}
我觉得是硬件平台的原因,或是编译器的问题
页:
[1]