导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→单片机设计[fengjian99]

 *第24025篇: 单片机设计

  
楼 主:fengjian99 2008年5月27日15:09
 单片机设计
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。

测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#include 
#include 
#define INBUF_LEN 4 //数据长度 

unsigned char inbuf1[INBUF_LEN]; 
unsigned char checksum,count3; 
bit read_flag= 0 ;

 void init_serialcomm( void )
 { 
     SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr 
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 
PCON |= 0x80 ; //SMOD=1; 
TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz 
IE |= 0x90 ; //Enable Serial Interrupt 
TR1 = 1 ; // timer 1 run 
// TI=1; 

//向串口发送一个字符 

void send_char_com( unsigned char ch) 
{

SBUF=ch; 
while (TI== 0 ); 
TI= 0 ; 

//向串口发送一个字符串,strlen为该字符串长度 

void send_string_com( unsigned char *str, unsigned int strlen) 

   unsigned int k= 0 ; 
   do 

   send_char_com(*(str + k)); 
   k++; 
} while (k   < strlen); 
}

 //串口接收中断函数 

void serial () interrupt 4 using 3 

   if (RI) 

   unsigned char ch; 
   RI = 0 ; 
   ch=SBUF; 
   if (ch>   127 ) 

   count3= 0 ; 
   inbuf1[count3]=ch; 
   checksum= ch- 128 ; 

else

   count3++; 
   inbuf1[count3]=ch; 
   checksum ^= ch; 
   if ( (count3==(INBUF_LEN- 1 )) && (!checksum) ) 

   read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
 //就置位取数标志 



main() 
{
   init_serialcomm(); //初始化串口 
   while ( 1 ) 

   if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 

   read_flag= 0 ; //取数标志清0 
   send_string_com(inbuf1,INBUF_LEN); 


}

串行通信虽然有其自身优点:如适合长距离通信,有一定的纠错能力等,但并行通信在短距离(数米范围内)传输过程中的优点是显而易见的。首先串行通信时要设置串口数据,如:串口号(Com1、Com2或者其他串口)、波特率、数据位数、停止位、校验位等等。而且单片机与PC机的串口数据必须一一对等,否则不能传输。而并行传输时,无需上述过程。其次,PC机的串口电平值为+12V~-12V,单片机是TTL电平(0~+5V),两者必须要经过电平转换芯片进行电平间的转换。而进行并行传输时,由于双方都是TTL电平,所以PC的并口可以与单片机或其他芯片直接相连;另外,串行传输速度慢,每次只能传送一位,而并行每次可以传送8位,速度上的差异显而易见。

而对于单片机,串口(UART)是最常用的端口,尤其对于存在两个或多个串口的单片机来说,充分利用串口进行通信是非常重要的。

输出输入接口的扩展 

单片机串口实现"并行"通信,其原理就是将PC机传过来的并行数据转换成串行数据,送入单片机的串口再由其进行相应处理。实质上就是一个数据串-并、并-串转换的过程。

PC的并口为一个标准的25针插座,包含一个八位二进制数据端口(地址为378H),即第2脚到第9脚;一个输入控制端口(地址为379H),即第15脚、13脚、12脚、10脚、11脚,其另外低三位无定义;一个输出控制口(地址为37AH),即第1脚、14脚、16脚、17脚,其另外高四位无定义。由此可见后面两个端口都不是完全的8位。 

输出接口电路扩展 

这里使用常用的移位寄存器74LS164与单片机的RXD口构成输出接口电路。

双列直插式74LS164引脚定义如图1所示。

其中:QA~QH为并行输出的数据,送入PC机并口378H端口(接收数据的8个数据位);单片机串口输出的数据从AB输入;CLR信号用于清除输出数据(通常用在移位完成时);内部数据移位依靠时钟CLK信号上升沿(由单片机TX提供)控制。

更多请点击:

单片机设计----单片机串口通讯

单片机设计----单片机时钟设计

单片机设计----单片机霓虹灯设计

单片机设计----单片机闪烁灯设计

单片机设计----单片机交通灯设计

单片机技术----单片机抗干扰技术


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:嵌入式研发工程师面试试题大全(ANSI CC++方面的知识 )[原创]

[下一篇主题]:Keil C51使用教程[经典推荐]