C51串口通讯程序

合集下载

51单片机的串口通信程序(C语言)

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单片机串口通信程序。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

C51编写 串口通信程序

C51编写 串口通信程序

异步通信的数据格式 :
一个字符帧 空 闲 起 始 位 数据位 校 验 位 停 止 位 空 闲
下一字符 起始位
LSB
MSB
异步通信的特点:不要求收发双方时钟的 严格一致,实现容易,设备开销较小,但 每个字符要附加2~3位用于起止位,各帧 之间还有间隔,因此传输效率不高。
2、同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。此时,传输数据的位之间的距离均 为“位间隔”的整数倍,同时传送的字符间不留间隙,即 保持位同步关系,也保持字符同步关系。发送方对接收方 的同步可以通过两种方法实现。
串行通信是将数据字节分成一位一位的形 式在一条传输线上逐个地传送。
接 收 设 备
D0 D7
8位顺次传送
发 送 设 备
串行通信的特点:传输线少,长距离传送时 成本低,且可以利用电话网等现成的设备, 但数据的传送控制比并行通信复杂。
7.1.1 串行通信的基本概念
一、异步通信与同步通信
1、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟 控制数据的发送和接收过程。为使双方的收发协调,要求 发送和接收设备的时钟尽可能一致。
面向位的同步格式 :
8位 01111110 8位 地址场 8位 控制场 ≥0位 信息场 16位 校验场 8位 01111110
此时,将数据块看作数据流,并用序列01111110作为开始 和结束标志。为了避免在数据流中出现序列01111110时引起 的混乱,发送方总是在其发送的数据流中每出现5个连续的1 就插入一个附加的0;接收方则每检测到5个连续的1并且其后 有一个0时,就删除该0。 典型的面向位的同步协议如ISO的高级数据链路控制规程 HDLC和IBM的同步数据链路控制规程SDLC。 同步通信的特点是以特定的位组合“01111110”作为帧的 开始和结束标志,所传输的一帧数据可以是任意位。所以传 输的效率较高,但实现的硬件设备比异步通信复杂。

51单片机串口通信程序。。含详细例子

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();

C51很简洁易懂的RS232串口通信接收发送程序

C51很简洁易懂的RS232串口通信接收发送程序

/****************************************************************************** ****** 标题: RS232串口通信试验(接受与发送) **** 1.通过本例程了解串口的基本原理及使用,理解并掌握对串口进行初始化**** 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机来做收发试验。

* 在调试助手字符串输入框中输入数字和字符,按发送按钮,然后观察接受窗口的变化。

也可以用* 调试助手自动循环发送。

**** 请学员认真消化本例程,学会用C语言操作串口******************************************************************************** ******/#include <REG52.H>sbit BEEP = P1^4;bit Flag;unsigned int ReData,SenData;void main (void) {SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD|= 0x20; //定时器工作方式2PCON|= 0x80;//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。

效验位无(11.0592)TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。

效验位无(12M)TL1 = 0xF3;TR1 = 1;ES = 1; //开串口中断EA = 1; // 开总中断BEEP=1;// IE = 0x0;while(1){if (Flag==1){SBUF=SenData; //SUBF接受/发送缓冲器while(TI==0);TI=0;Flag=0;}}}/****************************************************串口中断程序******************************************************/ void ser_int (void) interrupt 4 using 1{if(RI == 1) //RI接受中断标志{RI = 0; //清除RI接受中断标志ReData = SBUF; //SUBF接受/发送缓冲器SenData=ReData;Flag=1;}}。

51单片机串口及程序

51单片机串口及程序

东流电子1.2 硬件说明1.2.1 IO 口分配说明l LED:接P0 口l 点阵:阳极通过74HC573接P0 口,阴极接P2 口l 数码:段码通过74HC573接P0 口,位选码通过74HC138接P2.0,P2.1,P2.2l 1602液晶:RS 接P2.5,R/W接P2.6,E 接P2.7,数据口接P0l 12864液晶:RS 接P2.5,R/2 接P2.6,E 接P2.7,数据口接P0,PSB 接2.4,RST接2.2l 独立按键:分别接P3.2,P3.3,P3.4l 矩阵键盘: 接P1 口l 时钟芯片DS1302:SCLK接P1.6,RST 接P1.7,I/O接P3.5 l 储存芯片AT24C02:SCLK 接P1.5,SDA 接P3.6l 通讯芯片MAX232:接P3.0,P3.1l USB 转串口芯片PL2303:接P3.0,P3.1(注:这里有跳线帽进行选择)l 红外解码芯片:接P3.3l PS2 接口:连接P1.6,P1.7l SD 卡座接口:接P1.0,P1.1,P1.2,P1.3l AD/DA 芯片PCF8591T:接P1.5,P3.6l 继电器,蜂鸣器,步进电机,直流电机:最好用P1 口控制。

单片机IO控制ULN2003 芯片去驱动以上器件。

下面是简单的介绍下intrins.h 这个C51的内部函数:_crol_ 字符循环左移_cror_ 字符循环移_irol_ 整数循环左移_iror_ 整数循环移_lrol_ 长整数循环左移_lror_ 长整数循环移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JBC 指令函数名:_crol_,_irol_,_lrol_原型:unsigned char _crol_(unsigned char val,unsigned char n);unsigned int _irol_(unsigned int val,unsigned char n); unsigned int _lrol_(unsigned int val,unsigned char n);_crol_ _irol_ _lrol_ val n 8051 RLA”功能:,,以位形式将左移位,该函数与指令相关函数名:_cror_,_iror_,_lror_原型:unsigned char _cror_(unsigned char val,unsigned char n); 东流电子unsigned int _iror_(unsigned int val,unsigned char n); unsigned int _lror_(unsigned int val,unsigned char n);_cror_ _iror_ _lror_ val n 8051 RRA”功能:,,以位形式将移位,该函数与指令相关比如:P0 = _cror_(P0, 1);就是字符循环1位。

c51串口通信原理

c51串口通信原理

c51串口通信原理
C51串口通信的原理主要涉及到串行数据传输的方式。

在C51中,串口通
信可以通过串行数据通信模式进行,包括单工通信、半双工通信和全双工通信。

在串行通信中,数据是一位一位地进行传输的。

每一位数据在传输中都占据一个固定的时间长度。

串行通信的一个主要优点是传输线少,占用引脚资源少,成本低,适合远距离传送。

具体到C51的串口通信,其工作方式可以分为方式0、方式1等。

在方式0时,串行口作为同步移位寄存器的输入输出方式,数据由RXD()引脚输
入或输出,同步移位脉冲由TXD()引脚输出。

