单片机串口程序
51单片机的串口通信程序(C语言)
51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。
本文将介绍使用C语言编写51单片机的串口通信程序。
1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。
首先,我们需要一块51单片机开发板,内置了串口通信功能。
另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。
2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。
在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。
同时,我们还需要引入头文件来定义串口通信的相关寄存器。
3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。
这些参数的配置需要根据实际需要进行调整。
在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。
4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。
初始化串口的过程包括打开串口、设置中断等。
5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。
阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。
6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。
在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。
7. 中断处理在串口通信中,中断是一种常见的处理方式。
通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。
8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。
```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。
用c语言实现串口读写程序
用c语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。
在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。
本文将介绍如何使用C语言实现串口读写程序。
二、硬件准备在进行串口通信之前,需要准备好相应的硬件设备。
一般来说,需要一台计算机和一个串口转USB模块(或者直接使用带有串口接口的计算机)。
同时,在单片机端也需要连接一个串口模块。
三、C语言编程实现1. 打开串口在C语言中,可以通过打开文件的方式来打开串口设备。
下面是一个示例代码:```#include <stdio.h>#include <fcntl.h>#include <termios.h>int open_serial_port(const char *device_path, int baud_rate) {int fd;struct termios options;fd = open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror("open_serial_port: Unable to open device");return -1;}fcntl(fd, F_SETFL, 0);tcgetattr(fd, &options);cfsetispeed(&options, baud_rate);cfsetospeed(&options, baud_rate);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;tcsetattr(fd, TCSANOW, &options);return fd;}```在上述代码中,open_serial_port函数用来打开串口设备,并设置相应的参数。
单片机的串口接收和发送数据的程序编写
单⽚机的串⼝接收和发送数据的程序编写#include "config.h"/******************************串⼝1的波特率********************************///T1作波特率发⽣器//在波特率加倍情况下#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA#define SYS_Fosc 11059200L //晶振频率uint32_t COMM_BAUD_RATE=9600 ; //串⼝波特率#define OSC_FREQ 11059200 //11059200static INT8U Send_buf[10] = {0} ;static INT8U Recv_buf[10] = {0} ;static INT8U SendDataLen = 0 ;static INT8U ResendDataLen = 0 ;/************************************************************************函数名:串⼝初始化功能描述: STC10L08XE 单⽚机串⼝初始化函数返回函数: none其他说明: none**************************************************************************/void UartIni(void){TMOD = 0x20; // 设置 T1 为波特率发⽣器SCON = 0x50; // 0101,0000 8位数据位, ⽆奇偶校验PCON = 0x00; //PCON=0;TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//设置为9600波特率TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);TR1 = 1; //定时器1打开REN = 1; //串⼝1接收使能ES = 1; //串⼝1中断使能EA = 1;}//串⼝接受函数初始化1void UartIni1(void){SCON = 0x50; //8-bit variable UARTTMOD = 0x20; //Set Timer1 as 8-bit auto reload modeTH1 = TL1 = -(SYS_Fosc/12/32/COMM_BAUD_RATE); //Set auto-reload vauleTR1 = 1; //Timer1 start runES = 1; //Enable UART interruptEA = 1; //Open master interrupt switch}/************************************************************ 名称:* 功能:* ⼊⼝参数:⽆* 出⼝参数:⽆* 说明:**********************************************************/void Uart_Isr() interrupt 4 using 1{if(RI){}}/************************************************************************功能描述:串⼝发送⼀字节数据 sbuf=data接受 data=sbuf⼊⼝参数: DAT:带发送的数据返回值: none其他说明: none**************************************************************************/void Uart_PutByte(uint8_t DAT){ES = 0;TI=0;DAT=SBUF ;while(TI==0);TI=0;ES = 1;}///*****************************************************************************************************// - 功能描述:串⼝接受⼀帧数据// - ⾪属模块:内部// - 参数说明:// - 返回说明:// - 注:⽆//*****************************************************************************************************/ void SendCmd(INT8U len ){INT8U i = 0 ;for(i=0; i<len; i++)//数据{Uart_PutByte(Send_buf[i]) ;}}///********************************************************************************************// - 功能描述:求和校验// - ⾪属模块:// - 参数说明:// - 返回说明:// - 注:和校验的思路如下// 发送的指令,去掉起始和结束。
51单片机串口通信程序。。含详细例子
{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
单片机串口烧录程序的实现方法
单片机串口烧录程序的实现方法
单片机串口烧录程序的实现方法主要依赖于单片机的串口通信功能。
以下是一个基本的步骤:
1. 硬件连接:首先,你需要将单片机与电脑进行连接。
这通常通过串口线实现,一端连接到电脑的串口,另一端连接到单片机的TXD和RXD(通常是串口通信的引脚)。
2. 设置开发环境:你需要在电脑上安装相应的开发环境,例如Keil、IAR等。
这些开发环境提供了代码编写、编译和烧录的功能。
3. 编写程序:在开发环境中,你可以编写程序代码。
这些代码将被编译成二进制文件。
4. 编译程序:在开发环境中,你可以将编写的代码编译成二进制文件。
5. 设置烧录参数:在开发环境中,你需要设置串口烧录的参数,例如波特率、数据位、停止位等,这些参数需要与单片机的串口通信参数一致。
6. 烧录程序:在开发环境中,你可以选择将编译好的程序通过串口烧录到单片机中。
这个过程通常会持续几秒到几分钟,具体时间取决于程序的长度和单片机的速度。
7. 调试程序:程序烧录完成后,你可以通过串口将单片机与电脑连接,然后启动程序进行调试。
注意:在烧录程序之前,请确保单片机的电源已经关闭。
因为在烧录过程中,程序会覆盖单片机上的原有程序,如果在烧录过程中单片机还在运行,可能会导致程序错误。
以上就是单片机串口烧录程序的基本步骤,具体的实现方式可能会因单片机的型号和开发环境的不同而有所差异。
单片机串口初始化程序
单片机串口初始化程序1.引言1.1 概述概述:单片机串口(Universal Asynchronous Receiver/Transmitter,简称UART)是一种常见的通信接口,可以通过串口与其他设备进行数据的传输和通信。
在单片机系统中,串口的初始化是非常重要的步骤,它不仅决定了串口通信的可靠性和稳定性,还影响了单片机整体系统的性能和功能。
本文将详细介绍单片机串口初始化的程序,包括串口的基本概念、串口初始化的重要性以及实现串口初始化的方法。
通过阅读本文,读者将了解到串口初始化的必要性,了解如何在单片机系统中进行串口初始化,从而为后续的串口通信提供完善的基础。
在正式进行串口初始化之前,我们需要先了解串口的基本原理和工作原理。
串口是一种异步的通信接口,它使用起停位、数据位、校验位和波特率等参数来进行通信。
单片机通过串口与外部设备进行数据的传输和接收,可以实现与计算机、传感器、LCD显示屏等设备的数据交互。
串口初始化的重要性不容忽视。
在单片机系统中,串口通常用于与其他设备进行数据的传输和通信。
如果串口初始化不正确或不完善,可能会导致数据传输错误、通信失败甚至系统崩溃。
因此,正确地初始化串口成为了保证系统正常运行和稳定通信的关键步骤。
针对串口初始化,本文将介绍一种常用的实现方法。
这种方法需要设置串口的参数,包括波特率、数据位、校验位和停止位等。
同时,还需要配置单片机的引脚和时钟等相关参数,使其能够正确地与外部设备进行串口通信。
本文将通过代码实例的方式,详细介绍串口初始化的具体步骤和方法,供读者参考和借鉴。
总之,本文将全面介绍单片机串口初始化的程序。
通过此文,读者将深入了解串口的基本概念和工作原理,认识到串口初始化的重要性,并学习到一种常用的串口初始化实现方法。
希望本文能为读者提供有益的知识和帮助,为单片机系统的开发和应用提供参考和指导。
1.2文章结构1.2 文章结构本文旨在介绍单片机串口初始化程序的相关知识和实现方法。
51单片机的串口通信程序(C语言)
#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00, 0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100); if(Key1 == 0){Key1_flag = 1; Key2_flag = 0; Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1; Key1_flag = 0; Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1; Key1_flag = 0; Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0; }else if(Key2_flag){TR1 = 1;SendData(0x11); Key2_flag = 0;}else if(Key3_flag) {P1=0xff;BELL = 0;CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count]; P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}51单片机串口通信C语言程序2**************************************************************; 平凡单片机工作室;ckss.asm;功能:反复向主机送AA和55两个数;主机使用一个串口调试软件设置19200,n,8,1***************************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned int//延时程序//////////////////由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;i<124;i++){;}}}//////////////////// 主程序////////////////////void main(){ uchar OutDat; //定义输出变量TMOD=0x20; //TMOD=0TH1=0xf3; //12MHZ ,BPS:4800,N,8,1TL1=0xf3;PCON=0x80; //方式一TR1=1; //?????????????????????????????SCON=0x40; //串口通信控制寄存器模式一OutDat=0xaa; //向串口发送固定数据值for(;;) //循环程序{SBUF=OutDat;//发送数据for(;;){ if(TI) //发送中断位当发送停止位时置1,表示发送完成break;}mDelay(500);TI=0; //清零中断位OutDat=~OutDat; //显示内容按位取反}}。
双单片机串口通信原理+程序
一、实验目的掌握单片机串口通信的设计方法,了解双单片机通信的原理。
二、实验内容(含程序)编写发送方和接受方单片机程序,让发送方单片机向接受方单片机循环发送几个两位十六进制数,并将发送的数显示在发送方和接受方的数码管上,要求串行口采用方式1进行通信,选用定时器T1作为波特率发生器,T1工作方式2,通信的波特率位9600。
硬件连接:发送发程序:#include<reg51.h>#define uint unsigned intuchar table[]={0xaa,0xB5,0xdd,0xa8,0xba,0xcc,0xf4,0xb0}; //要发送的数据void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void main(){uchar i=0;TMOD=0x20;TH1=0xfd;TL1=0xfd;SM0=0;SM1=1;TR1=1;EA=1;ES=1;while(1){SBUF=table[i];P1=table[i];while(!TI);TI=0;i++;if(i==8)i=0;delay(800);}}接收方程序:#include <reg51.h>#define uchar unsigned charuchar a;void main(){TMOD=0x20;TH1=0xfd;TL1=0xfd;REN=1;TR1=1;SM0=0;SM1=1;EA=1;ES=1;while(1);}void ser() interrupt 4{RI=0;a=SBUF;P1=a;}三、实验结果及分析本实验需要完成两个程序,发送方和接受方的,但是并没有要求加入奇偶校验,因此难度不大,从实验结果可以明显看出,当发送方数码管显示要发送的数值时,接受方数码管也几乎同时显示出此数值,证明接受无误,实验结果正确。
51单片机串口变并口汇编程序
51单片机串口变并口汇编程序一、背景介绍单片机是一种集成了处理器、存储器和输入输出接口的微型计算机系统,广泛应用于各种电子设备中。
其中,51单片机是一种非常常见且功能强大的单片机型号。
而串口和并口是单片机与外部设备进行数据传输的两种常见方式。
本文将探讨如何使用汇编语言编写一个将串口转换为并口的51单片机程序。
二、串口与并口的概念1. 串口串口是指利用一对数据线进行数据传输的通信接口。
串口通信可以实现双向数据传输,常用于计算机与外部设备之间的数据交换。
串口通信的优势在于能够以较低的成本实现较长距离的数据传输,且占用的引脚较少。
2. 并口并口是指利用多条数据线进行数据传输的通信接口。
并口通信一般只能实现单向数据传输,常用于单片机与外围设备之间的数据交换。
并口通信的优势在于能够以较高的速度进行数据传输,但由于占用的引脚较多,因此在设计中需要考虑引脚的分配和接口电路的设计。
三、串口变并口的原理串口与并口的数据传输方式和电气特性不同,因此需要一定的电路转换才能实现串口变并口。
常见的串口变并口电路采用的是移位寄存器,通过串行-并行转换实现数据的传输。
串口变并口的原理如下:1.串口接收到的数据通过串行-并行转换电路和移位寄存器转换为并行数据。
2.并口的数据通过并行-串行转换电路和移位寄存器转换为串行数据,然后通过串口发送出去。
四、51单片机串口变并口汇编程序实现步骤以下是使用51单片机汇编语言编写的串口变并口程序的实现步骤:1.初始化串口:设置串口的波特率、数据位数、停止位、校验位等参数。
2.初始化并口:设置并口的工作模式、数据线的方向等参数。
3.循环接收串口数据:使用串口中断,将接收到的串口数据存储到缓冲区中。
4.将串口数据转换为并口数据:通过移位寄存器和并口接口电路将串口数据转换为并口数据。
5.将并口数据发送出去:将转换后的并口数据通过并口接口电路发送给外部设备。
6.跳转回循环接收串口数据的步骤,完成循环。
PIC单片机串口通讯程序
PIC单片机串口通讯程序单片机串口通讯是一个常用的程序模块。
PIC单片机是一款常用的单片机。
在网上搜索到一个PIC单片机串口通讯程序。
这个PIC单片机串口通讯程序站长没有验证,应该是正确的。
假如大家有更好的PIC单片机串口通讯程序,请向我推荐。
1. 单片机PIC1编程(发送部分)LIST P=16F877#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X20MAIN MOVLW 0X30 ;以下将RAM内容初始化MOVWF FSR ;从30H单元开始MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;30H作为同步字符发送MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0BSF RCSTA,CREN ;接收数据允许LOOPTX BTFSS PIR1,RCIF ;等待PIC2的响应字节GOTO LOOPTXMOVF RCREG,0 ;读响应字节,清RCIFLOOPTX1 BTFSS PIR1,TXIF ;发送下一字节GOTO LOOPTX1INCF FSRMOVF INDF,0MOVWF TXREGBTFSS FSR,7 ;30H~7FH单元的内容是否发送完?GOTO LOOPTX ;没有,继续下一字节的发送BSF STATUS,RP0 ;如果是,则停止发送BCF TXSTA,TXENBCF STATUS,RP0 ;数据发送完毕CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(接收部分)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINMAIN BSF STATUS,RP0 ;初始化程序同发送子程序MOVLW 0X19 ;波特率设置与PIC1相同MOVWF SPBRGMOVLW 0X04 ;异步高速传输MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口工作使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;与外接电路隔离BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放发送来的数据MOVWF FSRBSF RCSTA,CREN ;接收允许BSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0WAIT BTFSS PIR1,RCIF ;等待接收数据GOTO WAITMOVF RCREG,0 ;读取数据MOVWF INDF ;将接收到的响应字节存入PIC2的RAM INCF FSRMOVWF TXREG ;发送响应字节LOOPTX BTFSS PIR1,TXIF ;等待写入完成GOTO LOOPTXBTFSS FSR,7 ;全部数据接收否?GOTO WAIT1 ;没有,继续接收其它数据BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许BSF STATUS,RP0BCF PIE1,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机双机同步通信1. 单片机PIC1编程(主控发送)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X0100MAIN MOVLW 0X30MOVWF FSR ;以下将从30H单元开始的RAM内容初始化MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FH MOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X94 ;选择同步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BSF STATUS,RP0MOVLW 0X30 ;将从30H单元开始的内容传送到PIC2MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0TX1 BTFSS PIR1,TXIF ;等待上一个数据写完GOTO TX1INCF FSR ;准备发送下一个数据MOVF INDF,0MOVWF TXREG ;将新的数据写入TXREGBTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕?GOTO TX1 ;没有,则继续发送其它字节TX2 BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送MOVWF TXREGNOP ;延时几个微秒后,关发送允许NOPNOPNOPNOPBSF STATUS,RP0BCF TXSTA,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(从动接收)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINORG 0X0100MAIN BSF STATUS,RP0MOVLW 0X10 ;选择同步从动方式MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;关断与外部电路的联系BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放接收的数据MOVWF FSRBSF RCSTA,CREN ;接收允许WAIT BTFSS PIR1,RCIF ;等待接收GOTO WAITMOVF RCREG,0 ;读取接收到的数据MOVWF INDF ;将接收到的数据存入PIC2的RAMINCF FSRBTFSS FSR,7 ;所有的数据是否已接收完?GOTO WAIT ;没有,继续接收其它字节NOP ;延时数微秒后,清接收允许位NOPNOPNOPBCF RCSTA,RCENCALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机与PC机通过串口通信1. PC机编程PC采用Toubr C 进行编写。
stc15单片机写485通讯程序
stc15单片机写485通讯程序如何在STC15单片机上编写485通信程序引言:STC15单片机是一种常用的单片机芯片,具有低功耗、高性能等特点,在工业自动化领域得到了广泛应用。
其中,485通信是一种常用的通信方式,具有抗干扰能力强、传输距离远等优势。
本文将详细介绍如何在STC15单片机上编写485通信程序,帮助读者了解实际操作过程。
一、了解485通信协议在开始编写485通信程序之前,我们首先要了解485通信协议。
485通信协议是一种串口通信协议,它定义了通信设备之间的数据传输规则。
它使用两根线实现全双工的通信,其中A、B两线分别用于发送和接收数据。
在编写485通信程序时,我们需要掌握标准的485通信协议,包括帧结构、波特率、数据格式等内容。
二、准备开发环境在编写485通信程序之前,我们需要准备好相应的开发环境。
首先,我们需要一台电脑,并安装好STC15系列单片机的开发软件,例如Keil C51。
然后,我们需要准备一块STC15单片机开发板,以及一台支持485通信的外部设备,例如电机控制器、传感器等。
三、了解STC15单片机的485通信功能STC15单片机具有内置的硬件串口模块,可用于实现485通信功能。
我们需要了解STC15单片机的串口模块的工作原理和使用方法。
具体来说,我们需要了解串口的引脚定义、波特率设置、数据格式配置等内容。
四、编写485通信程序接下来,我们可以开始编写485通信程序了。
在Keil C51开发环境中,我们可以利用C语言来编写程序。
首先,我们需要定义相应的引脚,将STC15单片机的串口引脚与外部设备的485通信引脚连接起来。
然后,我们需要进行相应的配置,例如设置波特率、数据位数、停止位等。
最后,我们可以编写数据发送和接收的代码,实现数据的传输和处理。
在编写485通信程序时,需要注意以下几个关键点:1. 引脚定义:需要根据具体的开发板和外部设备,定义好STC15单片机的串口引脚。
C8051F系列单片机串口通讯程序
C8051F系列单片机串口通讯程序采用C8051F020单片机//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者1 //定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)/#include <C8051F020.h>sfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN#define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1 #define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮 '0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//----------------------------------------------------------------------//子函数声明//----------------------------------------------------------------------void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//----------------------------------------------------------------------//主函数//----------------------------------------------------------------------void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口 0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000 TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps TL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0{TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1{uchar rxch;if(RI0) //中断标志 RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//------------------------------------------------------------- //程序结束。
51单片机串口变并口汇编程序
51单片机串口变并口汇编程序51单片机是一种常用的微控制器,它具有高性能、低功耗、丰富的外设和广泛的应用领域。
其中,串口和并口是常见的通信接口方式。
本文将详细介绍51单片机串口变并口汇编程序的实现方法。
## 1. 串口和并口介绍### 1.1 串口串行通信接口(Serial Communication Interface),简称串口,是一种将数据以连续位的形式传输的通信方式。
它只需要两根线(发送线和接收线)即可实现数据传输,适用于远距离传输和多设备连接。
### 1.2 并口并行通信接口(Parallel Communication Interface),简称并口,是一种将数据以多个位同时传输的通信方式。
它需要多根线同时传输数据,适用于高速数据传输和短距离连接。
## 2. 串行通信与并行通信转换原理在51单片机中,通过软件编程可以实现串行通信与并行通信之间的转换。
下面是其基本原理:### 2.1 串行转并行在将串行数据转换为并行数据时,需要一个移位寄存器来存储接收到的串行数据,并通过时钟信号按位移出到并行总线上。
具体步骤如下:1. 初始化串口参数,包括波特率、数据位、停止位等。
2. 等待串口接收到数据。
3. 将接收到的串行数据写入移位寄存器。
4. 通过时钟信号依次将移位寄存器中的数据按位移出到并行总线上。
### 2.2 并行转串行在将并行数据转换为串行数据时,需要一个移位寄存器来存储要发送的并行数据,并通过时钟信号按位读取并发送出去。
具体步骤如下:1. 初始化串口参数,包括波特率、数据位、停止位等。
2. 将要发送的并行数据写入移位寄存器。
3. 通过时钟信号依次从移位寄存器中读取数据,并发送出去。
## 3. 51单片机串口变并口汇编程序实现下面是一个示例程序,演示了如何在51单片机中实现串口变并口的功能。
```assembly; 定义串口接收和发送函数USART_Rx: ; 串口接收函数MOV A, SBUF ; 读取SBUF中的接收数据RETUSART_Tx: ; 串口发送函数MOV SBUF, A ; 将A寄存器中的数据写入SBUFRET; 主程序入口MAIN:MOV TMOD, #20H ; 设置定时器1为工作模式2,用于串口通信 MOV TH1, #FDH ; 设置波特率为9600SETB TR1 ; 启动定时器1; 初始化串口参数MOV SCON, #50H ; 设置串口工作模式为8位数据位、1位停止位、可变波特率; 接收数据并转换为并行数据发送CALL USART_Rx ; 调用串口接收函数,将接收到的数据存入A寄存器MOV P0, A ; 将A寄存器中的数据写入P0,并行总线; 并行数据转换为串行数据发送MOV A, P1 ; 从P1并行总线读取要发送的数据,存入A寄存器CALL USART_Tx ; 调用串口发送函数,将A寄存器中的数据发送出去SJMP MAIN ; 无限循环END```上述汇编程序通过调用USART_Rx和USART_Tx函数实现了串口接收和发送功能。
华大单片机串口初始化程序
华大单片机串口初始化程序华大单片机是一种常见的嵌入式系统开发平台,它具有强大的功能和灵活性,被广泛应用于各种领域。
在使用华大单片机进行串口通信时,初始化串口是非常重要的一步,它能够确保串口正常工作,并且能够正确地接收和发送数据。
本文将详细介绍华大单片机串口初始化的程序。
我们需要在程序中包含华大单片机的头文件,这样才能够使用相关的函数和宏定义。
通常情况下,需要包含"UART.h"这个头文件。
在程序的开头,我们可以使用以下代码进行头文件的包含:```#include "UART.h"```接下来,我们需要定义一些变量,这些变量将用于配置串口的参数。
一般来说,需要定义波特率、数据位、停止位和校验位等参数。
例如,我们可以定义以下变量:```unsigned int baud_rate = 9600; // 波特率为9600unsigned char data_bits = 8; // 数据位为8位unsigned char stop_bits = 1; // 停止位为1位unsigned char parity = 0; // 校验位为无校验```在定义好这些变量之后,我们可以调用华大单片机提供的函数来初始化串口。
通常情况下,可以使用UART_Init函数来实现串口的初始化。
该函数的参数包括波特率、数据位、停止位和校验位等。
例如,我们可以使用以下代码进行串口的初始化:```UART_Init(baud_rate, data_bits, stop_bits, parity);```在调用UART_Init函数之后,华大单片机会根据我们定义的参数来配置串口。
这样,串口就成功地初始化完成了。
在实际的应用中,我们可能还需要设置其他一些参数,以满足特定的需求。
例如,我们可能需要设置串口的工作模式、数据传输的方式等。
华大单片机提供了丰富的函数和宏定义,可以帮助我们实现这些功能。
单片机串口通信程序
引言:单片机串口通信程序是一种用于实现单片机与外部设备进行数据传输的通信方式。
它通过串口接口将数据以串行的形式传输,实现了高效、可靠的数据交互。
本文将详细介绍单片机串口通信程序的实现原理、步骤和注意事项。
概述:单片机串口通信程序主要包括串口初始化、发送数据、接收数据和中断处理等部分。
其中,串口初始化是设置串口通信的参数,发送数据和接收数据是具体的数据传输操作,中断处理则是处理串口中断事件的相关操作。
正文:一、串口初始化1.确定串口通信的波特率:波特率是指单位时间内传输的比特数,需要根据通信双方的需求确定合适的波特率。
2.设置数据位、停止位和校验位:数据位决定了每个字节中实际有效数据的位数,通常为8位;停止位用于判断一个字节的结束,通常为1位;校验位用于检测和纠正数据传输过程中的错误。
3.打开串口:通过使能相应的寄存器位,开启串口功能。
二、发送数据1.准备要发送的数据:将要发送的数据存储在缓冲区中,可以是一个字节、多个字节或一个字符串。
2.判断发送缓冲区是否为空:检查发送缓冲区是否已被发送完毕,如果为空则可以开始发送新的数据。
3.将数据发送到串口寄存器:将准备好的数据写入串口寄存器,启动数据传输。
4.等待数据发送完毕:通过检查发送完成标志位,判断数据是否已经成功发送完毕。
三、接收数据1.等待接收缓冲区非空:通过检查接收缓冲区是否有新的数据接收到,判断是否可以开始接收数据。
2.读取接收缓冲区的数据:通过读取串口寄存器中的数据,获取已接收到的数据。
3.处理接收到的数据:对接收到的数据进行相应的处理操作,可以是存储、显示或其他操作。
四、中断处理1.使能串口中断:通过设置相应的中断使能标志位,允许串口中断事件的发生。
2.处理接收中断:当接收缓冲区有新的数据到达时,触发串口接收中断,通过中断服务程序对接收到的数据进行处理。
3.处理发送中断:当发送缓冲区为空时,触发串口发送中断,通过中断服务程序发送新的数据。
瑞萨单片机串口烧写程序具体引脚连接方法
瑞萨单片机串口烧写程序具体引脚连接方法
瑞萨单片机是一种广泛应用于嵌入式系统的芯片,其可通过串口进行程序烧写。
为了实现这一功能,我们需要进行一些硬件搭建和操作流程。
本文将详细介绍瑞萨单片机串口烧写程序的具体引脚连接方法。
一、瑞萨单片机串口烧写程序的硬件搭建
1.开发平台:Windows XP操作系统,瑞萨开发环境HEW,瑞萨烧写工具FDT。
2.单片机型号:L357C。
3.硬件原理:根据瑞萨L357C单片机Datasheet手册,使用UART0作为串行编程器的通信口。
二、瑞萨单片机串口烧写程序的操作流程
1.使用FDT直接烧录mot文件。
2.配置FDT软件,选择正确的串口号和波特率。
三、具体引脚连接方法
1.将单片机的RXD(接收数据引脚)与电脑串口的发送数据引脚(通常为RXD)相连。
2.将单片机的TXD(发送数据引脚)与电脑串口的接收数据引脚(通常为TXD)相连。
3.将单片机的VCC(电源正极)与电脑串口的电源正极相连。
4.将单片机的GND(电源负极)与电脑串口的电源负极相连。
5.为了保证电平匹配,可在单片机与电脑串口之间添加一个RS232转TTL
的电平转换模块。
通过以上硬件搭建和操作流程,即可实现瑞萨单片机串口烧写程序。
在实际操作过程中,请确保正确连接所有引脚,以避免损坏设备。
在烧写程序时,注意观察串口通信状态,确保程序成功烧入单片机。
总之,瑞萨单片机串口烧写程序的具体引脚连接方法主要包括:正确连接单片机的接收和发送数据引脚、电源正负极以及添加电平转换模块。
init_serial1。单片机串口初始化程序[修订]
init_serial1。
单片机串口初始化程序/*描述:电脑串口显示程序硬件支持:STC12C2052AD 外部12MHZ晶振用Windows系统中的"超级终端"软件,将串口端设置 [ 4800,8,无,1,无 ]*///#include<STC12C5A60S2.H> //单片机头文件//#include <intrins.H>/******自定义函数**************/void UART_init (void); /**UART串口初始化函数**********/void UART_T (unsigned char UART_data);/****************UART 串口发送函数**************************/void UART_TC (unsigned char *str);/*****UART串口发送字符串函数 *//********************************************************** ***********************************函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为11.0592MHz,PC串口端设置 [ 9600,8,无,1,无 ]/**********************************************************************************************/void UART_init (void){// EA = 1; //允许总中断(如不使用中断,可用//屏蔽)// ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xFD; //定时器初值高8位设置TL1 = 0xFD; //定时器初值低8位设置// PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}/********************************************************** ************************************//********************************************************** ***********************************函数名:UART串口发送函数调用:UART_T (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出备注:/********************************************************** ************************************/void UART_T (unsigned char UART_data) //定义串口发送数据变量{SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)}/********************************************************** ************************************//********************************************************** ***********************************函数名:UART串口发送字符串函数调用:UART_TC (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:向串口发送一个字符串,长度不限。
单片机串口程序作用
单片机串口程序作用随着计算机技术的不断进步和发展,单片机技术也愈加成熟,并且在各个领域中被广泛应用。
而单片机串口程序作为单片机应用程序中的重要部分,也发挥着不可忽视的作用。
本文将从什么是单片机串口、单片机串口程序的基本作用、单片机串口程序的组成及安装、单片机串口程序在生活中的应用和单片机串口程序应用的局限性等方面进行深入探讨和分析。
一、什么是单片机串口单片机串口,简单来说,是指利用串行传输技术,实现单片机与外部设备之间的数据交换。
单片机串口通过串口通信协议,在单片机与其他设备之间建立一种通讯机制。
串口通信协议是一种数字通信协议,它的特点是使用很少的线路即可建立通信,而且传输速度不会受到传输距离的限制。
二、单片机串口程序的基本作用我们都知道,单片机没有显示器、键盘等外部交互设备,因此想要进行数据的输入和输出,需要通过串口或并口通讯的方式来实现。
串口程序作为单片机应用程序中的重要组成部分,它的基本作用是实现单片机和计算机之间的数据传输和通信。
具体来说,单片机串口程序可以实现以下几个方面的功能:1、数据传输功能:单片机串口程序可以将单片机中处理好的数据通过串口传输到计算机中,也可以将计算机中的命令通过串口传输到单片机中,从而实现单片机与计算机之间的数据交换。
2、接口功能:单片机串口程序可以将单片机的数据接口与计算机进行连接,实现控制和监测单片机系统的各种数据。
同时,它还可以扩展多种不同类型的传感器、执行器等外部设备,为单片机系统提供更广阔的应用空间。
3、协议转换功能:由于单片机串口通讯协议并不统一,在单片机与不同设备之间进行串口通讯时,需要协议转换。
串口程序可以实现不同协议之间的转换,从而实现单片机与其他设备之间的通信。
4、实时监测功能:在单片机系统应用中,时时刻刻都需要监测各种数据和状态,例如测量温度、湿度、压力等传感器的数据、控制电机等执行器的状态。
单片机串口程序可以不间断地接收外部设备发送的信号,实时检测系统的各种数据和状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "uart.h"
union // uart usr register(control and states register)
{
uchar usr;
struct
{
uchar txif :1;
uchar tidle :1;
uchar rxif :1;
uchar ridle :1;
uchar oerr :1;
uchar ferr :1;
uchar nf :1;
uchar perr :1;
}Flag;
}Register;
void uart_init(void)
{
#ifdef UART_DEBUG
uchar tmp=0xFF;
// Initialation of SPI
// 由于HT66FU50 内建的UART 功能,是通过内部SPI 与UART Bridge IC 连接实现的,
// 因此在使用UART 前,必须正确配置SPI 的Pin-remapping 功能,通过寄存器PRM0 将SPI 引脚
// 设为与内部UART 连接,具体设定如下:
// PRM0寄存器中的SIMPS1=0、SIMPS0=1、PCKPS=1,
// 设定完后,将SIMC0寄存器中的SIMEN 设定为1,MCU 就可以通过SPI 使用UART 功能了
// 对应位名称:—C1XPS0 —C0XPS0 PDPRM SIMPS1 SIMPS0 PCKPS
// SIMPS1,SIMPS0:SIM 引脚重置控制位
// 00:SDO on PA5;SDI/SDA on PA6;SCK/SCL on PA7;SCS on PB5
// 01:SDO on PD3;SDI/SDA on PD2;SCK/SCL on PD1;SCS on PD0
// 10:SDO on PB6;SDI/SDA on PB7;SCK/SCL on PD6;SCS on PD7
// 11:未定义
// 引脚重置寄存器设置SIMPS1=0、SIMPS0=1、PCKPS=1
_prm0 = 0x03;
// 对应的位名称:D7 D6 CKPOLB CKEG MLS CSEN WCOL TRF
_simc2 =0x08;
// 对应的位名称:SIM2 SIM1 SIM0 PCKEN PCKP1 PCKP0 SIMEN —
// 要求:SIM2 SIM1 SIM0
// 000:SPI 主机模式;SPI 时钟为fSYS/4
// 001:SPI 主机模式;SPI 时钟为fSYS/16
// 010:SPI 主机模式;SPI 时钟为fSYS/64
// 011:SPI 主机模式;SPI 时钟为fTBC
// 100:SPI 主机模式;SPI 时钟为TM0 CCRP 匹配频率/2 // 101~111:未使用
_simc0 =0x12;
// UART reset
uart_write_reg((uchar)WriteUCR3,(uchar)0x80);
// 8 N 1 format 使能TX
uart_write_reg((uchar)WriteUCR1,(uchar)0x80);
// baud rate 9600 by BRGH=1 and Fosc= 3579545
uart_write_reg((uchar)WriteBRG,(uchar)0x16);
// Interrupt enable rx (disable tx )
uart_write_reg((uchar)WriteUCR2,(uchar)0xe4);
// uart_receive_cnt=0;
// uart_cmd = FALSE;
_xpf=0;
_mf2f=0;
_xpe=1;
_mf2e=1;
_sime = 0;
#endif
}
void uart_write_reg(uchar Command, uchar Data)
{
#ifdef UART_DEBUG
_trf=0;
// 1: 使能
_csen=1;
// 0: 无写冲突
_wcol=0; //写数据至数据寄存器
_simd=Command;
while(_wcol==1)
{
_wcol=0;
_simd=Command;
}
// trf为发送标志,1:发送结束
while(!_trf);
_trf=0;
_simd=Data;
while(_wcol==1)
{
_wcol=0;
_simd=Data;
}
while(!_trf);
_trf=0;
_csen=0;
#endif
}
uchar uart_read_reg(uchar Command)
{
#ifdef UART_DEBUG
uchar val=0x00;
// 1 使能
_csen=1;
// 0 无写冲突
_wcol=0;
//写数据至数据寄存器
_simd=Command;
while(_wcol==1)
{
_wcol=0;
_simd=Command;
}
// trf为发送标志,1:发送结束
while(!_trf);
_trf=0;
_simd=val;
while(_wcol==1)
{
_wcol=0;
_simd=val;
}
while(!_trf);
val = _simd;
_trf=0;
_csen=0;
return val;
#endif
}
void uart_send_string_with_zero(uchar *string)
{
#ifdef UART_DEBUG
uchar i=0;
// 发送数据缓存器中的字符串,该字符串以NULL结尾while(1)
{
if(*(string+i)==255)
break;
r = uart_read_reg((uchar)ReadUSR);
if(Register.Flag.txif==1)
{
uart_write_reg(WriteFIFO,*(string+i));
_delay(200);
i++;
}
_xpf=0;
_mf2f=0;
}
#endif
}。