
sbit led1=P3^2// 接收 az , P.2 输出低电平, P3.3 输出高电平。
sbit led2=P3^3// 接收 aa , P.2 输出高电平, P3.3 输出低电平。
bit t,s
void main (void)
{
SCON = 0x50// REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20// 定时器工作方式2
PCON|= 0x80// 数据位8、停止位1。效验位无 (12M)
TH1 = 0xFD // TH1 = 0xFD波特率 9600
TL1 = 0xFD
TR1 = 1
ES = 1 // 开串口中断
EA = 1 // 开总中断
s=1
while(1)
{
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0
TI = 0
if(t==1)
{
if(SBUF=='z') {led1=0led2=1}
if(SBUF=='a') {led1=1led2=0}
s=1t=0
}
if(SBUF=='a' &&s==1) { t=1s=0}
}
}
首先不知道你用的什么单片机//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure
USART_InitTypeDef USART_InitStructure
NVIC_InitTypeDef NVIC_InitStructure
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE) //使能USART1,GPIOA时钟
USART_DeInit(USART1) //复位串口1
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9//PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure)//初始化PA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure) //初始化PA10
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound//一般设置为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx //收发模式
USART_Init(USART1, &USART_InitStructure)//初始化串口
#if EN_USART1_RX //如果使能了接收
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3 //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE //IRQ通道使能
NVIC_Init(&NVIC_InitStructure) //根据指定的参数初始化VIC寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)//开启中断
#endif
USART_Cmd(USART1, ENABLE) //使能串口
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter()
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1)//(USART1->DR) //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0//接收错误,重新开始
else USART_RX_STA|=0x8000 //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res
USART_RX_STA++
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0//接收数据错误,重新开始接收
}
}
}
}
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit()
#endif
}
#endif
Private Sub MSComm1_OnComm() '串口通信事件响应Dim cheng As Integer
cheng=1
If MSComm1.CommEvent = 2 Then '收到发送方送来的数据中止位信号
cheng=0
'......
End If
'......
End Sub
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)