发送和接收均为8位数据,低位在先,高位在后。

在方式1时,它是10位数据的异步通信口,TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式包括1位起始位、8位数据位和1位停止位。

此外,关于串行口的波特率,PCON中有一位SMOD与串行口工作有关:SMOD()波特率倍增位。

在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。

复位时,SMOD=0。

以上是C51串口通信的基本原理,如需了解更多信息,建议咨询专业技术人员或查阅C51相关的专业书籍。

51单片机两机串口通信c程序

51单片机两机串口通信c程序

51单片机两机串口通信c程序(共2页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--发送机#include<>#define uchar unsigned char#define uint unsigned intuchar code xuehao1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code xuehao2[]={2,0,0,9,0,5,4,0,2,1,5,3};void send(uchar dat){SBUF=dat; //将待发送的数据写入发送缓存器中while(TI==0) //只要接收中断标志位; //空操作TI=0; //为了接收下一帧数据,需用软件降RI清零}void delay(){uchar m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}void main(){uchar i;TMOD=0x20;//定时器T1工作于方式2SCON=0x50;//串口工作方式1PCON=0x00;//电源控制寄存器,波特率不加倍TH1=0xfd; //波特率为 9600()TL1=0xfd;TR1=1; //启动定时器T1while(1){for(i=0;i<12;i++){send(xuehao1[xuehao2[i]]); //发送数据idelay();delay();delay();delay();}}}接受机#include<>#define uchar unsigned char#define uint unsigned intuchar receive(){uchar dat;while(RI==0); //只要接收中断标志位RI=0; //为了接收下一帧数据,需用软件降RI清零dat=SBUF; // 将接收缓存器中的数据存于datreturn dat; //将接收到的数据返回}void main(){TMOD=0x20;//定时器T1工作于方式2SCON=0x50;//串口工作方式1PCON=0x00;TH1=0xfd; //波特率为 9600()TL1=0xfd;TR1=1; //启动定时器T1REN=1; //允许接收while(1){P0=receive();}}。

简单实用C51单片机烧录程序串口安装步骤与教程

简单实用C51单片机烧录程序串口安装步骤与教程

C51单片机烧录程序串口安装步骤
一、根据烧写程序的下载线不同,可以根据下载口型号到淘宝搜出。

(直接输
入某型号下载线即可。

淘宝中宝贝详情有附送下载包,可查找到资料下载网址和安装包,可以点击链接下载。


二、(如果不知型号可以打开下载线外壳查看里面芯片型号)这样有针对性
的下载无论XP还是win7的都可以快速解决效果非常好省去很多步奏
三、双击图标照常安装即可。

(装完后重启。

以下为win7示范!)
四、重启后,插上下载线后查看右下角安装图标点击进入后点击查看状态。

五、点击跳过windows update 获得驱动程序软件
六、弹出这窗口点是。

七、安装成功,关闭
八、打开控制面板主页,点击设备管理
九、安装成功
十、配合下载软件即可
希望能帮到需要帮助的朋友。

单片机端采用C51实现_单个单片机与PC串口通信任务

单片机端采用C51实现_单个单片机与PC串口通信任务

单个单片机与PC串口通信:1)测试通信状态先在文本框中输入字符串“Hello”,单击“测试”按钮,将字符串“Hello”发送到单片机,若PC与单片机通信正常,在PC程序的文本框中显示字符串“OK!”,否则显示字符串“ERROR!”。

2)循环计数单击“开始”按钮,文本框中数字从0开始累加,0、1、2、3…,并将此数发送到单片机的显示器上显示;当累加到10时,回到0重新开始累加,依次循环;任何时候,单击“停止”按钮,PC程序中和单片机显示器都停止累加,再单击“开始”按钮,接着停下的数继续累加。

3)控制指示灯在单片机继电器接线端子的2个通道上分别接上2个指示灯,在PC程序画面上选择指示灯号,如1号灯,单击画面“打开”按钮,单片机上1号灯亮,同时蜂鸣器响;单击画面“关闭”按钮,1号灯灭,蜂鸣器停止响;同样控制2号灯的亮灭(蜂鸣器同时动作)。

#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit a1=P0^0;sbit a2=P0^1;sbit a3=P0^2;sbit a4=P0^3;sbit a5=P0^4;sbit a6=P0^5;sbit a7=P0^6;sbit a8=P0^7;void delay(uint x) //延时{uchar i;while(x--)for(i=0;i<120;i++);}void uart(void) interrupt 4 //把接收到的数据写入ucReceiveData(){TI=0;RI=0;if(SBUF=='h')//接收到'H'字符发送'OK'{SBUF='o';while(TI==0);TI=0;}else if(SBUF=='1') a1=0;else if(SBUF=='2') a1=1;else if(SBUF=='3') a2=0;else if(SBUF=='4') a2=1;else if(SBUF=='5') a3=0;else if(SBUF=='6') a3=1;else if(SBUF=='7') a4=0;else if(SBUF=='8') a4=1;else if(SBUF=='9') a5=0;else if(SBUF=='a') a5=1;else if(SBUF=='b') a6=0;else if(SBUF=='c') a6=1;else if(SBUF=='d') a7=0;else if(SBUF=='e') a7=1;else if(SBUF=='f') a8=0;else if(SBUF=='g') a8=1;}void main(void){uchar b=0xfe;TMOD=0x20; //定时器1--方式2IE=0x12; //中断控制设置,串口、T2开中断PCON=0x80; //电源控制SCON=0x50; //方式1TL1=0xFa;//0xF4; //12MHZ晶振,波特率为4800 0xf3 4800TH1=0xFa;//0xF4; //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfdTR1=1; //启动定时ES=1;EA=1;// P0=0;while(1){P1=0;}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Drawing.Drawing2D;namespace lsd1{public partial class Form1 : Form {int a = 0,b=2,c=0,d=0;int m;int sur = 0;int su = 0, sf = 0;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){this.skinEngine1.SkinFile = "WaveColor1.ssk";GraphicsPath gp = new GraphicsPath();gp.AddEllipse(pictureBox1.ClientRectangle);Region region = new Region(gp);pictureBox1.Region = region;pictureBox2.Region = region;pictureBox3.Region = region;pictureBox4.Region = region;pictureBox5.Region = region;pictureBox6.Region = region;pictureBox7.Region = region;pictureBox8.Region = region;gp.Dispose();region.Dispose();label5.ForeColor = Color.Red;timer1.Enabled = false;timer2.Enabled = false;}private void button8_Click(object sender, EventArgs e) {if (textBox1.Text != ""){if (serialPort1.IsOpen){pictureBox1.BackColor = Color.DarkSeaGreen; serialPort1.Write("2");pictureBox2.BackColor = Color.RosyBrown; serialPort1.Write("4");pictureBox3.BackColor = Color.DarkSeaGreen; serialPort1.Write("6");pictureBox4.BackColor = Color.RosyBrown; serialPort1.Write("8");pictureBox5.BackColor = Color.DarkSeaGreen; serialPort1.Write("a");pictureBox6.BackColor = Color.RosyBrown; serialPort1.Write("c");pictureBox7.BackColor = Color.DarkSeaGreen; serialPort1.Write("e");pictureBox8.BackColor = Color.RosyBrown; serialPort1.Write("g");sur = 20;serialPort1.Close();button8.Text = "打开串口";textBox1.Enabled = true;}else{sur = 0;serialPort1.PortName = comboBox1.Text;serialPort1.BaudRate =Convert.ToInt32(comboBox2.Text);try{serialPort1.Open();button8.Text = "关闭串口";textBox1.Enabled = false;comboBox2.Enabled = false;comboBox1.Enabled = false;timer1.Interval =Convert.ToInt32(textBox1.Text);timer1.Enabled = true;timer2.Enabled = true;}catch{MessageBox.Show("串口打开失败了!\n\n可能是串口已补占用。

C51单片机和电脑串口通信电路图与源码

C51单片机和电脑串口通信电路图与源码

C51单片机和电脑串口通信电路图与源码51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。

进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。

这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

串口通讯的硬件电路如上图所示在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。

通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。

这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。

本串口软件在本网站可以找到软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。

串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

串口实验的源程序如下所示:;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序;采用MAX232专用芯片作RS232/TTL电平转换.;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平);就发送一个16进制的AF字符ORG 0000HMOV SCON,#50H;设置成串口1方式MOV TMOD,#20H;波特率发生器T1工作在模式2上MOV PCON,#80H;波特率翻倍为2400x2=4800BPSMOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)SETB TR1;启动定时器T1;以上完成通讯初始化设置WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待ACALL DELAY10;延时10毫秒消触点抖动JB P3.6,WRIT;去除干扰信号JNB P3.6,$;等待按键松开MOV A,#0AFH;将16进制的字符AF发送到串口去MOV SBUF,A;将AF通过串口发送出去AJMP WRIT;10毫秒延时子程序DELAY10:MOV R4,#20D2:MOV R5,#248DJNZ R5,$DJNZ R4,D2RETEND;=============两机串口通讯程序(主机)===================== ; 功能: 使用串行中断,接收数据并显示; 硬件环境: 自制单片机实验板; 软件环境: 伟福 V3.20; Create date: 2004_07_26; First Modify: 2004_07_26; second Modify:; Last Modify: 2004_07_26; Author: Sujiande;;===========预定义===================LED0 EQU 40H ;预定义数码管LED1 EQU 41H ;预定义数码管LED2 EQU 42H ;预定义数码管LED3 EQU 43H ;预定义数码管LED4 EQU 44H ;预定义数码管LED5 EQU 45H ;预定义数码管LED6 EQU 46H ;预定义数码管LED7 EQU 47H ;预定义数码管SDA BIT P0.1 ; 定义数据线引脚定义SCL BIT P0.0 ; 定义时钟线引脚定义;---------------------------ORG 0000H ;主程序入口AJMP MAIN ;跳转到主程序ORG 0100H ;主程序在ROM中存放位置;===============主程序=====================MAIN:MOV LED0,#00H ;赋初值MOV LED1,#00HMOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭MOV LED3,#16MOV LED4,#16MOV LED5,#16MOV LED6,#16MOV LED7,#16;--------------------;MOV DPTR,#TABLE ; 赋显示代码首地址MOV R1,#00H ; 给R1赋初值00HACALL DISPLAY ; 调显示子程序MOV SP, #30H ; 给堆栈指针赋初值;--------------------------; 使用定时器1,作为波特率发生器,设定波特率=9600,; 定时器初值为:FAH; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,; RB8=0,TI=0,RI=0 即0101 0000B; 波特率加倍;-----------------------------MOV TMOD,#20H ;设置定时器1,工作方式2MOV TH1,#0FAh ;赋初值: FAMOV TL1,#0FAh ;赋初值: FAMOV SCON, #50h ;设置串行口控制寄存器MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X) SETB TR1 ;启动定时;*****************主程序结束************************ LP8: MOV A,R1 ;将1的数据装到A中;-----------------------MOV SBUF,A ;将A的数据送到缓冲区JNB TI,$ ;等待数据发送完毕CLR TI ;清发送中断标志;-----------------------INC R1CJNE R1,#99,LP3MOV R1,#00HLP3: ACALL SEPERATE ;调拆分程序ACALL DISPLAY ;调显示子程序ACALL DELAY_1S ;调延时子程序AJMP LP8;=================拆分程序===================== SEPERATE: ANL A,#0Fh ;与操作得到个位数据MOV LED0,A ;个位送LED0MOV A,R1ANL A,#0F0H ;与操作得到十位数据SWAP AMOV LED1,A ;十位送LED1RET;===============显示子程序===================== DISPLAY:MOV DPTR,#TABLE ; 赋显示代码首地址MOV A,LED0 ;查表数据送AMOVC A,@A+DPTR ;查表,得到显示代码ACALL SHIFT ;调移位子程序MOV A,LED1MOVC A,@A+DPTRACALL SHIFTMOV A,LED2MOVC A,@A+DPTRACALL SHIFTMOV A,LED3MOVC A,@A+DPTRACALL SHIFTMOV A,LED4MOVC A,@A+DPTRACALL SHIFTMOV A,LED5MOVC A,@A+DPTRACALL SHIFTMOV A,LED6MOVC A,@A+DPTRACALL SHIFTMOV A,LED7MOVC A,@A+DPTRACALL SHIFTRET;---------显示代码表---------TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,-;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值MOV R0,#8 ; 循环8次CLR C ;清进位标志CLR SCL ;时钟线,先钳位为0LP2: RLC AMOV SDA,CNOPNOPSETB SCLNOPNOPCLR SCLNOPNOPDJNZ R0,LP2POP A ; 出栈恢复A值RET;=============延时子程序===============DELAY_1S:MOV R7,#0ffHLOOP7: MOV R6,#0ffHLOOP6: NOPNOPNOPNOPNOPNOPDJNZ R6,LOOP6DJNZ R7,LOOP7RET;------------------------------END;=============两机串口通讯程序(从机)===================== ; 功能: 使用串行中断,接收数据并显示; 硬件环境: 自制单片机实验板; 软件环境: 伟福 V3.20; Create date: 2004_07_26; First Modify: 2004_07_26; second Modify:; Last Modify: 2004_07_26; Author: Sujiande;===========预定义===================LED0 EQU 40H ;预定义数码管LED1 EQU 41H ;预定义数码管LED2 EQU 42H ;预定义数码管LED3 EQU 43H ;预定义数码管LED4 EQU 44H ;预定义数码管LED5 EQU 45H ;预定义数码管LED6 EQU 46H ;预定义数码管LED7 EQU 47H ;预定义数码管SDA BIT P0.1 ; 定义数据线引脚定义SCL BIT P0.0 ; 定义时钟线引脚定义;---------------------------ORG 0000H ;主程序入口AJMP MAIN ;跳转到主程序ORG 0023H ;中断入口地址AJMP S_INT ;跳转到中断程序ORG 0100H ;主程序在ROM中存放位置;==============主程序========================MAIN:MOV LED0,#00H ;赋初值MOV LED1,#00HMOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭MOV LED4,#16MOV LED5,#16MOV LED6,#16MOV LED7,#16;------------------------------MOV DPTR,#TABLE ; 赋显示代码首地址ACALL DISPLAY ; 调显示子程序MOV SP, #30H ; 给堆栈指针赋初值;--------------------------------------------; 使用定时器1,作为波特率发生器,设定波特率=9600,; 定时器初值为:FAH; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,; RB8=0,TI=0,RI=0 即0101 0000B; 波特率加倍;---------------------------------------------MOV TMOD,#20H ;设置定时器1,工作方式2MOV TH1,#0FAh ;赋初值: FAMOV TL1,#0FAh ;赋初值: FAMOV SCON, #50h ;设置串行口控制寄存器MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X);---------------------------------------SETB EA ; 启动总中断SETB ES ; 启动串行中断SETB TR1 ;启动定时AJMP $ ; 等待中断;*****************主程序结束************************;===============中断服务程序============================= S_INT:MOV R1, SBUF ;将缓冲区的数据送到R1ACALL SEPERATE ;调拆分程序ACALL DISPLAY ;调显示子程序CLR RI ;清接收中断标志RETI ;中断返回;=================拆分程序===================== SEPERATE: MOV A,R1ANL A,#0Fh ;与操作得到个位数据MOV LED0,A ;个位送LED0MOV A,R1ANL A,#0F0H ;与操作得到十位数据SWAP A ;MOV LED1,A ;十位送LED1RET;===============显示子程序======================MOV A,LED0 ;查表数据送AMOVC A,@A+DPTR ;查表,得到显示代码ACALL SHIFT ;调移位子程序MOV A,LED1MOVC A,@A+DPTRACALL SHIFTMOV A,LED2MOVC A,@A+DPTRACALL SHIFTMOV A,LED3MOVC A,@A+DPTRACALL SHIFTMOV A,LED4MOVC A,@A+DPTRACALL SHIFTMOV A,LED5MOVC A,@A+DPTRACALL SHIFTMOV A,LED6MOVC A,@A+DPTRACALL SHIFTMOV A,LED7MOVC A,@A+DPTRACALL SHIFTRET;---------显示代码表---------TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,-;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值MOV R0,#8 ; 循环8次CLR C ;清进位标志CLR SCL ;时钟线,先钳位为0LP2: RLC AMOV SDA,CNOPNOPSETB SCLNOPNOPCLR SCLNOPNOPDJNZ R0,LP2POP A ; 出栈恢复A值RET;=============延时子程序=============== DELAY_1S:MOV R7,#0ffHLOOP7: MOV R6,#0ffHLOOP6: NOPNOPNOPNOPNOPNOPDJNZ R6,LOOP6DJNZ R7,LOOP7RET;------------------------------END。

