///////////////////////////////////////////////////////////
// 设计题目 : 基于51单片机的串口通信
// 功能 :
// 说明 : 晶振用12M,
///////////////////////////////////////////////////////////
#include <reg51h> // 12M 晶振
#define uchar unsigned char
#define uint unsigned int
///////////////////////////////////////////////////////////
// Name : 串口发送函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
void send(uchar x)
{
SBUF=x; // 将数据放到缓冲区,发送
while(!TI); // 等待发送完成
TI=0; // 清标志位
}
///////////////////////////////////////////////////////////
// Name : 初始化函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
void init(void)
{
TMOD=0x20; // T1工作在方式2,自动重载
TH1=0xe6;
TL1=0xe6; // 设置波特率为1200
SM0=0;
SM1=1; // 串口方式1
TR1=1; // 打开定时器1
}
///////////////////////////////////////////////////////////
// Name : 主函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
void main(void)
{
uchar i;
init(); // 初始化
while(1)
{
for(i=0; i<10; i++)
{ send(i); }
}
}
单片机定时发送字串给PC机
#include < reg52h >
#include < intrinsh >
#include < stdioh >
#define uchar unsigned char
#define uint unsigned int
/
延时函数
/
void delay(int ms)
{
uchar i;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/
主程序
/
main()
{
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //定时器1为模式2,8-bit 自动装载方式
PCON=0x00; //波特率不倍增
TL1=0xfd;
TH1=0xfd; //波特率9600
TI=1; //TI 置1,以发送第一个字节
TR1=1; //启动定时器 T1
while(1)
{
printf (" 真诚与各位单片机高手切磋学习\n"); //向PC机发送数据
delay(500);
printf (" welcome to >
要求用什么语言?
------------------------------
网友“星心晨梦”的回答,是可以满足题目要求的。
我实验了,是成功的,没有任何错误。
楼主应该检查自己的电路、串口设置等等。
------------------------------
网友“星心晨梦”的回答,篇幅稍稍长了一些。
缩减一半就可以正常工作了,可读性更好一些。
建议看看下面的。
------------------------------
#include <AT89X51h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
uchar idata trdata1[] = {
'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0,0x00};
uchar idata trdata2[] = {
'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0,0x00};
uchar idata trdata3[] = {
'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0,0x00};
uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;
//---------------------------------------------------
void UART_Init(void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式为1,允许接收
TMOD = 0x20; // T1 定时方式2
TH1 = 0xfd; //波特率 9600bps @ fosc = 110592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断
EA = 1; //开总中断
}
//---------------------------------------------------
void main()
{
UART_Init();
Rx_p = 0;
Rx_p = 2;
while(1) {
if (Rx_p != 0) {
TX_p = Rx_p;//字符串1 2 3
Tx_i = 0; //字符指针
Rx_p = 0; //清零
Rx_i = 0;
TI = 1; //启动发送中断
} }
}
//---------------------------------------------------
void Uart_INT(void) interrupt 4 //串口中断函数
{
uchar Tcv = 0;
if(RI) { //接收?
RI = 0; //标志位清零
RxBuf[Rx_i] = SBUF;
if((RxBuf[Rx_i - 1] == 'g') && (RxBuf[Rx_i] == 'o')) Rx_p = 1;
if((RxBuf[Rx_i - 2] == 'w') && (RxBuf[Rx_i - 1] == 'h') && (RxBuf[Rx_i] == 'o')) Rx_p = 2;
if((RxBuf[Rx_i - 3] == 'h') && (RxBuf[Rx_i - 2] == 'o') && (RxBuf[Rx_i - 1] == 'm') && (RxBuf[Rx_i] == 'e')) Rx_p = 3;
P1 = Rx_p; //在P1显示收到的信息
Rx_i++;
Rx_i %= 5;
}
else {
TI = 0;
if (TX_p == 1) Tcv = trdata1[Tx_i]; //取来待发字符
if (TX_p == 2) Tcv = trdata2[Tx_i];
if (TX_p == 3) Tcv = trdata3[Tx_i];
if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就发送
}
}
//---------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//E51Proc
//Easy 51Pro编程器主程序,负责通讯,管理编程 *** 作
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <E51Proh>
BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
UINT nAddress;//ROM中地址计数
UINT nTimeOut;//超时计数
ProWork pw;//编程器一般 *** 作
void Delay_us(BYTE nUs)//微秒级延时<255us
{
TH0=0;
TL0=0;
TR0=1;
while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
{
}
TR0=0;
}
void Delay_ms(UINT nMs)//豪秒级的延时<65535ms
{
UINT n=0;
TR0=1;
while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
{
TH0=0;
TL0=20;
while(TH0<4)
{
}
n++;
}
TR0=0;
}
BOOL WaitComm()//等待上位机的命令,18字节
{
BYTE n=0;
RI=0;
while(!RI){}//等待第一个字节
ComBuf[n]=SBUF;
RI=0;
n++;
for(n;n<=17;n++)
{
nTimeOut=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>10000)//后17个字节都有超时限制
return 0;
}
ComBuf[n]=SBUF;
RI=0;
}
return 1;
}
BOOL WaitResp()//等待上位机回应,1字节,有超时限制
{
nTimeOut=0;
RI=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>50000)
{
return 0;
}
}
RI=0;
ComBuf[0]=SBUF;
return 1;
}
BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
{
BYTE n;
RI=0;
for(n=0;n<=17;n++)
{
nTimeOut=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>10000)
{
return 0;
}
}
RI=0;
ComBuf[n]=SBUF;
}
return 1;
}
void SendData()//发送数据或回应 *** 作完成,18字节
{
BYTE n=0;
for(n;n<=17;n++)
{
TI=0;
SBUF=ComBuf[n];
while(!TI){}
TI=0;
}
}
void SendResp()//回应上位机1个字节,在写器件函数中使用
{
TI=0;
SBUF=ComBuf[0];
while(!TI){}
TI=0;
}
void SetVpp5V()//设置Vpp为5v
{
P3_4=0;
P3_3=0;
}
void SetVpp0V()//设置Vpp为0v
{
P3_3=0;
P3_4=1;
}
void SetVpp12V()//设置Vpp为12v
{
P3_4=0;
P3_3=1;
}
void RstPro()//编程器复位
{
pwfpProOver();//直接编程结束
SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
}
void ReadSign()//读特征字
{
pwfpReadSign();
SendData();//通知上位机,送出读出器件特征字
}
void Erase()//擦除器件
{
pwfpErase();
SendData();//通知上位机,擦除了器件
}
void Write()//写器件
{
BYTE n;
pwfpInitPro();//编程前的准备工作
SendData();//回应上位机表示进入写器件状态,可以发来数据
while(1)
{
if(WaitData())//如果等待数据成功
{
if(ComBuf[0]==0x07)//判断是否继续写
{
for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
{
if(!pwfpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
{
pwfpProOver();//出错了就结束编程
ComBuf[0]=0xff;
SendResp();//回应上位机一个字节,表示写数据出错了
WaitData();//等待上位机的回应后就结束
return;
}
nAddress++;//下一个单元
}
ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
SendResp();
}
else if(ComBuf[0]==0x00)//写器件结束
break;
else//可能是通讯出错了
{
pwfpProOver();
return;
}
}
else//等待数据失败
{
pwfpProOver();
return;
}
}
pwfpProOver();//编程结束后的工作
Delay_ms(50);//延时等待上位机写线程结束
ComBuf[0]=0;//通知上位机编程器进入就绪状态
SendData();
}
void Read()//读器件
{
BYTE n;
pwfpInitPro();//先设置成编程状态
SendData();//回应上位机表示进入读状态
while(1)
{
if(WaitResp())//等待上位机回应1个字节
{
if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
{
break;
}
else if(ComBuf[0]==0xff)//0xff表示重发
{
nAddress=nAddress-0x0010;
}
for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
{
ComBuf[n]=pwfpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
nAddress++;//下一个单元
}
ComBuf[0]=6;//向上位机发送读出的数据块
SendData();
}
else
break;//等待回应失败
}
pwfpProOver();// *** 作结束设置为运行状态
ComBuf[0]=0;//通知上位机编程器进入就绪状态
SendData();
}
void Lock()//写锁定位
{
pwfpLock();
SendData();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//所支持的FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////////////////////////////
extern void PreparePro00();//FID=00:AT89C51编程器
extern void PreparePro01();//FID=01:AT89C2051编程器
extern void PreparePro02();//FID=02:AT89S51编程器
void main()
{
SP=0x60;
SetVpp5V();//先初始化Vpp为5v
SCON=0x00;
TCON=0x00;
//PCON=0x00;//波特率2
IE=0x00;
//TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
// 0 0 1 0 0 0 0 1
TMOD=0x21;//T0用于延时程序
TH1=0xff;
TL1=0xff;//波特率288002,注意PCON
//SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
// 0 1 0 1 0 0 0 0
SCON=0x50;
TR1=1;
Delay_ms(1000);//延时1秒后编程器自举
ComBuf[0]=0;
SendData();
while(1)//串口通讯采用查询方式
{
if(!WaitComm())//如果超时,通讯出错
{
Delay_ms(500);
ComBuf[0]=0;//让编程器复位,使编程器就绪
}
switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
{
case 0://at89c51编程器
PreparePro00();
break;
case 1://at89c2051编程器
PreparePro01();
break;
case 2://at89s51编程器
PreparePro02();
break;
//case 3:支持新器件时,请继续向下添加
// break;
//case 4:
// break;
default:
ComBuf[0]=0xff;
ComBuf[1]=0xff;//表示无效的 *** 作
break;
}
switch(ComBuf[0])//根据 *** 作ID跳到不同的 *** 作函数
{
case 0x00:
RstPro();//编程器复位
break;
case 0x01:
ReadSign();//读特征字
break;
case 0x02:
Erase();//擦除器件
break;
case 0x03:
Write();//写器件
break;
case 0x04:
Read();//读器件
break;
case 0x05:
Lock();//写锁定位
break;
default:
SendData();
break;
}
}
}
下面是stc串口测试程序,供你参考,协议你自己编把,按键需要软件做消抖处理,led简单,如果你不会写led就不要搞这个了
#include<reg51h>
#include<intrinsh>
sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,SRB8,S2TI,S2RI
sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
sfr S2BUF = 0x9B;
sfr AUXR = 0x8e;
sfr BRT = 0x9c;
sfr IAP_CONTR = 0xC7;
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sbit CR = 0xDE;
sbit MCU_Start_Led = P1^7;
sbit S2_Interrupt_Receive_Led = P1^4;
//unsigned char self_command_array[4] = {0x22,0x33,0x44,0x55};
#define Self_Define_ISP_Download_Command 0x22
#define RELOAD_COUNT 0xfb //18432MHz,12T,SMOD=0,9600bps
void serial_port_one_initial();
void send_UART_one(unsigned char);
void UART_one_Interrupt_Receive(void);
void serial_port_two_initial();
void send_UART_two(unsigned char);
void UART_two_Interrupt_Receive(void);
void soft_reset_to_ISP_Monitor(void);
void delay(void);
void display_MCU_Start_Led(void);
void send_PWM(void);
void main(void)
{
unsigned int array_point = 0;
unsigned char xdata Test_array_one[512] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,
0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,
0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,
0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,
0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,
0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,
0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,
0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,
0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,
0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,
0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0, 0x09, 0x08,
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
};
unsigned char i = 0;
serial_port_one_initial(); //串口1初始化
// serial_port_two_initial(); //串口2初始化
display_MCU_Start_Led(); //点亮发光二极管表示单片机开始工作
// send_UART_two(0x55); //串口2发送数据表示单片机串口正常工作
// send_UART_two(0xaa); //串口2发送数据表示单片机串口正常工作
/
for(array_point=0; array_point<512; array_point++)
{
send_UART_two(Test_array_one[array_point]);
}
/
send_UART_one(0x34); //串口1发送数据表示单片机串口正常工作
send_UART_one(0xa7); //串口1发送数据表示单片机串口正常工作
for(array_point=0; array_point<512; array_point++)
{
send_UART_one(Test_array_one[array_point]);
}
// send_PWM(); //6kHz PWM, 50% duty
while(1);
}
void serial_port_one_initial()
{
SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位
// TMOD = 0x21; //0011,0001 设置顶时器1为8位自动重装计数器
// TH1 = RELOAD_COUNT; //设置定时器1自动重装数
// TL1 = RELOAD_COUNT;
// TR1 = 1; //开定时器1
BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 1 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
ES = 1; //允许串口中断
EA = 1; //开总中断
}
void serial_port_two_initial()
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
S2CON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位,允许接收
BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 0 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
// ES = 1; //允许串口1中断
// ES2 = 1
IE2 = 0x01; //允许串口2中断,ES2=1
EA = 1; //开总中断
}
void send_UART_one(unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
}
void send_UART_two(unsigned char i)
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
unsigned char temp = 0;
// ES = 0; //关串口1中断
IE2 = 0x00; //关串口2中断,es2=0
// TI = 0; //清零串口1发送完成中断请求标志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志
// SBUF = i;
S2BUF = i;
// while(TI ==0); //等待发送完成
do
{
temp = S2CON;
temp = temp & 0x02;
}while(temp==0);
// TI = 0; //清零串口发送完成中断请求标志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志
// ES = 1; //允许串口1中断
// ES2 = 1
IE2 = 0x01; //允许串口2中断,ES2=1
}
void UART_one_Interrupt_Receive(void) interrupt 4
{
unsigned char k = 0;
if(RI==1)
{
RI = 0;
k = SBUF;
if(k==Self_Define_ISP_Download_Command) //是自定义下载命令
{
delay(); //延时1秒就足够了
delay(); //延时1秒就足够了
soft_reset_to_ISP_Monitor(); //软复位到系统ISP监控区
}
send_UART_one(k+1);
}
else
{
TI = 0;
}
}
void UART_two_Interrupt_Receive(void) interrupt 8
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
unsigned char k = 0;
k = S2CON ;
k = k & 0x01;
//if(S2RI==1)
if(k==1)
{
//RI = 0;
S2CON = S2CON & 0xFE; //1111,1110
S2_Interrupt_Receive_Led = 0;
k = S2BUF;
if(k==Self_Define_ISP_Download_Command) //是自定义下载命令
{
delay(); //延时1秒就足够了
delay(); //延时1秒就足够了
soft_reset_to_ISP_Monitor(); //软复位到系统ISP监控区
}
send_UART_two(k+1);
}
else
{
//TI = 0;
S2CON = S2CON & 0xFD; //1111,1101
}
}
void soft_reset_to_ISP_Monitor(void)
{
IAP_CONTR = 0x60; //0110,0000 软复位到系统ISP监控区
}
void delay(void)
{
unsigned int j = 0;
unsigned int g = 0;
for(j=0;j<5;j++)
{
for(g=0;g<60000;g++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void display_MCU_Start_Led(void)
{
//sbit MCU_Start_Led = P1^7;
unsigned char i = 0;
for(i=0;i<1;i++)
{
MCU_Start_Led = 0; //顶亮MCU开始工作指示灯
delay();
MCU_Start_Led = 1; //熄灭MCU开始工作指示灯
delay();
MCU_Start_Led = 0; //顶亮MCU开始工作指示灯
}
}
void send_PWM(void)
{
CMOD = 0x00; // CIDL - - - - CPS1 CPS0 ECF Setup PCA Timer
// CPS1 CPS0 = 00, Fosc/12 is PCA/PWM clock
// 18432000/12/256 = 6000
CL = 0x00;
CH = 0x00;
CCAP0L = 0x80; //Set the initial value same as CCAP0H
CCAP0H = 0x80; //50% Duty Cycle
CCAPM0 = 0x42; //0100,0010 Setup PCA module 0 in 8BIT PWM, P37
CR = 1; //启动 PCA/PWM 定时器
}
#include<reg51h>
void Send(unsigned char dat) //串口发送
{
SBUF=dat;
while(TI==0)
;
TI=0;
}
unsigned char Receive(void) //串口接收
{
unsigned char dat;
while(RI==0);
RI=0;
dat=SBUF;
Send(dat); //把接收的数据发送回去
return dat; //返回接收的数据
}
void main(void)
{
TMOD=0x20;
SCON=0x50;
PCON=0x00;
TH1=0xf4; //好像设置波特率为2400
TL1=0xf4;
TR1=1;
REN=1;
while(1)
{
P1=Receive(); //把接收的数据返回到P1口,
//我猜它是意思应该是点亮P1口对应的灯
} //相关寄存器 *** 作自己看手册
}
void delay(void) //延时函数没用到
{
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++);
}
以上就是关于求一个用C语言编写出单片机甲通过串口向PC机乙发送数据0~9的程序(晶振频率为12MHZ,波特率为1200b/s)全部的内容,包括:求一个用C语言编写出单片机甲通过串口向PC机乙发送数据0~9的程序(晶振频率为12MHZ,波特率为1200b/s)、用89C52单片机与PC串口通信,谁能帮忙写代码要用C语言编写的、51单片机与PC串口通信程序,求指导 ! 具体要求如下:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)