单片机IO口模拟串口程序发送接收

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*************************************************************** *

在单片机上模拟了一个串口,使用P2.1作为发送端* 把单片机中存放的数据

通过P2.1作为串口TXD发送出去

***************************************************************/#incl ude #include #include typedef unsigned char uchar; int i; uchar code info[] = { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5 5,0x55 }; sbit newTXD = P2^1;//模拟串口的发送端设为P2.1 void UartInit() { SCON = 0x50; // SCON: serail mode 1, 8-bit UART TMOD |= 0x21; // T0工作在方式1,十六位定时 PCON |= 0x80; // SMOD=1; TH0 = 0xFE; // 定时器0初始值,延时417us,目的是令模

拟串口的波特率为2400bps fosc=11.0592MHz TL0 = 0x7F; // 定时器0

初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=11.0592MHz // TH0 = 0xFD; // 定时器0初始值,延时417us,目的是令模拟串口的波特

率为2400bps fosc=18.432MHz // TL0 = 0x7F; // 定时器0初始值,延

时417us,目的是令模拟串口的波特率为2400bps fosc=18.432MHz } void WaitTF0(void) { while(!TF0); TF0=0; TH0=0xFE; // 定时器重

装初值fosc=11.0592MHz TL0=0x7F; // 定时器重装初值fosc=11.0592MHz // TH0 = 0xFD; // 定时器重装初值fosc=18.432MHz // TL0 = 0x7F; // 定时器重装初值fosc=18.432MHz } void WByte(uchar input) { //发送启始位 uchar

j=8; TR0=1; newTXD=(bit)0; WaitTF0(); //发送8位数据位

while(j--) { newTXD=(bit)(input&0x01); //先传低位WaitTF0(); input=input>>1; } //发送校验位(无) //发送结束位newTXD=(bit)1; WaitTF0(); TR0=0; } void Sendata() { for(i=0;i #include #include typedef unsigned char uchar ; //这里用来切换晶振频率,支持11.0592MHz和18.432MHz //#define F18_432 #define F11_0592 uchar tmpbuf2[64]={0}; //用来作为模拟串口接收数据的缓存struct { uchar recv :6 ;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中 uchar send :6 ;//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口}tmpbuf2_point={0,0}; sbit newRXD=P3^2 ;//模拟串口的接收端设为P3.2 void UartInit() { SCON=0x50 ;// SCON: serail mode 1, 8-bit UART TMOD|=0x21 ;// TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将TH1送到TL1);T0工作在方式1,十六位定时 PCON|=0x80 ;// SMOD=1; #ifdef F11_0592

TH1=0xE8 ;// Baud:2400 fosc=11.0592MHz 2400bps为从串口接收数据的速率TL1=0xE8 ;// 计数器初始值,fosc=11.0592MHz 因为TH1一直往TL1送,所以这个初值的意义不大 TH0=0xFF ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz #endif#ifdef F18_432 TH1=0xD8 ; // Baud:2400 fosc=18.432MHz 2400bps为从串口接收数据的速率 TL1=0xD8 ; // 计数器初始值,fosc=18.432MHz 因为TH1一直往TL1送,所以这个初值的意义不大TH0=0xFF ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz TL0=0x60 ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz #endif

IE|=0x81 ;// 中断允许总控制位EA=1;使能外部中断0 TF0=0 ; IT0=1 ;// 设置外部中断0为边沿触发方式 TR1=1 ;// 启动TIMER1,用于产生波特率} void WaitTF0(void) { while(!TF0); TF0=0 ; #ifdef F11_0592 TH0=0xFF ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz #endif#ifdef F18_432 TH0=0xFF ; // 定时器重装初值 fosc=18.432MHz TL0=0x60 ; // 定时器重装初值fosc=18.432MHz #endif} //接收一个字符uchar RByte() { uchar Output=0 ; uchar i=8 ; TR0=1 ; //启动Timer0 #ifdef F11_0592 TH0=0xFF ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值模拟串口的波特率为

相关文档
最新文档