C51单片机串口通讯通用模块代码(可用于操作系统串口通讯)

C51单片机串口通讯通用模块代码(可用于操作系统串口通讯)

C51单片机串口通讯通用模块代码(可用于操作系统串口通讯)#include#include "UART1.h"#include "commdriver.h"//当前适用于C51//可以根据具体CPU型号,修改宏定义和串口初始化代码就可以#define CPU_XTAL 22118400 //CPU频率#define FUNCTION_NULL 0 //没有定义函数#define COM_TI TI //发送中断寄存器#define COM_TI0() {TI = 0;} //发送中断寄存器清零#define COM_TI1() {TI = 1;} //发送中断寄存器置一( 强行置一触发发送中断)#define COM_TI_SBUF(dat) {SBUF = dat;} //发送数据到硬件缓冲区#define COM_TI_End() {return;} //发送结束处理函数#define COM_RI RI //接收中断寄存器#define COM_RI0() {RI = 0;} //接收中断寄存器清零#define COM_RI1() {RI = 1;} //接收中断寄存器置一#define COM_RI_SBUF(dat) {dat = SBUF;} //提取接收硬件缓冲区数据#define COM_TI_FLAG COM_TI //发送中断标志寄存器(非中断发送方式使用)#define COM_TI_FLAG0() COM_TI0() //发送中断标志寄存器清零(非中断发送方式使用)void (*COM1RevEvent)(unsigned char dat); //数据接收事件#define LenTxBuf 30 //发送缓冲区长度#define LenRxBuf 1 //接收缓冲区长度volatile unsigned char TxBuf1[LenTxBuf],RxBuf1[LenRxBuf]; //收发缓冲区实体volatile unsigned char *inTxBuf1,*outTxBuf1,*inRxBuf1,*outRxBuf1; //收发缓冲区读写指针volatile unsigned char TIflag1=1;//Note:It must be 1. //发送缓冲区为空标志//*********************#define _TxBuf TxBuf1#define _RxBuf RxBuf1#define _inTxBuf inTxBuf1#define _outTxBuf outTxBuf1#define _inRxBuf inRxBuf1#define _outRxBuf outRxBuf1#define _TIflag TIflag1/*************函数声明****************/#define _COMRevEvent COM1RevEvent //串口接收事件#define _USART_IRQ void USART1_IRQHandler(void) interrupt 4 //串口中断服务程序#define _COM_Buffer_Init void COM1_Buffer_Init(void) //串口缓冲区初始化#define _COM_Open void COM1_Open(unsigned int baudrate,void (*revevent)(unsigned char dat)) // 串口初始化#define _COM_Close void COM1_Close(void) //关闭串口#define _COM_GetOneByte unsigned charCOM1_GetOneByte(unsigned char *ch) //获取一个字节#define _COM_GetPChar unsigned char COM1_GetPChar(unsigned char *ch,unsigned char len) //获取指定长度字节数组#define _COM_RxByte unsigned char COM1_RxByte(void) //获取接收字节个数//********缓冲区中断方式发送(安全性高)#define _COM_SendOneByte unsigned char COM1_SendOneByte(unsigned char one_byte) // 发送一个字节#define _COM_SendPChar void COM1_SendPChar(unsigned char *P,unsigned char Len) //发送定长字节数组#define _COM_SendString void COM1_SendString(unsigned char *P) //发送字符串//********非缓冲区中断方式发送#define _COM_PrintOneByte void COM1_PrintOneByte(unsigned char c) // 发送一个字节#define _COM_PrintPChar void COM1_PrintPChar(unsigned char *buf,unsigned int len) //发送定长字节数组#define _COM_PrintString void COM1_PrintString(unsigned char *P) //发送字符串//*************内部引用模型函数(外部不关心,移植时修改后面函数名,要与上面对应的外部声明的函数名一致)*******************#define COM_GetOneByte_(ptr) COM1_GetOneByte(ptr) //与上面获取一个字节的函数对应#define COM_SendOneByte_(dat) COM1_SendOneByte(dat) //与上面发送一个字节的函数对应#define COM_PrintOneByte_(dat) COM1_PrintOneByte(dat) //与上面发送一个字节的函数对应//*********************函数模型定义区(不需要修改)*****************/****************************函数模型:void USART_IRQHandler(void)函数功能:串口中断服务程序入口参数:无返回值:无修改者:修改时间:修改内容简要:***************************/_USART_IRQ //串口1中断{volatile unsigned char *t;if(COM_RI){COM_RI0(); //清接收标记if(_COMRevEvent != FUNCTION_NULL) //自定义接收事件{COM_RI_SBUF(*_inRxBuf);_COMRevEvent(*_inRxBuf);}else{t = _inRxBuf;t++;if(t == (_RxBuf + LenRxBuf)) t = _RxBuf;if(t != _outRxBuf) //RxBuf No Full{COM_RI_SBUF(*_inRxBuf);_inRxBuf = t;}}}if(COM_TI){COM_TI0();if(_inTxBuf == _outTxBuf) {_TIflag = 1;COM_TI_End();};//TxBuf1 EmptyCOM_TI_SBUF(*_outTxBuf); _outTxBuf++;if(_outTxBuf == (_TxBuf+LenTxBuf)) _outTxBuf = _TxBuf;}}/****************************函数模型:void COM1_Buffer_Init(void)函数功能:串口1缓冲区初始化入口参数:无返回值:无修改者:修改时间:修改内容简要:***************************/_COM_Buffer_Init{_inTxBuf = _TxBuf;_outTxBuf = _TxBuf;_inRxBuf = _RxBuf;_outRxBuf = _RxBuf;}/****************************函数模型:void COM_Open(unsigned int baudrate,void (*revevent)(unsigned char dat))函数功能:系统串口初始化入口参数: unsigned int baudrate:串口波特率返回值:无修改者:修改时间:修改内容简要:***************************/_COM_Open{//定时器1做波特率发生器TI = 0; /* clear transmit interrupt */TR1 = 0; /* stop timer 1 */ET1 = 0; /* disable timer 1 interrupt */PCON |= 0x80; /* 0x80=SMOD: set serial baudrate doubler */ TMOD &= ~0xF0; /* clear timer 1 mode bits */TMOD |= 0x20; /* put timer 1 into MODE 2 */TH1 = (unsigned char) (256 - (CPU_XTAL / (16L * 12L * baudrate)));TR1 = 1; /* start timer 1 *///设置串口1模式SM0 = 0; SM1 = 1; /* serial port MODE 1 */SM2 = 0;REN = 1; /* enable serial receiver */RI = 0; /* clear receiver interrupt */TI = 0; /* clear transmit interrupt */ES = 1; /* enable serial interrupts */PS = 1; /* set serial interrupts to low priority */_COMRevEvent = revevent;}/****************************函数模型:void COM1_Close(void)函数功能:关闭系统串口入口参数:无返回值:无修改者:修改时间:修改内容简要:***************************/_COM_Close{}/****************************函数模型:unsigned char COM1_GetOneByte(unsigned char *ch)函数功能:获取一个字节入口参数:unsigned char *ch:接收字节指针返回值: unsigned char *ch:接收字节指针unsigned char :获取状态;0:成功,1:失败(缓冲区为空)修改者:修改时间:修改内容简要:***************************/_COM_GetOneByte{if(_inRxBuf == _outRxBuf) {return 0;}; //RxBuf Empty*ch = *_outRxBuf; _outRxBuf++;if(_outRxBuf==_RxBuf+LenRxBuf) _outRxBuf = _RxBuf;return 1;}/****************************函数模型:unsigned char COM_GetPChar(unsigned char *ch,unsigned char len)函数功能:获取指定长度字节数组入口参数: unsigned char *ch:接收字节数组指针unsigned char len:接收字节个数返回值: unsigned char *ch:接收字节数组指针unsigned char:实际接收字节个数修改者:修改时间:修改内容简要:***************************/_COM_GetPChar{unsigned char i = 0;do{len--;if(!COM_GetOneByte_(ch)) break;i++;ch++;}while(len);return i;}/****************************函数模型:unsigned char COM_RxByte(void)函数功能:获取接收缓冲区有效字节个数入口参数:无返回值: unsigned char:接收缓冲区有效字节个数修改者:修改时间:修改内容简要:***************************/_COM_RxByte{if(_inRxBuf>=_outRxBuf) return (_inRxBuf-_outRxBuf);else return LenRxBuf-(_outRxBuf-_inRxBuf);}/****************************函数模型:unsigned char COM_SendOneByte(unsigned char one_byte)函数功能:发送一个字节入口参数: unsigned char one_byte:发送的字节返回值:unsigned char:发送状态,0:成功,1:失败(缓冲区满)修改者:修改时间:修改内容简要:***************************/_COM_SendOneByte{volatile unsigned char *t;if(_TIflag){_TIflag = 0;COM_TI1();}t = _inTxBuf;t++;if(t == _TxBuf + LenTxBuf) t = _TxBuf;if(t == _outTxBuf) {return 1;};//TxBuf Full*_inTxBuf = one_byte;_inTxBuf = t;return 0;}/****************************函数模型:void COM_SendPChar(unsigned char *P,unsigned char Len)函数功能:发送定长字节数组入口参数: unsigned char *P:字节数组指针unsigned char Len:发送长度返回值:无修改者:修改时间:修改内容简要:***************************/_COM_SendPChar{while(Len){//while(COM1_SendOneByte(*P)); //发送失败,继续发送,知道发送成功COM_SendOneByte_(*P);P++;Len--;}}/****************************函数模型:void COM_SendString(unsigned char *P)函数功能:发送字符串入口参数: unsigned char *P:字符串指针返回值:无修改者:修改时间:修改内容简要:***************************/_COM_SendString{while(*P){COM_SendOneByte_(*P);P++;}}//**************** 非缓冲区中断方式发送/****************************函数模型:void COM_PrintOneByte(unsigned char c)函数功能:发送一个字节入口参数: unsigned char one_byte:发送的字节返回值:无修改者:修改时间:修改内容简要:***************************/_COM_PrintOneByte{COM_TI_FLAG0();COM_TI_SBUF(c); //发送数据while(!COM_TI_FLAG) ; //等待发送结束}/****************************函数模型:void COM_PrintPChar(unsigned char *buf,unsigned int len)函数功能:发送定长字节数组入口参数: unsigned char *P:字节数组指针unsigned char Len:发送长度返回值:无修改者:修改时间:修改内容简要:***************************/_COM_PrintPChar{while(len){COM_PrintOneByte_(*buf);buf ++;len--;}}/****************************函数模型:void COM_PrintString(unsigned char *P) 函数功能:发送字符串入口参数: unsigned char *P:字符串指针返回值:无修改者:修改时间:修改内容简要:***************************/_COM_PrintString{while(*P){COM_PrintOneByte_(*P);P++;}}。

