任务一:发送完整ASCII表给PC,每16个字符换行
分析:1)首先配置UART1,使其可以发送字符给PC,注意: UART1使用bus clock(时钟频率为10.485M)
2) ASCII表从0开始到0x7F,定义一个变量从0到0x7F,每次发送该变量的值,然后再将变量加1
3) 每逢16的整数倍,发送一个换行字符
实现代码片段:
void uart1_init(void)
{
SIM_SCGC5 |= (1 << 13); //enable PortC module
SIM_SCGC4 |= (1 << 11); //enable UART1
PORTE_PCR0 |= (3 << 8); //config as UART
PORTE_PCR1 |= (3 << 8); //config as UART
UART1_C2 |= ((1 << 3)|(1 << 2));//enable tx and rx
UART1_BDL |= 0x44; //9600
}
void send_char(char c)
{
while(!(UART1_S1 & (1 << 7))); //wait for tx empty
UART1_D = c;
}
int main(void)
{
int counter;
uart1_init();
for(counter=0;counter < 0x80;counter++) {
send_char(counter);
if(counter%16 == 0)
send_char('\n');
}
while(1);
return 0;
}
任务二:接收PC发送的一个ASCII字符,发送其对应的十六进制值给PC
分析:1) 添加接收字符功能
2) 十六进制格式一般为0x字符开始,后面接两位十六进制数,通过分离法分别获得这两位十六进制数
3) 将每位数转换成对应字符数字,比如将0转换成字符‘0’,再发送给PC
实现代码片段:
void receive_char(unsigned char *c)
{
while(!(UART1_S1 & (1 << 5)));
*c = UART1_D;
}
unsigned char num2char(unsigned char n)
{
if(n >= 0 && n <= 9)
return n + '0';
else if(n >= 10 && n <= 15)
return n - 10 + 'A';
else
return 0;
}
int main(void)
{
unsigned char c = 0;
uart1_init();
for(;;) {
receive_char(&c);
if(c == '\n' || c == '\r')
continue;
send_char(c);
send_char('-');
send_char('-');
send_char('-');
send_char('0');
send_char('x');
send_char(num2char(c >> 4));
send_char(num2char(c % 16));
send_char('\n');
}
while(1);
return 0;
}
任务三:猜数字游戏
分析:1) 通过rand()获取一个0-9之间的整数
2) 将其转化为对应字符
3) 将所得的字符与接收的字符进行比较,发送相应提示信息给PC
实现代码片段:
void send_str(char *c)
{
while(*c != '\0')
{
send_char(*c);
c++;
}
}
int main(void)
{
unsigned char c = 0;
unsigned char num = 0;
uart1_init();
num = rand() % 10;
num = num2char(num);
send_str("please guess a number: ");
send_char('\n');
for(;;) {
receive_char(&c);
send_char(c);
send_char('\n');
if( c == '\r'|| c == '\n')
continue;
else if(c > num)
{
send_str("too big! please try again");
}
else if (c < num)
{
send_str("too small! please try again");
}
else
{
send_str("You are right!");
break;
}
}
while(1);
return 0;
}
至此,UART实验玩结束了,望大家批评指正,谢谢^_^