电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者维修技术家电维修单元电路介绍微机|单片机利用PC的RS232口控制LED灯

利用PC的RS232口控制LED灯

09-08 11:35:25 | http://www.5idzw.com | 微机|单片机 | 人气:458
标签:电路设计,http://www.5idzw.com 利用PC的RS232口控制LED灯,http://www.5idzw.com

利用PC的RS232口控制LED灯

AVR单片机串口程序的编写 Atmega8单片机的串口具支持多种数据帧结构、有三个完全独立的中断(接收完成、发送完成、发送数据寄存器空)等特点,同时也支持多机通讯模式。本实验就以Atmega8为例来介绍AVR单片机串口的编程。 单片机串口在使用前必须对其进行初始化。初始化内容如下: 1.串口接收器和发送器的使能设置:首先我们要根据需要,使能M8串口的接收器或者发射器,这样I/O口(PD1:TXD,PD2:RXD)才能为USART工作。 2.串口中断工作方式的设置:如果需要串口工作于中断方式,则要根据需要设置USART的中断设置,如果工作于查询方式,那么中断设置就没有必要了。本实验中串口设置为响应接收完成中断,即接收器接收到一个完整的数据帧后,将触发一次接收完成中断。 3.波特率设置:也就是设置串口的数据传输速率,两个串口之间要正常通讯就必须要保证波特率相同。本实验设置的波特率为9600,系统使用内置8MHZ时钟源,可以直接查表(《Atmega8原理及应用手册》129页)得到UBRR=51。 4.数据帧结构设置:本实验设置为8位数据位+1位停止位。 因此,本实验的串口初始化程序如下: void UART_init(void)

{

UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允许串口发送和接收,并响应接收完成中断

UBRR = 51; //设置串口波特率为9600

UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //帧结构为8位数据+1位stop位

} 如果你对AVR单片机串口的设置还不是太熟悉的话,也可以使用ICC编译器中的应用向导直接生成串口的相关代码。操作方法如下: 1.在ICC中新建一个文件; 2.点击Tools菜单中的Application Builder子菜单,将弹出以下界面,然后根据需要选择CPU为M8,晶振频率为8MHZ。

利用PC的RS232口控制LED灯

3.点击上面界面中的UART菜单,出现下面界面。然后按下图选项选择使能接收和发送、波特率9600、数据位8位、接收完成中断。

利用PC的RS232口控制LED灯

4.点击OK后,在刚才新建的文件中即生成了完整代码,其中串口初始化的代码如下: //UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9615 (0.2%)

// char size: 8 bit

// parity: Disabled

void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = BIT(URSEL) | 0x06;

UBRRL = 0x33; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98;

} 大家看看使用ICC自动生成的代码和我们自己编写的代码中UCSRC、UBRR、UCSRB是不是一样的呢?

通讯协议及命令(2004-10-29) 为了保证单片机和PC机的正常可靠的通讯,避免系统出现误动作,我们需要制订一个简单的通讯协议,同时还要定义能够让PC和单片机理解的命令。这里我们简单定义如下: 1.PC机发送的继电器控制指令采用4个字符组成的字符串格式“s” S1S0 “p”,如“s00p”。 其中s和p字符用于数据的简单校验,也就是说当单片机收到的串口数据中如果第一位是“s”第四位是“p”,则单片机接收到的命令有效,否则指令无效。 S1是单片机地址识别,如果单片机接收到的S1字符等于自己的地址码,则单片机执行命令,否则无效。通过这个字符我们就可以通过一个PC机串口和多个单片机进行通讯,这种通讯方式的设置我们会在后面阐述。S0对应继电器编码,指定相应继电器的吸合或者释放,如果S0=“a”,则该板的所有继电器全部吸合,如果是“b”则全部释放。 2.单片机返回给PC机的指令也同样采用4个字符串格式S2S1S0 “t”,如“000t”。 其中“t”为校验码。S2为单片机地址码,S1、S0对应继电器编码。返回指令用于PC机判断单片机是否执行了发出的指令。S1S0的二进制数据中,每一位对应一个继电器的状态,如果为1表示继电器吸合,为0表示继电器释放。 3.通讯检测。当后台程序启动后,PC机先发送“s00t”命令,如果PC机在6秒以内能够收到单片机返回的继电器状态(该状态是读取控制继电器的I/O口的电平获得的),则PC机判断通讯正常,可以正常使用,否则PC机提示串口通讯不正常。 此后,PC机还会每隔5秒钟自动请求一次继电器状态,并且按键对继电器进行操作以后,控制板也会主动向PC机发送状态字。 4.软件升级指令。当需要升级单片机软件时,PC机发送该指令让单片机进入BOOT load程序区,准备更新软件版本。该指令格式为“su” S0 “p”,S0为单片机地址码。 当单片机进入BOOT区后,向PC机发送S0 “upd”指令,S0为单片机地址码,通知PC机软件升级已经准备好。然后PC机关闭串口,提示您打开ISP下载软件进行升级。 5.单片机复位指令。当单片机在线升级完成以后,PC机可以通过发送复位指令让单片机复位重新进入应用程序区。 Atmega8的IAP应用我们将在后面进行阐述。 后台PC程序及使用介绍 后台程序使用VB6.0编写,其中利用VB的MSComm控件完成PC和单片机的通讯。界面如下: 4.点击OK后,在刚才新建的文件中即生成了完整代码,其中串口初始化的代码如下: //UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9615 (0.2%)