51单片机的串口通信程序(C语言)

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; //显示内容按位取反}}。

单片机C51串口接收(中断)和发送例程

单片机C51串口接收(中断)和发送例程

单片机C51串口接收(中断)和发送例程/gszhy/article/details/82088282012//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的#include <reg51.h>#include <string.h>#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 ucvrTMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reloadPCON |= 0x80; //SMOD=1;TH1 = 0xF4; //Baud:4800 fosc=11.0592MHzIE |= 0x90; //Enable Serial InterruptTR1 = 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; //取数标志清0send_string_com(inbuf1,INBUF_LEN);}}//-------------------------------------------------------------------//crc:校验子程序//开始地址指针ADRS,需校验字节数量SUM//校验结果:高位CRCH,低位CRCL//-------------------------------------------------------------------void CCRC(unsigned char *ADRS,unsigned char SUM){unsigned int data CRC; //校验码unsigned char data i;unsigned char data j;CRC=0xFFFF;for (i=0;i<SUM;i++){CRC^=*ADRS;for (j=0;j<8;j++){if ((CRC & 1)==1){CRC>>=1;CRC^=0xA001;}else{CRC>>=1;}ADRS++;}CRCH=CRC&0xFF;CRCL=CRC>>8;}//-------------------------------------------------------------------//其他程序调用例子//校验数组前6位//-------------------------------------------------------------------//。

