我用移位方式将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;然后经过移位将端口数据放入该变量后,其值是怎么样形式存在,我可以直接按十进制形式 或者十六进制形式处理吗?
此帖出自
小平头技术问答
char temp00;
unsigned int temp10;
temp10=0;
for (temp00=0; temp00<16; temp00++)
{
temp10<<=1;
if (管脚状态==1)
temp10|=1;
}
一周热门 更多>