avr单片机与pc的通信
#include<avr/io.h>#include<avr/pgmspace.h>#include<stdio.h>charg_aString[81];//uart发送...
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>
char g_aString[81];
//uart 发送一字节
int usart_putchar(char c)
{
if(c=='\n')
usart_putchar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR=c;
return 0;
}
//uart 接收一字节
int usart_getchar(void)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}
void IoInit(void)
{
//uart 初始化
UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|*/
UBRRL=25; //9600 baud 6MHz:38 4MHz:25
//流与设备连接
fdevopen(usart_putchar,usart_getchar,0);
}
int main(void)
{
int tmp;
IoInit();
while(1)
{
//测试1
vfprintf(stdout,"测试1[输入数字]:\n",0);
vfscanf(stdin,"%d",&tmp);
vfprintf(stdout,"您的输入为:%d\n",tmp);
//测试2
printf("测试2[输入一字符串]:\n");
scanf("%s",g_aString);
printf("您的输入为:%s\n",g_aString);
//测试3
printf_P(PSTR("测试3[输入数字]:\n"));
scanf_P(PSTR("%d"),&tmp);
printf_P(PSTR("您的输入为:%d\n"),tmp);
}
}
大哥大姐帮忙改一下,可以在iccavr下编译通过,或者重编一个达到如下效果, 展开
#include <avr/pgmspace.h>
#include <stdio.h>
char g_aString[81];
//uart 发送一字节
int usart_putchar(char c)
{
if(c=='\n')
usart_putchar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR=c;
return 0;
}
//uart 接收一字节
int usart_getchar(void)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}
void IoInit(void)
{
//uart 初始化
UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|*/
UBRRL=25; //9600 baud 6MHz:38 4MHz:25
//流与设备连接
fdevopen(usart_putchar,usart_getchar,0);
}
int main(void)
{
int tmp;
IoInit();
while(1)
{
//测试1
vfprintf(stdout,"测试1[输入数字]:\n",0);
vfscanf(stdin,"%d",&tmp);
vfprintf(stdout,"您的输入为:%d\n",tmp);
//测试2
printf("测试2[输入一字符串]:\n");
scanf("%s",g_aString);
printf("您的输入为:%s\n",g_aString);
//测试3
printf_P(PSTR("测试3[输入数字]:\n"));
scanf_P(PSTR("%d"),&tmp);
printf_P(PSTR("您的输入为:%d\n"),tmp);
}
}
大哥大姐帮忙改一下,可以在iccavr下编译通过,或者重编一个达到如下效果, 展开
1个回答
展开全部
我用个人的AVR单片机测试过的,没问题。
使用的7.3728Mhz晶振,你的是8M,所以BBRD的赋值,你个人改改。
还有,用的自制串口线一端是串口接电脑,另一端是接AVR的USART的TXD,RXD,GND.
我使用串口程序sscom32,调试时由于软件有个BUG,需要重复点击'HEX'显示才能把信息显示完全。
//USART调试 mikegang 10.08.22
#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
#define recive_buff_length 10
//波特率,晶振
#define BAUD 9600
#define FXTAL 7372800
//串口接收完毕中断触发声明
#pragma interrupt_handler USART_Received_Ir:12
//变量定义:接收缓冲变量
uchar recive_buff[recive_buff_length],*point;
uchar temp,g_aString[recive_buff_length];
uint tmp;
void delayms(unsigned int n)
{
unsigned int i,j;
for (i=0;i<n;i++)
{for (j=0;j<1050;j++);}
}
void usart_init()
{
DDRD|=BIT(PD1); //PD1:TX 为输出状态
UCSRA=0x00; //串口控制器A 清零
UCSRB=0x00; //串口控制器B 清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择USCRC,异步操作,禁止检验危,1个停止位,八位数据
UBRR=47; //从手册中直接取得赋值,9600bps
UCSRB|= BIT(RXEN)|BIT(RXCIE)|BIT(TXEN);//|BIT(TXCIE); //发送使能,接收使能,接收完毕中断使能
SREG|=BIT(7); //全局中断使能
}
/***************************************/
void init_devices(void)
{
CLI();
usart_init();
TIMSK = 0x00;
MCUCR = 0x00;
GICR = 0x00;
SEI();
}
/************************************/
void send_information(uchar *string) //发送数组
{
uchar i,buff;
for(i=0;i<30;i++)
{
while(!(UCSRA&&(1<<UDRE)));
buff=*(string+i);
UDR=buff;
delayms(1);
if(*(string+i)==0) i=100;
}
}
/***************************************/
void test1()
{
send_information("测试1[输入数字]:\n");
}
/***************************************/
void test2()
{
send_information("测试2[输入字符串]:\n");
}
/***************************************/
void test3()
{
send_information("测试3[输入数字]:\n");
}
/***************************************/
void clear_recive_buff() //清空接受数组
{
uchar i;
for(i=0;i<recive_buff_length;i++)
recive_buff[i] = 0;
}
/***************************************/
void USART_Received_Ir() //接受中断
{ uchar buff;
CLI();
while(!(UCSRA&&(1<<RXC)));
buff=UDR;
*point=buff;
point++;
SEI();
temp = 1;
}
/***************************************/
void re_op() //接受数组操作
{
send_information("您的输入为:");
send_information(recive_buff);
send_information("\n");
clear_recive_buff();
point=recive_buff;
temp = 0;
}
/*****************************************/
void get_g_aString()
{ uchar i;
for(i=0;i<recive_buff_length;i++)
g_aString[i]=recive_buff[i];
}
/**********************************/
void get_tmp()
{
uchar i,flag;
for(i=0;i<recive_buff_length;i++)
if(recive_buff[i]==0) flag =i-1;
for(i=0;i<=flag;i++)
tmp=recive_buff[i]+tmp*10;
}
void main()
{
init_devices();
point=recive_buff;
while(1)
{
test1();
while(temp == 0);//等待通过串口工具窗口中的数据输入
get_tmp(); //得到数值
re_op();
test2();
while(temp == 0);
get_g_aString(); //得到字符串
re_op();
test3();
while(temp == 0);
get_tmp() ;
re_op();
}
}
/////////END////////
说真的,我不知道你用USART干这个事,目的是什么,感觉真的有点大材小用了。有疑问联系额。
使用的7.3728Mhz晶振,你的是8M,所以BBRD的赋值,你个人改改。
还有,用的自制串口线一端是串口接电脑,另一端是接AVR的USART的TXD,RXD,GND.
我使用串口程序sscom32,调试时由于软件有个BUG,需要重复点击'HEX'显示才能把信息显示完全。
//USART调试 mikegang 10.08.22
#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
#define recive_buff_length 10
//波特率,晶振
#define BAUD 9600
#define FXTAL 7372800
//串口接收完毕中断触发声明
#pragma interrupt_handler USART_Received_Ir:12
//变量定义:接收缓冲变量
uchar recive_buff[recive_buff_length],*point;
uchar temp,g_aString[recive_buff_length];
uint tmp;
void delayms(unsigned int n)
{
unsigned int i,j;
for (i=0;i<n;i++)
{for (j=0;j<1050;j++);}
}
void usart_init()
{
DDRD|=BIT(PD1); //PD1:TX 为输出状态
UCSRA=0x00; //串口控制器A 清零
UCSRB=0x00; //串口控制器B 清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择USCRC,异步操作,禁止检验危,1个停止位,八位数据
UBRR=47; //从手册中直接取得赋值,9600bps
UCSRB|= BIT(RXEN)|BIT(RXCIE)|BIT(TXEN);//|BIT(TXCIE); //发送使能,接收使能,接收完毕中断使能
SREG|=BIT(7); //全局中断使能
}
/***************************************/
void init_devices(void)
{
CLI();
usart_init();
TIMSK = 0x00;
MCUCR = 0x00;
GICR = 0x00;
SEI();
}
/************************************/
void send_information(uchar *string) //发送数组
{
uchar i,buff;
for(i=0;i<30;i++)
{
while(!(UCSRA&&(1<<UDRE)));
buff=*(string+i);
UDR=buff;
delayms(1);
if(*(string+i)==0) i=100;
}
}
/***************************************/
void test1()
{
send_information("测试1[输入数字]:\n");
}
/***************************************/
void test2()
{
send_information("测试2[输入字符串]:\n");
}
/***************************************/
void test3()
{
send_information("测试3[输入数字]:\n");
}
/***************************************/
void clear_recive_buff() //清空接受数组
{
uchar i;
for(i=0;i<recive_buff_length;i++)
recive_buff[i] = 0;
}
/***************************************/
void USART_Received_Ir() //接受中断
{ uchar buff;
CLI();
while(!(UCSRA&&(1<<RXC)));
buff=UDR;
*point=buff;
point++;
SEI();
temp = 1;
}
/***************************************/
void re_op() //接受数组操作
{
send_information("您的输入为:");
send_information(recive_buff);
send_information("\n");
clear_recive_buff();
point=recive_buff;
temp = 0;
}
/*****************************************/
void get_g_aString()
{ uchar i;
for(i=0;i<recive_buff_length;i++)
g_aString[i]=recive_buff[i];
}
/**********************************/
void get_tmp()
{
uchar i,flag;
for(i=0;i<recive_buff_length;i++)
if(recive_buff[i]==0) flag =i-1;
for(i=0;i<=flag;i++)
tmp=recive_buff[i]+tmp*10;
}
void main()
{
init_devices();
point=recive_buff;
while(1)
{
test1();
while(temp == 0);//等待通过串口工具窗口中的数据输入
get_tmp(); //得到数值
re_op();
test2();
while(temp == 0);
get_g_aString(); //得到字符串
re_op();
test3();
while(temp == 0);
get_tmp() ;
re_op();
}
}
/////////END////////
说真的,我不知道你用USART干这个事,目的是什么,感觉真的有点大材小用了。有疑问联系额。
意法半导体(中国)投资有限公司
2021-01-14 广告
2021-01-14 广告
1、不是的,STC单片机全面兼容MCS-51单片机,可以用一般的编程器编程,但ISP功能更方便实用。 2、实验板的串口就是ISP下载用的吧。 4、汇编语言不一定要在keil里学,一般的教程都可以学。keil只是一个编译程序。因为keil编译...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询