C51串口通信示例

C51串口通信示例

//串口中断服务程序 void UART0_ISR() interrupt 4 { uchar i; if(RI) //串口接收中断 { i=SBUF; RI=0; if(RXFRMOK==0) //如果 RXFRMOK=1 表示前台程序未处理完当前数据,丢弃 { if(RXAAOK) //接收到 0xAA { RXBUF[Rx_P]=i; if((Rx_P>3)&&(RXBUF[Rx_P-3]==0xCC)&&(RXBUF[Rx_P-2]==0x33)&&(RXBUF[Rx_P-1]==0xC3)&&(RXBUF[RX_P]= =0x3C)) {RXFRMOK=1; RXAAOK=0;} Rx_P++;} if(!RXAAOK&&(i==0xaa)) { RXAAOK=1; Rx_P=0;}} } if(TI) { TI=0; TI0FLAG=1;} //对于 DSP、ARM 等带 FRAME_ERROR 中断的 CPU,此处应添加对 FSTA 寄存器的清零 }
400 018 9008
{
if(RXFRMOK) if(RXBUF[0]==0x78) {} if(RXBUF[0]==0x7C) {} RXFRMOK=0; }
//前台主程序检查串口有没有收到 HMI 数据 //触控按钮 //触摸屏拼音输入结束 //处理完毕,清除消息
北京迪文科技有限公司
ห้องสมุดไป่ตู้- 41 -

专业.诚信.成功
迪文 HMI 用户软件开发指南
Ver3.0
附录 4 C51 串口通信程序参考
#define uchar unsigned char #define uint unsigned int bit RXAAOK; //串口接收到 0xAA 帧头 bit RXFRMOK;//串口收到一个有效数据帧 bit TI0FLAG;//传回给主程序的串口发送 1 个字节结束(TI)标记 uchar RXBUF[32]; uchar Rx_P; //串口接收缓冲区,存储时把 0xAA 帧头去掉,HMI 应答不是固定格式的都有长度返回,故 //不需要记录长度 //串口接收,保存数据位置

C51串口通讯

C51串口通讯

