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