计算机与智能小车的串口通信
【实验目的】
学会使用串口调试软件
熟悉ICCAVR 编译环境
进一步熟悉单片机的原理及应用
能够编写程序实现计算机与单片机之间的串口通信
【实验器材】
小车一辆 数据线一根 下载线一根
【实验原理】
所谓“串行通信”就是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需
要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时
间长度。
计算机上的串行接口一般是DB9,它可以分为公口(针型)和母口(孔型),图1 给出
了公口(针型)和母口(孔型)的图示,由图可知母口的2,3 脚刚好与公口相反,2 脚为
发送TXD。单片机则是通过UART(即Universal Asynchronous Receiver Transmitter 通
用异步收发器)来收发数据的, 它允许在串行链路上进行全双工的通信。UART 主要有由数
据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。 包括微处理器接口,
发送缓冲器(TXB)、发送移位寄存器(TSR)、帧产生、奇偶校验、并转串、数据接收缓冲
器(RXB)、接收移位寄存器(RSR)、帧产生、奇偶校验、串转并。 图2 是UART 的典型应
用,本实验所用的芯片是Atmega8515,有兴趣的同学可以查阅一下它的datasheet。
【实验步骤】
(1) 连接好电路,把数据线,下载线连接好,打开电源
(2) 进入ICCAVR 编译环境,调试程序直至没有错误,编译环境简介请参见附录一
(3) 下载,烧录进单片机,在串口调试软件上观看实验结果,关于串口调试软件参
见附录二
(4) 反复修改调试程序,逐渐增强其功能
(5) 写好实验报告,实验心得体会
【程序示例】
(1)功能:计算机发送一个字节到单片机,单片机把接收到的字节的ASCII 码加一后
再发送给计算机。程序运行结果如图2-7 所示,输入“abcdefg”时,输出为“bcdefgh”.
1.用查询方法实现
#include
#include
void port_init(void)
{ PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x02;
PORTE = 0x00;
DDRE = 0x00;
} //UART0 初始化// 波特率:
9600
void uart0_init(void)
{
UCSRB = 0x00;
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x19;
UBRRH = 0x00;
UCSRB = 0xD8;
}
#pragma interrupt_handler uart0_rx_isr:10
void uart0_rx_isr(void)
{ //uart has received a
character in UDR
}
#pragma interrupt_handler uart0_tx_isr:12
void uart0_tx_isr(void)
{ //character has been
transmitted
} //call this routine to initialize all
peripherals
void init_devices(void)
{
CLI(); //全局中断关
port_init();
uart0_init();
MCUCR = 0x00;
EMCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI(); //使能中断 //初始化完成
}
//*************************发送子程序
******************************
void Transmit(unsigned char da)
{
while ( !( UCSRA & (1<
}
//**************************接收子程序
******************************
unsigned recvchar(void)
{
while ( !( UCSRA & 0x80) );
return UDR;
}
void main(void)
{
init_devices();
while (1)
Transmit(recvchar());
}
2.用中断方式实现
初始化程序同上;
#pragma interrupt_handler uart0_rx_isr:10
void uart0_rx_isr(void)
{ pos=UDR;
UDR=pos+1; }
//uart 接收了一个字符产生中断,并将接收到的字符
的ASCII 码加一
//把加一以后的字符发送出去
#pragma interrupt_handler uart0_tx_isr:12
void uart0_tx_isr(void)
{
}
void main(void)
{
init_devices();
while (1)
;
}
(2)用串口通信实现人机交互菜单的程序
功能:实现了一个人机交互菜单,可以通过简单的键盘输入来控制小车动作
当输入“A”并发送,屏幕上会显示:“You have input a A”
当输入“B”并发送,小车上的LED 会显示“1111”
当输入“C”并发送,小车会向前走一段然后停下
当输入“D”并发送,小车会后退一段然后停下
#include
#include
#include
unsigned int a,i,j,l,time;
unsigned char pos;
unsigned char str1[]="Please input A,B,C or D : \n \n If you input
A,it will tell you you have input a 'A' ; \n \n If you input B,The
led will display '1111' ; \n \n If you input C,it will run forword ;
\n \n If you input D,it will run backword .\n \n";
unsigned char str2[]="You have input a A\n";
void port_init(void)
{ PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x00;
DDRE = 0xFF;
}
void uart0_init(void)
{ UCSRB = 0x00;
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x19;
UBRRH = 0x00;
UCSRB = 0xD8;
}
//***********************刹车子程序*************************
void black(void)
{ PORTE=0x00;
PORTD=0x00;
}
//------------------------延时子程序--------------------------
void delay(unsigned long pos)
{ while(pos>0)
pos--;
}
//--------------------前进子程序--------------------------------
void run_forword(void)
{ while(time<100)
{PORTE=0x04;
PORTD=0x70;
delay(6000);
time++;
}
time=0;
black();
}
//-----------------------后退子程序-----------------------------
void run_backword(void)
{ while(time<100)
{ PORTE=0x04;
PORTD=0x20;
delay(6000);
time++;
}
time=0;
black();
}
//***********************发送子程序***********************
void Transmit(unsigned char da)
{ while ( !( UCSRA & (1<
}
//**************************显示字符串子程序********************
void outputstr(unsigned char str[])
{ l=strlen(str);
i=0;
while(i<=l)
{Transmit(str[i]);delay(800);i++;}
}
//********************选择子程序***********************
void options(void)
{ switch ( pos )
{case 'A' : { outputstr(str2); break; }
case 'B' : { PORTA=0x9F;PORTC=0x00; break; }
case 'C' : {run_forword() ; break; }
case 'D' : {run_backword(); break; }
default:outputstr(str1);
}
}
#pragma interrupt_handler uart0_rx_isr:10
void uart0_rx_isr(void)
{
pos=UDR; //把接收到的字符送给pos
options();
}
#pragma interrupt_handler uart0_tx_isr:12
void uart0_tx_isr(void)
{
}
void init_devices(void)
{
CLI();
port_init();
uart0_init();
MCUCR = 0x00;
EMCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI();
}
unsigned recvchar(void)
{
while ( !( UCSRA & 0x80) );
return UDR;
}
void main(void)
{
init_devices(); //初始化
a=0;i=0;
black(); //先让小车静止
PORTC=0x0F; //接通LED 的位线
while (1)
{
while(a= =0)
{outputstr(str1); //显示提示字符串
a=1;}
}
}
评论
查看更多