#include <C8051F060.h> // SFR declarations#include <stdio.h>//----------------------------------------------------------------------------- // 16-bit SFR Definitions for 'F06x//-----------------------------------------------------------------------------sfr16 RCAP2 = 0xCA; // Timer2 capture/reloadsfr16 TMR2 = 0xCC; // Timer2//----------------------------------------------------------------------------- // Global Constants//-----------------------------------------------------------------------------#define BAUDRATE 4800 // Baud rate of UART in bps#define BAUDRATE1 9600#define SYSTEMCLOCK 3062500//----------------------------------------------------------------------------- // Function Prototypes//-----------------------------------------------------------------------------void OSCILLATOR_Init (void);void PORT_Init (void);void UART0_Init (void);void UART1_Init (void);//----------------------------------------------------------------------------- // Global Variables//-----------------------------------------------------------------------------#define UART0_BUFFERSIZE 8unsigned char UART0_Buffer[UART0_BUFFERSIZE];unsigned char UART0_Buffer_Size = 0;unsigned char UART0_Input_First = 0;unsigned char UART0_Output_First = 0;unsigned char isfirstdata,k,k1;unsigned char UART0_R_Buf[UART0_BUFFERSIZE];unsigned char check1(void);unsigned char check2(void);void SendMesUart0(unsigned char adr);void delay(unsigned long tim){while (tim!=0)tim--;}unsigned char u1bufre[8];unsigned char u1REpnt;unsigned char u1buftr[8];unsigned char u1TRpnt;unsigned char resend;unsigned char resend1;//----------------------------------------------------------------------------- // main() Routine//-----------------------------------------------------------------------------void main (void){SFRPAGE = CONFIG_PAGE;WDTCN = 0xDE; // Disable watchdog timerWDTCN = 0xAD;OSCILLATOR_Init (); // Initialize oscillatorPORT_Init (); // Initialize crossbar and GPIOUART0_Init (); // Initialize UART0UART1_Init ();EA = 1;u1buftr[0]=0x31;u1buftr[1]=0x32;u1buftr[2]=0x33;u1buftr[3]=0x34;u1buftr[4]=0x35;u1buftr[5]=0x36;u1buftr[6]=0x37;u1buftr[7]=check1();SFRPAGE = UART0_PAGE;// SendMesUart0(0x80);while (1){// SFRPAGE = UART0_PAGE;// SendMesUart0(0x01);if (resend==1){SFRPAGE = UART0_PAGE;// SendMesUart0(0x80);resend=0;}if (resend1==1){resend1=0;SFRPAGE = UART1_PAGE;u1TRpnt=0;SBUF1=u1buftr[u1TRpnt];u1TRpnt++;}}}//----------------------------------------------------------------------------- // Initialization Subroutines//-----------------------------------------------------------------------------//----------------------------------------------------------------------------- // OSCILLATOR_Init//----------------------------------------------------------------------------- //// Return Value : None// Parameters : None//// This function initializes the system clock to use an external 22.1184MHz// crystal.////----------------------------------------------------------------------------- void OSCILLATOR_Init (void){char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR pageSFRPAGE = CONFIG_PAGE; // Set SFR page// OSCICN = 0x80; // Set internal oscillator to run// at its slowest frequencySFRPAGE = SFRPAGE_SAVE; // Restore SFRPAGE}//----------------------------------------------------------------------------- // PORT_Init//-----------------------------------------------------------------------------//----------------------------------------------------------------------------- void PORT_Init (void){char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR pageSFRPAGE = CONFIG_PAGE; // Set SFR pageSFRPAGE = CONFIG_PAGE;XBR0 = 0x04;XBR2 = 0xC4;P0MDOUT = 0x05;SFRPAGE = SFRPAGE_SAVE; // Restore SFR page}//----------------------------------------------------------------------------- // UART0_Init Variable baud rate, Timer 2, 3//----------------------------------------------------------------------------- void UART0_Init (void){char SFRPAGE_SAVE;SFRPAGE_SAVE = SFRPAGE; // Preserve SFRPAGESFRPAGE = TMR2_PAGE;//TMR2CF = 0x08; //19200//RCAP2L = 0xF6;//RCAP2H = 0xFF;TMR2CN = 0x00; // Timer in 16-bit auto-reload up timer mode TMR2CF = 0x08; // SYSCLK is time base; no output;// up count onlyRCAP2 = - ((long) SYSTEMCLOCK/BAUDRATE/16);TMR2 = RCAP2;TR2= 1; // Start Timer2SFRPAGE = UART0_PAGE;SCON0 = 0xD0;SCON0 &= 0xFC; //将TI0和RI0清零SSTA0 = 0x5; // Clear all flags; DISable baud rate doubler Use Timer2 as RX and TX baud rate source;ES0 = 1;SFRPAGE = SFRPAGE_SAVE; // Restore SFRPAGE}//----------------------------------------------------------------------------- // Interrupt Service Routines//-----------------------------------------------------------------------------//----------------------------------------------------------------------------- // UART0_Interrupt//----------------------------------------------------------------------------- //// This routine is invoked whenever a character is entered or displayed on the // Hyperterminal.////-----------------------------------------------------------------------------void UART0_Interrupt (void) interrupt 4{SFRPAGE=0x00;if(SCON0&0x01){UART0_R_Buf[k1]=SBUF0;k1++;SCON0&=0xfe;if(k1>=8){k1=0;if (UART0_R_Buf[7]==check2()){//if (UART0_R_Buf[5]=0xff){u1buftr[0]=UART0_R_Buf[0];u1buftr[1]=UART0_R_Buf[1];u1buftr[2]=UART0_R_Buf[2];u1buftr[3]=UART0_R_Buf[3];u1buftr[4]=UART0_R_Buf[4];u1buftr[5]=UART0_R_Buf[5];u1buftr[6]=UART0_R_Buf[6];u1buftr[7]=UART0_R_Buf[7];resend1=1;// return error from io resend}}}}if(SCON0&0x02){if(isfirstdata){SCON0&=0xf7;isfirstdata=0;k1=0;}if(k<8){SBUF0=u1bufre[k];k++;}else{k=0;}SCON0&=0xfd;}}void UART1_Init (void){char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR pageSFRPAGE = UART1_PAGE;SCON1 = 0x10; // SCON1: mode 0, 8-bit UART, enable RXSFRPAGE = TIMER01_PAGE;TMOD &= ~0xF0;TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reloadif (SYSTEMCLOCK/BAUDRATE1/2/256 < 1) {TH1 = -(SYSTEMCLOCK/BAUDRATE1/2);CKCON |= 0x10; // T1M = 1; SCA1:0 = xx} else if (SYSTEMCLOCK/BAUDRATE1/2/256 < 4) {TH1 = -(SYSTEMCLOCK/BAUDRATE1/2/4);CKCON &= ~0x13; // Clear all T1 related bits CKCON |= 0x01; // T1M = 0; SCA1:0 = 01} else if (SYSTEMCLOCK/BAUDRATE1/2/256 < 12) {TH1 = -(SYSTEMCLOCK/BAUDRATE1/2/12);CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00} else {TH1 = -(SYSTEMCLOCK/BAUDRATE1/2/48);CKCON &= ~0x13; // Clear all T1 related bits CKCON |= 0x02; // T1M = 0; SCA1:0 = 10}TL1 = TH1; // init Timer1TR1 = 1; // START Timer1EIE2 = 0x40; // Enable UART1 interrupts SFRPAGE = UART1_PAGE;SFRPAGE = SFRPAGE_SAVE; // Restore SFR page}void UART1_Interrupt (void) interrupt 20{SFRPAGE = UART1_PAGE;if(RI1){ ///if (u1REpnt<8){u1bufre[u1REpnt]=SBUF1;u1REpnt++;RI1=0;}if (u1REpnt>=8){u1REpnt=0;RI1=0;if (u1bufre[7]==check1()){SFRPAGE = UART0_PAGE;k=1;SendMesUart0(u1bufre[0] & 0x0f); //SBUF0=u1bufre[0];}else{u1buftr[0]=u1bufre[0];u1buftr[5]=0xff;u1buftr[6]=0xff;u1buftr[7]=0xff;}}} ///if(TI1){SFRPAGE=1;if (u1TRpnt<8){SBUF1=u1buftr[u1TRpnt];u1TRpnt++;}else{u1TRpnt=0;}TI1=0;}}void SendMesUart0(unsigned char adr){SFRPAGE=0x00;SCON0|=0x08;isfirstdata=1;。

