单片机串口接收命令的程序怎样写

单片机串口接收命令的程序怎样写,第1张

先初宴盯始化串口,再接收桐祥笑数局含据就可以了。比如:

#include<reg51.h>

#define uchar unsigned char

uchar rec

bit flag=0

void uart() interrupt 4

{

if(RI)

{

RI=0

rec=SBUF

flag=1

}

}

main()

{

TMOD=0x20

TH1=0xfd

TL1=0xfd

SCON=0x50

TR1=1

ES=1

EA=1

while(1)

{

if(flag)

{

case ....

case ....

default:break

}

}

}

retc=0//变量 retc 归零

retc=retc<<1// 变量银乎向左移位

if(SDA==1)retc=retc+1// 这句话,其实就是接收一个位,因为上一句向左移位了,所以山樱这句话就要接收下一位了,向锋唯悉左移位,最低位为 0,如果接收管脚为 0,那么就是0,如果为1,那么rec变量应该最低位变为1,程序里 +1,其实就是变最低为 1,以完成数据位的正确接收

给你一个PIC写的接收红外遥控器的程序。

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

//mcu: PIC16F883

//author:

//data:

//ver: 1.0

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

#include <pic.h>

#include <pic16f887.h>

#include "main.h"

// 函数声明部份

void interrupt IRQ_TEST(void)

void fun_intset(void)

void set_port(void)

void fun_timerset(void)

void delay_10us(void)

void delay_130us(void)

void test_remote(void)

// 主函数

void main()

{

set_port()

fun_timerset()

fun_intset()

delay_10ms()

ram_ini()

GIE=1

while(1)

{

asm("clrwd")

test_remote()

}

}

//端口I/O定义子程序

void set_port()

{

ANSEL =0X00//porta io port

ANSELH=0X00 //portb io port

//TRISX BIT=1, PORTX AS INPUT

TRISA = 0x0F//模搭RA0-RA3 INPUT ,RA4-RA5 OUTPUT

TRISB = 0x07//RB0 PASS0, RB1-RB2 INPUT ,RB3-RB6 OUTPUT

TRISC = 0x0F

// TRISC = 0x03//RC0-RC1 INPUT,RC5-RC6 OUTPUT , RC3 RC4 EEPROM SCL SDA

PORTC=0

PORTA=0XFF

// WPUB=0XFF

PORTB=0X07

}

//中断子程序

void interrupt IRQ_TEST(void)

{

if(T0IF) //Timer0中断服务子程序

{

TMR0=0xce

T0IF=0

timer_100us++ //100us

}

if(INTF==1)

{

INTF=0

timer_rec=timer_100us

timer_100us=0

flag_rec_remote=1

}

}

//定时器0初始化设置子程序

void fun_timerset()

{

//Timer0初始化设置

PSA=0//Timer0 使用预分频器

//Timer0选择分频率为1:2

PS0=0PS1=0PS2=0

//内部时钟定时方式,定时时旦行拿间:200uS,误差:0uS

T0CS=0

// TMR0=0x9b

TMR0=0xce//100us

}

/*

//定时器2初始化设置子程序

void fun_timer2set()

{

//Timer2初始化设置

//timer2使带颤用预分频率1:1

T2CKPS0=0T2CKPS1=0

//timer2使用后分频率1:1

TOUTPS0=0

TOUTPS1=0

TOUTPS2=0

TOUTPS3=0

//定时器2定时时间为:200uS,误差:0uS

TMR2=0x38

TMR2ON=1

}

*/

//中断允许设置子程序

void fun_intset()

{

T0IE=1//Tiemr0中断允许

INTEDG=0//RB0 FALLAGE INTERRUPT

INTE=1

INTF=0

}

void ram_ini(void)

{

}

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

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

void delay_10us(void)

{

NOP

NOP

NOP

NOP

NOP

NOP

}

void delay_130us(void)

{

uchar i

for(i=0i<13i++)

{

NOP

NOP

NOP

}

}

void delay_10ms(void)

{

unsigned int i

for(i=0i<1000i++)

{

NOP

NOP

NOP

NOP

NOP

}

}

void test_remote(void)

{

uchar rec_ok,i

if(flag_rec_remote==1)

{

flag_rec_remote=0

// remote_buf[rec_byte]=timer_rec //test use

// rec_byte++//test use

// return //test use

if(flag_rec_head==0)

{

if(timer_rec>=90&&timer_rec<=140) //135

{

flag_rec_head=1

rec_byte=0

rec_bit=0

rec_buf=0

return

}

}

else

{

if(timer_rec>=8&&timer_rec<=12) //11.2

{

rec_buf=(rec_buf>>1)

rec_buf=rec_buf&0x7f

}

else if(timer_rec>=18&&timer_rec<=22) //22

{

rec_buf=(rec_buf>>1)

rec_buf=rec_buf|0x80

}

else if(timer_rec>=90&&timer_rec<=140)

{

flag_rec_head=1

rec_byte=0

rec_bit=0

rec_buf=0

return

}

else

{

flag_rec_head=0

rec_byte=0

rec_bit=0

rec_buf=0

return

}

}

if(flag_rec_head==1)

{

rec_bit++

if(rec_bit==8)

{

remote_buf[rec_byte]=rec_buf

rec_byte++

rec_bit=0

if(rec_byte==4)

{

NOP

NOP

NOP

NOP

rec_byte=0

rec_bit=0

rec_buf=0

flag_rec_head=0

}

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12380085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存