串行口方式3的运用 一、 设计要求甲乙两个单片机进行方式3(或方式2)串行通讯。甲机将8个流水灯控制数据发送给乙机,乙机再利用该数据点亮其P1口的8个LED。方式3比方式1多了一个可编程位TB8,该位一般作奇偶校验位。乙机接收到的8位二进制数据有可能出错,需进行奇偶校验,其方法是将乙机的RB8和PSW的奇偶校验位P进行比较,如果相同,接收数据;否则拒绝接收。
二、 系统方案本系统主要由单片机控制模块、AT80C51模块、灯组模块、电源模块组成,下面分别论证这几个模块的选择。
1、主控制器件的论证与选择1.1.1控制器选用 单片机比较 方案一:采用传统的51系列单片机。 传统的51单片机有5个中断源,12T模式,内部没有或很少4K或8K的程序存储器。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 方案二:采用以增强型80C51内核的STC系列单片机 80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟,故采用来作为控制核心。 STC单片机是1T的单片机,比传统的51单片机要快很多,而且也增加了很多新的功能,增加了内部EEPROM存储器,更方便保存数据。另一个特点,就是用串行口下载程序,使得烧录程序更方便。 通过比较,我们选择方案二。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- u8 data_send;
- void usart_send(u8 data_send)
- {
- ACC=data_send;
- TB8=P;
- SBUF=data_send;
- while(!TI);
- TI=0;
-
-
- }
- void UsartInit()
- {
- SCON=0xd0; //设置为工作方式3
- TMOD=0X20; //设置计数器工作方式2
- //PCON=0X80; //波特率加倍
- TH1=0XFd; //计数器初始值设置,注意波特率是4800的
- TL1=0XFd;
- SM0=1;
- SM1=1;
- REN=1;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1; //打开计数器
- }
- void delay(u16 j) //1ms?????
- {
- u8 i=250;
- for(;j>0;j--)
- {
- while(--i);
- i=249;
- while(--i);
- i=250;
- }
- }
- void main()
- {
- UsartInit(); // 串口初始化
- while(1)
- {
- }
- }
- void Usart_rec() interrupt 4
- {
- RI=0;
- ACC=SBUF;//出去接收到的数据
- if(RB8==P)
- {
- P1=SBUF;
- }else{
- }
-
- }
复制代码
所有资料51hei提供下载(发射+接收):
串行通讯.zip
(93.25 KB, 下载次数: 26)
|