51系列串口通讯例程.doc
文本预览下载声明
51系列串口通讯例程.rar serial.c,
//?题目:串口初始化C代码? ??
//?要求:? ??
//?1.波特率1200bps,无奇偶校验,停止位1,数据位8? ??
//?2.定时器T1做波特率发生器? ?????
//?软件模拟测试说明:? ??
//?1.这个测试采用查询方式进行串口通讯? ??
//?2.将软件仿真环境的晶震设为11.0592?MHz? ??
//?3.软件模拟全速运行,?观察波特率是1200bps? ??
//?4.在串口1中输入数字或字母,可观察到通讯是否有误。? ??????
//#pragma?src? ?????
#include?REG51.H? ?????
//串口初始化? ??
void?serial_init(void)???
{???
???//ET1??=?0;?????//CLR???0ABH??????;禁止T1中断? ??
???TMOD?=?0x20;??//MOV???89H,#20H??;timer?1?mode?2:?8-Bit?reload(定时器T1?模式2:?8位自动初值重装)? ??
???TH1??=?0xE8;??//MOV???8DH,#0E8H? ??
???TL1??=?0xE8;??//MOV???8BH,#0E8H?;1200bps,?11.059? ??
???TR1??=?1;?????//SETB??8EH???????;启动定时器1? ??
???SCON?=?0x50;??//?mode?1:?10-bit?UART,?enable?receiver(模式1:?10位异步发送/接收,?使能接收允许位)
???//SM1??=?1;?????//?????? ??????;串行口?模式1? ??
???//SM0??=?0;? ??
???//REN??=?1;?????//????????????????;允许串行中断接收? ?
???SM2??=?1;?????//SETB??O9DH??????;收到有效的停止位时才将RI置1?
???ES???=?1;?????//SETB??0ACH??????;允许串行中断?? ??
???EA???=?1;?????//SETB??0AFH??????;总中断开? ??
}???
//中断方式处理串口数据? ??
void?serial(void)?interrupt?4?using?1???
{???
????if(RI)???
????{???
???????//?RI?=?0;? ??
??????//?串口接收,?采用临时缓冲? ??
????}???
#if?0? ??
???if(TI)???
???{???
??????//?TI?=?0;? ??
??????//?串口发送,?没有必要使用中断方式? ??
???}???
#endif? ??
}???
//?查询方式接收串口数据? ??
unsigned?char?getchar(void)???
{???
???while(!RI);//?没有收到串口数据则一直等待? ??
???RI=0;???
???return?SBUF;???
}???
//?查询方式发送串口数据? ??
void?putchar(unsigned?char?ch)???
{???
???SBUF=ch;???
???while(!TI);???
???TI=0;???
}???
code?unsigned?char?HEX_TAB?[]=0123456789ABCDEF;???
void?puthex(unsigned?char?ch)???
{???
???unsigned?char?i,j;???
???i=ch4;???
???j=ch0x0f;???
???putchar(HEX_TAB[i]);???
???putchar(HEX_TAB[j]);???
}???
51系列串口通讯例程.rar test.c
//?采用查询方式进行串口通讯的例子? ??
//?采用这种方式的弊端:?? ??
//?1.如果对方没有发送数据,则本机无限等待,而不能做其它事情? ??
//?2.如果对方发送数据而本机正做其它事情,那么有可能丢失数据。?
//?因此实际上串口接收常采用中断方式,串口发送则不需要。? ??
#include?REG51.H? ??
extern?void?serial_init(void);???
extern?unsigned?char?getchar(void);???
extern?void?putchar(unsigned?char?ch);???
extern?void?puthex(unsign
显示全部