6526|6

23

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

iccavr编译器中数据问题 [复制链接]

我用移位方式将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;然后经过移位将端口数据放入该变量后,其值是怎么样形式存在,我可以直接按十进制形式 或者十六进制形式处理吗?

 

最新回复

数据以整型数格式放到一个字符串数组中可以用sprintf 比如:sprintf(s, "%d", 123); //产生"123"   详情 回复 发表于 2022-6-13 14:43
点赞 关注
 

回复
举报

986

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

回复 楼主 jiangwei0802 的帖子

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

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

[ 本帖最后由 kata 于 2010-6-30 12:17 编辑 ]
 
个人签名电子工程师技术交流QQ群:12425841,专注于自动控制、数字电源等
 
 

回复

277

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
不用申请数组吧,直接申请一个整型数据就行了。
char temp00;
unsigned int temp10;
temp10=0;
for (temp00=0; temp00<16; temp00++)
{
    temp10<<=1;
    if (管脚状态==1)
    temp10|=1;
}
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

4
 

整型的话数据大于255串口显示遇到问题

我也试过用整形的,可是串口传送每次最大也就是255,现在数据可能要上千或者过万,所以才采取数组,将其转换为十进制后在一位一位的显示出来,否则我不知该如何发送
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复 沙发 kata 的帖子

的确是变量定义有些重复,导致错误
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 

我也有遇到一些其它问题

 
 
 

回复

6105

帖子

4

TA的资源

版主

7
 

数据以整型数格式放到一个字符串数组中可以用sprintf

比如:sprintf(s, "%d", 123); //产生"123"

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表