C51很简洁易懂的RS458串口通信接收发送程序

C51很简洁易懂的RS458串口通信接收发送程序
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定义485的使能脚
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
SBUF=SenData;//发送数据
delay(50);
}
else
{
RS485E=0;//接收状态
}
}
}பைடு நூலகம்
/****************************************************
串口中断程序
******************************************************/
SendFlag = 1;
}
}
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3;// //baud*2 /*波特率4800、数据位8、停止位1。效验位无(12M)

51单片机串口通信试验汇编程序

51单片机串口通信试验汇编程序

51单片机串口通信试验汇编程序(今天是硬生生的把它给抠出来了):PC 通过串口助手向单片机系统传递命令和数据:以A5开始,以5A结束;中间是数据,长度不一,要求把数据部分用led灯显示出来;并且要求循环显示;//This is my x_Ed program code//we use it as the pc communicated with the mcu//At the same time,we want to see the result by LCD;STFLAG BIT 00H //收到起始码标志,1为收到起始码EDFLAG BIT 01H //到结束码标志,1为收到结束码TMFLAG BIT 02H //定时时间到标志,1为定时时间到ORG 0000HSJMP Initialize//主程序入口(初始化程序)ORG 000BH //定时器0入口LJMP TIMER0 //定时器0中断ORG 0023H //串口中断程序的入口地址LJMP Transfer //跳转到接受中断入口///////////////////////////////////////////////////////////////ORG 0050HInitialize:MOV SP,#70H //设置堆栈MOV TMOD,#21H //T1工作方式2 T0工作MOV TH1,#0FDH //波特率9600MOV TL1,#0FDH //波特率9600 自动重装载MOV TH0,#3CH //定时50msMOV TL0,#0BH //定时50msMOV SCON,#50H //串口工作方式1MOV R6,#00H //定时次数计数器20一秒MOV R5,#00H //接收数据长度计数器MOV R4,#00H //控制输出控制寄存器MOV R0,#30H //数据存储地址MOV R1,#30H //控制输出的数据缓存CLR STFLAG //清起始标志位CLR EDFLAG //清结束标志位CLR TMFLAG //清时钟标志位SETB PS //提高串口中断的优先级SETB TR1 //打开定时器1;SETB ES //打开串口中断允许位SETB ET0 //定时器0中断允许位SETB EA //打开全局中断允许位/////////////////等待接受命令//////////////////////// Main: JB STFLAG,NODE3 //已经收到起始位SJMP Main //未起始继续等待NODE3: JB EDFLAG,NODE4 //已经收到结束位SJMP Main //未结束继续等待NODE4: SETB TR0 //打开定时器0;NODE5: JB TMFLAG,OUTPUTSJMP NODE5///////////////////等待上位机传送数据并记录//////// Transfer: CLR ESMOV A,SBUFCJNE A,#0A5H,NODE0 //检测到起始位SETB STFLAGSJMP JIEDIANNODE0: CJNE A,#05AH,NODE1 //检测到结束位SETB EDFLAGMOV DPH,R5MOV R4,DPHclr ES //打开串口中断允许位SJMP ret00NODE1: MOV @R0,A //既非起始码,又非结束码,则为数据INC R0INC R5MOV SBUF,#055HJIEDIAN: CLR TICLR RISETB ESret00: RETITIMER0: CLR TR0MOV TH0,#3CHMOV TL0,#0B0HINC R6CJNE R6,#20,RTNSETB TMFLAGMOV R6,#00HRTN: SETB TR0RETIOUTPUT: CLR TR0clr TMFLAGMOV A,@R1MOV P1,AINC R1DJNZ R4,NODE4MOV R1,#30HCLR TMFLAGMOV DPH,R5MOV R4,DPHSJMP NODE4RETIEND。

C51很简洁易懂的RS232串口通信接收程序

C51很简洁易懂的RS232串口通信接收程序

/****************************************************************************** **** 标题: RS232串口通信试验(接收) **** 1.通过本例程了解串口的基本原理及使用,理解并掌握对串口进行初始化**** 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机发给单片机,* 如果在字符数字发送框发0X00蜂铃器就会叫,如果发0xff蜂铃器就停叫。

** * * 请学员认真消化本例程,学会用C语言操作串口******************************************************************************** ****/#include <REG52.H>#include <stdio.h>sbit BEEP = P1^4;unsigned char b;void main (void) {SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD|= 0x20; //定时器工作方式2PCON|= 0x80;//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。

效验位无(11.0592)TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。

效验位无(12M)TL1 = 0xF3;TR1 = 1;ES = 1; //开串口中断EA = 1; // 开总中断BEEP=1;// IE = 0x0;while(1){if (RI) //RI接受中断标志{ RI=0; //清除RI接受中断标志b=SBUF; //SUBF接受/发送缓冲器}BEEP=b;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
} while (k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
read_flag= 1 ;
}
}
}
}
main()
{
init_serialcomm(); //初始化串口
whil8;i++)
{
else
{
count3++;
inbuf1[count3]=ch;
if(count3< INBUF_LEN- 1)
{
checksum += ch;
}
if ( (count3==(INBUF_LEN- 1 )) && (ch==checksum) )
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}
//向串口发送字符串函数
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
//SBUF=ch;
if (ch== 0xFE )
{
count3= 0 ;
inbuf1[count3]=ch;
checksum= ch ; //校验和
}
send_string_com(inbuf1,INBUF_LEN);
}
}
}
第三字节: 00-07 数码管的显示位置
第四字节: 00-09 数码管显示数值
第五字节: 00-FF 前四字节的校验和
发送 FE 01 01 03 03 为第一个数码管显示3
**********************************************************************************************/
unsigned char code seg[]={0,1,2,3,4,5,6,7};
unsigned char inbuf1[INBUF_LEN]; //存储信息
unsigned char dat[8];
unsigned char checksum,count3,i;
bit read_flag= 0 ;
/**********************************************************************************************
命令格式: FE 01 01 03 03 共5字节
第一字节:FE 为帧头
第二字节: 00-FF 地址码
PCON |= 0x00 ; //SMOD=0;
TH1 = 0xFD ; //Baud:9600 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
}
//向串口发送一个字符 函数
#include <reg51.h>
#include <string.h>
#define INBUF_LEN 5 //数据长度
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9十个数字码
P0=0x00;
P2=seg[i];
P0=EL[dat[i]];
}
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
dat[inbuf1[2]] = inbuf1[3]; //把收到的数据写入存储区
read_flag= 0 ; //取数标志清0
相关文档
最新文档