iccavr编译器中数据问题

2019-03-24 21:12发布

我用移位方式将mage16某一端口输出的15位二进制数据放在数组a[16],今想通过串口将其以十进制形式显示出来,程序如下: #include"math.h"
#include <iom16v.h>
#include <macros.h>
//常量声明
#define BAUD 9600    //波特率定义
#define F_CPU 8000000   const  char a[]={0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1};//为先解决显示和转化问题,将数组值先给定   int convert(void)   //数组内数据转换为十进制数
{
  int i,j,k=-1;
  int y=0,a;
 
  for(j=15;j>=0;j--)
  {
   //a=0X30;
   i=a[j]-'0';
   k++;
   y+=i*pow(2,k);
  }
  return y;
}   void main (void)
{
 uchar intcnt=0;
 uint psd;
 
 CLI();
 DDRD|=(1<<DOCI);
 
 GICR|=1<<INT0;
 MCUCR|=1<<ISC00|1<<ISC01;
 SFIOR|=1<<;PUD;
    DDRD|=(1<<;PD1);  //PD0为接收端口,置为输入口;PD1为发送端口,置为输出口 
 Usart_Init();
 
   while(1)
 {   psd=convert();
  if(psd/10000!=0)
        {
       Usart_PutChar(psd/10000+ 0x30);    //得到万位并发送
    Usart_PutChar(',');
  }
  Usart_PutChar(psd%10000/1000+0x30);     //得到千位并发送
  Usart_PutChar(psd%1000/100+0x30);    //得到百位并发送
  Usart_PutChar(psd%100/10+0x30);     //得到十位并发送
  Usart_PutChar(psd%10+0x30);     //得到个位并发送  
  Usart_PutChar(0x0d);    
  Usart_PutChar(0x0a);
 
    }
 

//USART寄存器配置函数
void Usart_Init(void)
{
 UCSRA = 0X00; 
 UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0);  //异步,数据格式8,N,1
//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时,URSEL 应设置为 1。
 UBRRL = (F_CPU/BAUD/16-1)%256;    //波特率设置
 UBRRH = (F_CPU/BAUD/16-1)/256;  
 
 
} //字节发送函数
void Usart_PutChar (unsigned int cTXData)
{  
    UCSRB|=(1<< TXEN);    //发送使能
 while(!(UCSRA&(1<<UDRE)));  //只有数据寄存器为空时才能发送数据
 UDR = cTXData; 
}
 问题: 1、发现次二进制的十进制应该为8089,但是实际转化结果却不对,有些偏差,不知道问题何在 2、昨天运行程序正确,今天在运行是提示错误位置 i=a[j]-'0';  原因:type error: pointer expected  有些不解 3、ICCAVR中的数据处理问题,如在C51中不能直接给某一个变量赋二进制数,就是类似这样的。我在想ICCAVR中如果我将变量int pd=0;然后经过移位将端口数据放入该变量后,其值是怎么样形式存在,我可以直接按十进制形式 或者十六进制形式处理吗?

  此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
kata
1楼-- · 2019-03-25 01:59

第二错误,定义了两个a变量,一个是局部整形变量,一个是全局数组。

使用时引用错了,不了解变量作用域的情况下,不要定义相同名字的变量。

[ 本帖最后由 kata 于 2010-6-30 12:17 编辑 ]
thtlj
2楼-- · 2019-03-25 06:39
不用申请数组吧,直接申请一个整型数据就行了。
char temp00;
unsigned int temp10;
temp10=0;
for (temp00=0; temp00<16; temp00++)
{
    temp10<<=1;
    if (管脚状态==1)
    temp10|=1;
}
jiangwei0802
3楼-- · 2019-03-25 09:12
我也试过用整形的,可是串口传送每次最大也就是255,现在数据可能要上千或者过万,所以才采取数组,将其转换为十进制后在一位一位的显示出来,否则我不知该如何发送
jiangwei0802
4楼-- · 2019-03-25 11:08
的确是变量定义有些重复,导致错误

一周热门 更多>