// char size: 8 bit

// parity: Disabled

void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = BIT(URSEL) | 0x06;

UBRRL = 0x33; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98;

} 大家看看使用ICC自动生成的代码和我们自己编写的代码中UCSRC、UBRR、UCSRB是不是一样的呢?

通讯协议及命令(2004-10-29) 为了保证单片机和PC机的正常可靠的通讯,避免系统出现误动作,我们需要制订一个简单的通讯协议,同时还要定义能够让PC和单片机理解的命令。这里我们简单定义如下: 1.PC机发送的继电器控制指令采用4个字符组成的字符串格式“s” S1S0 “p”,如“s00p”。 其中s和p字符用于数据的简单校验,也就是说当单片机收到的串口数据中如果第一位是“s”第四位是“p”,则单片机接收到的命令有效,否则指令无效。 S1是单片机地址识别,如果单片机接收到的S1字符等于自己的地址码,则单片机执行命令,否则无效。通过这个字符我们就可以通过一个PC机串口和多个单片机进行通讯,这种通讯方式的设置我们会在后面阐述。S0对应继电器编码,指定相应继电器的吸合或者释放,如果S0=“a”,则该板的所有继电器全部吸合,如果是“b”则全部释放。 2.单片机返回给PC机的指令也同样采用4个字符串格式S2S1S0 “t”,如“000t”。 其中“t”为校验码。S2为单片机地址码,S1、S0对应继电器编码。返回指令用于PC机判断单片机是否执行了发出的指令。S1S0的二进制数据中,每一位对应一个继电器的状态,如果为1表示继电器吸合,为0表示继电器释放。 3.通讯检测。当后台程序启动后,PC机先发送“s00t”命令,如果PC机在6秒以内能够收到单片机返回的继电器状态(该状态是读取控制继电器的I/O口的电平获得的),则PC机判断通讯正常,可以正常使用,否则PC机提示串口通讯不正常。 此后,PC机还会每隔5秒钟自动请求一次继电器状态,并且按键对继电器进行操作以后,控制板也会主动向PC机发送状态字。 4.软件升级指令。当需要升级单片机软件时,PC机发送该指令让单片机进入BOOT load程序区,准备更新软件版本。该指令格式为“su” S0 “p”,S0为单片机地址码。 当单片机进入BOOT区后,向PC机发送S0 “upd”指令,S0为单片机地址码,通知PC机软件升级已经准备好。然后PC机关闭串口,提示您打开ISP下载软件进行升级。 5.单片机复位指令。当单片机在线升级完成以后,PC机可以通过发送复位指令让单片机复位重新进入应用程序区。 Atmega8的IAP应用我们将在后面进行阐述。 后台PC程序及使用介绍 后台程序使用VB6.0编写,其中利用VB的MSComm控件完成PC和单片机的通讯。界面如下:

[1] [2]  下一页

,利用PC的RS232口控制LED灯
关于《利用PC的RS232口控制LED灯》的更多文章