当前位置:首页 >> 信息与通信 >>

C8051F单片机和PC机串口通讯程序


//-----------------------------------------------------------------//串口编程--接收 PC 发过来的字符串,回发字符串.发送期间中断控制 LED 灯闪烁 //采用外部晶振 22.1184MHz 使用定时器 1,方式 2 产生波特率,SMOD = 0 或者 1 //定时器初值 X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384) // //程序编写: 郭郭 //编程时间: 2005,12,30 //最后修改: 2005,12,31 //-----------------------------------------------------------------#include <C8051F020.h> sfr16 TMR3RL = 0x92; sfr16 TMR3 = 0x94; #define uchar unsigned char #define uint unsigned int //-----------------------------------------------------------------//参数设置区 //-----------------------------------------------------------------#define BAUDRATE 4800 #define CLKOUT 22118400 #define SMODVAL 0 #define PCONVAL 0x00 #define MAX_LEN 10 //全局变量 //-----------------------------------------------------------------sbit LED = P1^6; bit readFlag = 0; uchar readCounts = 0; uchar idata trdata[MAX_LEN]; //子函数声明 //-----------------------------------------------------------------void SYSCLK_Init(void); void PORT_Init(void); void UART0_Init(void); void Send_Char(uchar ch); void Send_String(uchar * str, uint len); void UART0_ISR(); void Timer3_Init(uint counts); void Timer3_ISR(void); //主函数 //-----------------------------------------------------------------//系统时钟初始化 //端口初始化 //串口 UART0 初始化 //发送单个字符 //发送一个字符串 //定时器 3 初始化 //定时器 3 中断服务程序 //串口中断服务程序,接收字符 //LED '1'亮 '0'灭 //读标志 //已经读取的字符个数,与 MAX_LEN 比较 //要接收/发送的字符串 //波特率 bps //外部晶振,修改也要修改 OSCXCN //SMOD 的值,修改请也修改 PCONVAL //PCON 的值,=0x00 时 SMOD0=0; =0x80 时 SMOD0=1 //每次接收/发送字符串的长度 //定时器 3 重装载寄存器 //定时器 3 计数器

#define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值

//------------------------------------------------------------------

//------------------------------------------------------------------

//------------------------------------------------------------------

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; for(i=0;i<256;i++); while(!(OSCXCN&0x80)); /采用外部晶振 22.1184MHz,不分频. 选型 OSCXCN=0110,0111 //等待>1ms //查询直到 XTLVLD=1,晶振稳定 //已经读取 //时钟初始化 //端口初始化 //串口初始化 //定时器初始化 //开全局中断 //禁止看门狗

OSCICN = 0x88;//切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 } //端口初始化 void PORT_Init(void) { XBR0 = 0x04; XBR1 = 0x00; XBR2 = 0x40; //交叉开关使能 P0MDOUT |= 0x03; //P0.0 为推拉方式输出,即 TX0,RX0 所在的端口 0000,0011 P1MDOUT |=0x40; //P1.6 为推拉方式输出,即 LED 所在的端口 0100,0000 } //串口初始化 void UART0_Init(void) { SCON0 = 0x50; TMOD = 0x20; //选择串口方式 1,波特率可变 SCON0=0101,0000 //选择 T1,方式 2,自动再装入 8 位计数器 //允许 UART0,RX,TX 连到 2 个端口引脚. XBR0=0000,0100

TH1 = (int)TXVAL;//T1 初值,根据波特率,时钟等计算. 0xF4, bps=4800bps TL1 = (int)TXVAL; ES0 = 1; TR1 = 1; TI0 = 1; TR0 = 1; } //定时器初始化 void Timer3_Init(uint counts) { TMR3CN = 0x00; TMR3RL = -counts; TMR3 = 0xffff; EIE2 |= 0x01; TMR3CN |= 0x04; } //发送单个字符 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); //清 TF3 LED = ~LED; } //UART0 中断服务程序. 接收字符 void UART0_ISR(void) interrupt 4 using 1 { uchar rxch; //送入缓冲区 //等待发送完毕 //软件清零 //禁止定时器 T3,清 TF3,采用 SYSCLK/12 为时基 //初始化重装载值 //设置为立即重装载 //T3 中断开启 //启动 T3 //UART0 中断开启 //启动定时器 T1 //声明 TX0 就绪,可以发送

PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1

if(RI0) { RI0 = 0; rxch = SBUF0;

//中断标志 RI0=1 数据完整接收 //软件清零 //读缓冲

if(readCounts>=MAX_LEN) { readCounts = 0; readFlag = 1; } trdata[readCounts] = rxch; readCounts++; } } //------------------------------------------------------------//程序结束 //-------------------------------------------------------------//存入数组,供发送

相关文章:
基于C8051F340的串口通信程序
基于C8051F340的串口通信程序_信息通信_工程科技_专业资料。采用C8051F340为主芯片的单片机串口通信C语言程序,收到数据后把收到的数据主动发送出来。#...
基于PC机与单片机串口通信下的数据采集
基于PC 机单片机串口通信下的数据 采集 摘要: 摘要:本文以 C8051F340 的低成本数据采集器设计为实例, 分析了 Windows 环境下串行通信的基础上,详解数据采集系统...
c51f310串口通讯程序
单片机串口通讯程序 3页 1下载券 C语言做串口通讯程序 2页 1下载券喜欢...<C8051F310.h> #include <stdio.h> sfr16 TMR3RL = 0x92; //定时器 3...
C8051F系列单片机下载方式及下载接口介绍-转载
C8051F系列单片机下载方式及下载接口介绍-转载_电子/...,弹出的对话框有 RS232 串行适配器和 USB 调试...JTAG 在线编程的 特征也改变了传统生产流程,将以前...
C8051F020单片机的RS485串行通信设计
C8051F020单片机的RS485串行通信设计_信息通信_工程科技_专业资料。C8051F020单片机的RS485串行通信设计C8051F020 单片机的 RS485 串行通信设计关键字:单片机 l 引...
C8051F020学习笔记-串口通信
C8051F020学习笔记-串口通信单片机的使用过程当中,有几个重点,一个是定时器和中断, F020 单片机的使用过程当中,有几个重点,一个是定时器和中断,一个是 DA,...
用纯C语言实现C8051F单片机的在线程序更新
用纯C语言实现C8051F单片机的在线程序更新_计算机软件及应用_IT/计算机_专业资料...2 整体思路 在线更新程序采用串口进行程序更新,分为主程序部分和 bootloader 部分...
用纯C语言实现C8051F单片机的在线程序更新
用纯C语言实现C8051F单片机的在线程序更新_计算机软件及应用_IT/计算机_专业资料...2 整体思路 在线更新程序采用串口进行程序更新,分为主程序部分和 bootloader 部分...
基于C8051F020主控的USB模块与PC机快速通讯的实现
PC 机之间进行高速, 可靠的通讯,目前较为流行的方式是采用通用串行通讯的方式....2 C8051F020 的简介和 USB100 模块的简介近年来,8051 系列单片机由于速度慢,...
2-计算机与单片机多机串口通信的设计
关键词:USB;CP2102;C8051F020;多机通信 1 引言 目前很多分布式测控系统是由 PC 机与多个单片机控制装置组成, 单片机采集现场的数 据和状态通过串行口传送到 PC...
更多相关标签: