stc12c5a60s2中文手册使用独立波特率发生器,串口1工作方式1,用串口助手接收到的都是乱码

#define&EVEN_PARITY&&&&&2&&&//偶校验 #define&MARK_PARITY&&&&&3&&&//标记校验 #define&SE_PARITY&&&&4&&&//空校验 #define&PARITYBIT&EVEN_PARITY #define&S2RI&&0x01 #define&S2TI&&0x02 #define&S2RB8&0x04 #define&S2TB8&0x08 sfr&AUXR&&=&0x8e; sfr&S2CON&=&0x9a; sfr&S2BUF&=&0x9b; sfr&BRT&&&=&0x9c; sfr&IE2&&&=&0 bit& void&SendData(char&dat); void&SendString(char&*s); void&main() { #if&(PARITYBIT&==&NONE_PARITY) &&&&S2CON&=&0x5a;&&&&&&&&&&&&&&&//8位可变波特率&(无校验位) #elif&(PARITYBIT&==&ODD_PARITY)&||&(PARITYBIT&==&EVEN_PARITY)&||&(PARITYBIT&==&MARK_PARITY) &&&&S2CON&=&0&&&&&&&&&&&&&&&//9位可变波特率,校验位初始为1 #elif&(PARITYBIT&==&SPACE_PARITY) &&&&S2CON&=&0xd5;&&&&&&&&&&&&&&&//9位可变波特率,校验位初始为0 #endif &&&&BRT&=&-(FOSC/32/BAUD);&&&&&&//设置独立波特率发生器的重载初值 &&&&AUXR&=&0x14;&&&&&&&&&&&&&&&&//独立波特率发生器工作在1T模式 &&&&IE2&=&0x01;&&&&&&&&&&&&&&&&&//使能串口2中断 &&&&EA&=&1;&&&&&&&&&&&&&&&&&&&&&//开总中断 &&&&SendString("STC12C5A60S2\r\n2&Test&!\r\n"); &&&&while(1); } void&Uart2()&interrupt&8&using&1 { &&&&if&(S2CON&&&S2RI) &&&&{ &&&&&&&&S2CON&&=&~S2RI;&&&&&&&&&//清除接收完成标志 &&&&&&&&P0&=&S2BUF;&&&&&&&&&&&&&//P0显示串口数据 &&&&&&&&P2&=&(S2CON&&&S2RB8);&&&//P2.2显示校验位 &&&&} &&&&if&(S2CON&&&S2TI) &&&&{ &&&&&&&&S2CON&&=&~S2TI;&&&&&&&&&//清除发送完成标志 &&&&&&&&busy&=&0; &&&&} } void&SendData(char&dat) { &&&&while&(busy);&&&&&&&&&&&&&&&//等待上个数据发送完成 &&&&A&=&&&&&&&&&&&&&&&&&&&//取得偶校验位P &&&&if&(P)&&&&&&&&&&&&&&&&&&&&&&&&//根据P来设置串口数据的校验位 &&&&{ #if&(PARITYBIT&==&ODD_PARITY) &&&&&&&&S2CON&&=&~S2TB8;&&&&&&&&//置校验位为0 #elif&(PARITYBIT&==&EVEN_PARITY) &&&&&&&&S2CON&|=&S2TB8;&&&&&&&&&//置校验位为1 #endif &&&&} &&&&else &&&&{ #if&(PARITYBIT&==&ODD_PARITY) &&&&&&&&S2CON&|=&S2TB8;&&&&&&&&&//置校验位为1 #elif&(PARITYBIT&==&EVEN_PARITY) &&&&&&&&S2CON&&=&~S2TB8;&&&&&&&&//置校验位为0 #endif &&&&} &&&&busy&=&1; &&&&S2BUF&=&ACC;&&&&&&&&&&&&&&&&//发送数据 } void&SendString(char&*s) { &&&&while&(*s)&&&&&&&&&&&&&&&&&&//判断字符串结束标志 &&&&{ &&&&&&&&SendData(*s++);&&&&&&&&&//发送字符 &&&&} }
&&&&&往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)stc12c5a60s2双串口通讯,串口1已通,一下为串口2使用独立波特率 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
stc12c5a60s2双串口通讯,串口1已通,一下为串口2使用独立波特率
17:07:37  
能够发送,上电后,串口助手,能显示start,。,,,但是收发数据丢失求解
#include &stc12c5a60s2.h&
#include &intrins.h&
void GetString(unsigned char string[],unsigned char n);
unsigned char GetByte(void);
void Delay1000ms();
void UartInit(void);
void SentString(unsigned char string[],unsigned char n);
unsigned char xdata string[20];
#define S2RI 0x01
#define S2TI 0x02
int main()
UartInit();
SentString(&start.......A&,20);
&&GetString(string,20);
&&Delay1000ms();
&&SentString(string,20);
void Delay1000ms()&&[url=]//@11.0592MHz[/url]
unsigned char i, j,
& &while (--k);
&&} while (--j);
} while (--i);
void UartInit(void)&&
AUXR &= 0xF7;&&
S2CON = 0x50;&&
AUXR &= 0xFB;&&
BRT = 0xFD;&&
AUXR |= 0x10;
IE2 = 0x01;
void SentString(unsigned char str[],unsigned char n)
unsigned char i = 0;
while(i & n)
&&S2BUF = str;
&&while(!(S2CON & S2TI));
&&if(str == 'A')&&
unsigned char GetByte(void)
while(!(S2CON & S2RI));
c = S2BUF;
void GetString(unsigned char str[],unsigned char n)
unsigned char i = 0;
while(i & n)
&&str = GetByte();&&
&&if(str == 'A')
void UART_2Interrupt(void) interrupt 8
if(S2CON & S2RI)
&&S2CON &= ~S2RI;
if(S2CON & S2TI)
&&S2CON &= ~S2TI;
已退回5积分
10:20:23  
有没有人啊,人人人人求解
10:20:44  
顶起,高手在哪里,大声告诉我!
10:21:23  
在线急等,2天了啊,为什么受到的数据不完整,发送没问题
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司常用程序模块备份(二):STC12C5A60S2,串口Uart
uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的
这里的用stc12单片机,因为不用12分频,所以可以进行115200波特率快速传输(注意晶振必须11.0592MHz,12MHz的会乱码,本人亲测),而如果改用其他的51单片机,只需要把UartInit()函数改成自己的初始化设置就行,比如89c52,当然要记得改52头文件。
此uart本人比较欣赏的是可以直接调用UartPrintf()函数,跟c中prinf()用法几乎相同,支持%d%0.2f等省去了字符转换。而对于接收到的字符命令进行处理只需要在UartReceiveHandler函数中修改即可,例子中是对“End”字符命令进行处理,测试程序main.c是博文手写,未经测试,只是提示主框架用法
main.c-------------------------------------------------------------------------------------------------------
#include"uart.h"
void main(void)
UartInit();
UartReceiveHandler();
uart.h--------------------------------------------------------------------------------------------------------
#ifndef __UART_H__
#define __UART_H__
void UartInit(void);
void UartPrintf(const char *fmt,...);
void UartReceiveHandler(void);
uart.c--------------------------------------------------------------------------------------------------------
#include"STC12C5A60S2.h"
#include&&&
//stdio.h,stdarg.h用于vsprintf函数原型
#define UART0_BUF_LEN 32
int UART1_Recv_
&&& //接收计数
bit UART1_Overflow_F//缓冲区满标志
bit MarkFlag = 1;
idata unsigned char UART1_Recv_BUF[UART0_BUF_LEN];
//串口接收缓冲区
UartInit(void)&&&
//115200bps@11.0592MHz
&&& PCON &=
//波特率不倍速
&&& SCON =
//8位数据,可变波特率
&&& AUXR |=
//独立波特率发生器时钟为Fosc,即1T
//设定独立波特率发生器重装值
&&& AUXR |=
//串口1选择独立波特率发生器为波特率发生器
&&& AUXR |=
//启动独立波特率发生器
&&& ES = 1;
//充许串口1中断
&&& //开总中断
void sendbyte(unsigned char c)&
if(c=='\n')&&&
//如果遇到\n就换行&
//发送CR(carriage return)&
SBUF=0x0D;&&
while(!TI);&&&
//等待发送完成&
&&& //发送 LF(NL
line feed,new line)&
SBUF=0x0A;&&
while(!TI);&&&
//等待发送完成&
TI=0;&&&&&&&&
while(!TI);&&&
//等待发送完成&
void sendstring(unsigned char *string)
//此处*string相当于数组&
while(*string!='\0')//判断是否到字符串末尾&
sendbyte(*string);&
string++;&
void UartPrintf(const char *fmt,...)&
&&& va_list
&&& char xdata
string[1024];&&&
//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)&
va_start(ap,fmt);&
vsprintf(string,fmt,ap);&&&
//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去&
sendstring(string);&
va_end(ap);&
void UART1_Int(void) interrupt 4
&&& if (RI ==
if(UART1_Overflow_Flag==0)
if(UART1_Recv_count
UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
if(SBUF=='\r' || SBUF=='\n')
UART1_Overflow_Flag=1;
UART1_Overflow_Flag=1; // 关闭串口中断,停止接收
//void Delay_10ms()
//&&& unsigned
//&&& for(i=0;
&&& for(j=0;
j&2000; j++);
void UartReceiveHandler(void)
//&&& unsigned
//&&& unsigned
unsigned long C
(UART1_Overflow_Flag==1) //串口中断数据接收完毕,开始处理
&&& if(0 ==
strncmp("End",UART1_Recv_BUF,strlen("End")))
UartPrintf("Start\n");
&&& Count =
ReadCount();
UartPrintf("End:%ld\n",Count);
UartPrintf("\r\n");
UART1_Recv_count = 0; //缓存清零
UART1_Overflow_Flag=0;//允许串口继续接收数据
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?_百度知道
STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?
串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的
采纳率:29%
为您推荐:
其他类似问题
您可能关注的内容
stc12c5a60s2的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。串口;一、中断图;TCONIE;1IT0EX01EA1INT0IE001ET01;1EX11IT1INT1IE101ET11TF1;ES1RXRI≥1TITX;SCON;二、相关寄存器;1、SCON串行控制寄存器(可位寻址)0x98B;其中SM0、SM1按下列组合确定串行口1的工作方;SM00011;SM10101;工作方式方式0方式1方式2方式3;功能说明
一、中断图 TCONIE
1IT0EX01 EA1INT0IE00 1 ET01T0TF0 1 EX11IT1INT1IE1 01 ET11TF1T1
ES1RXRI ≥1TITX SCON 二、相关寄存器 1、SCON 串行控制寄存器(可位寻址)0x98 B7 SM0/FE
IPPX010PT010PX110PT110PS1001硬件查询自然优先级中断源高级中断入口自然优先级中断源低级中断入口B2 RB8
SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个 无效停止位时,通过UART接收器设置该位。它必须由软件清零。
当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的 工作 方式,如下表所示。 其中SM0、SM1按下列组合确定串行口1的工作方式:
SM0 0 0 1 1 SM1 0 1 0 1 工作方式 方式0 方式1 方式2 方式3 功能说明 同步移位串行方式:移位寄存器 波特率 当UART_M0x6 = 0时,波特率是SYSclk/12,
当UART_M0x6 = 1时,波特率是SYSclk / 2 波特率发生器的溢出率) 9位UART ( 2SMOD / 64) x SYSclk系统工作时钟频率 特率发生器的溢出率) 当T1x12 = 0时,定时器1的溢出率 = SYSclk/12/( 256 - T H1); 当T1x12 = 1时,定时器1的溢出率 = SYSclk / ( 256 - T H1) 当BRTx12 = 0时,BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT ); 当BRTx12 = 1时,BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT ) 9位UART,波特率可变 (2SMOD/32 )x(定时器1的溢出率或BRT独立波8位UART,波特率可变 ( 2SMOD/32 )×(定时器1的溢出率或BRT独立
SM2:允许方式2或方式3多机通信控制位。
在方式2或方式3时,如果SM2位为1且REN位为1,则接收机处于地址帧筛选状态。此时可以利用 接收到的第9位(即RB8)来筛选地址帧:若RB8=1,说明该帧是地址帧,地址信息可以进入SBUF, 并使RI为1,进而在中断服务程序中再进行地址号比较;若RB8=0,说明该帧不是地址帧,应丢掉 且保持RI=0。在方式2或方式3中,如果SM2位为0且REN位为1,接收收机处于地址帧筛选被禁止 状态。不论收到的RB8为0或1,均可使接收到的信息进入SBUF,并使RI=1,此时RB8通常为校验位. 方式1和方式0是非多机通信方式,在这两种方式时,要设置SM2 应为0。
REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串 行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。
TB8: 在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。例如,可用作数 据的校验位或多机通信中表示地址帧/数据帧的标志位。在方式0和方式1中,该位不用.
RB8: 在方式2或方式3,是接收到的第9位数据,作为奇偶校验位或地址帧/数据帧的标志位。方式0中不用RB8(置SM2=0). 方式1中也不用RB8(置SM2=0, RB8是接收到的停止位)。
TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零。
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后RI必须用软件清零,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须由软件清零。
SCON的所有位可通过整机复位信号复位为全”0”。SCON的字节地址为98H,可位寻址,各位地址为98H~~9FH,可用软件实现位设置。 串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。
87H 2、PCON : 电源控制寄存器 (不可位寻址) 87H B7 SMOD B6 B5 B4 POF B3 GF1 B2 GF0 B1 PD B0 IDL name SMOD0 LVDF Address bit
SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。
SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD0=0
3、串行口数据缓冲寄存器SBUF STC12C5A60S2系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。 串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A)的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送. 串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变. 由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
ss 4、AUXR : 辅助寄存器 (不可位寻址) 8EH B7 T0x12 B6 T1x12 B5 UART_M0x6 Addre8EH B4 BRTR B3 S2SMOD B2 BRTx12 B1 EXTRAM B0 S1BRS T0x12:定时器0速度设置位
0:定时器0是传统8051 速度,12 分频; 1:定时器0 的速度是传统8051 的12 倍,不分频
T1x12: 定时器1速度设置位
0:定时器1 是传统8051 速度,12 分频; 1:定时器1 的速度是传统8051 的12 倍,不分频 如果UART串口用定时器1做波特率发生器,T1x12位就可以控制UART串口是12T还是1T了。
UART_M0x6:串行口模式0的通信速度设置位
0:UART串口的模式0是传统12T的8051速度,12分频; 1:UART串口的模式0的速度是传统12T的8051的6倍,2分频
BRTR:独立波特率发生器运行控制位
0:不允许独立波特率发生器运行; 1:允许独立波特率发生器运行
S2SMOD:串口2的波特率加倍控制位。 0:串口2的波特率不加倍?? 1:串口2的波特率加倍 对于STC12C5A60S2系列单片机,串口2只能使用独立波特率发生器作为波特率发生器,不能够选择定时器1作为波特率发生器;而串口1既可以选择定时器1作为波特率发生器,也可以选择独立波特率发生器作为波特率发生器。
BRTx12:独立波特率发生器计数控制位。
0:独立波特率发生器每12个时钟计数一次; 1:独立波特率发生器每1个时钟计数一次
0:允许使用内部扩展的1024字节扩展RAM
1:禁止使用内部扩展的1024字节扩展RAM
S1BRS:串行口波特率发生器选择位。
0:缺省,串??口波特率发生器选择定时器1, S1BRS是串口1波特率发生器选择位; 1:独立波特率发生器作为串??的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用。 串口1可以选择定时器1做波特率发生器,也可以选择独立波特率发生器作为波特率发生器。当设置AUXR寄存器中的S1BRS位(串行口波特率选择位)为1时,串??口选择独立波特率发生器作为波特率发生器,此时定时器1可以释放出来作为定时器/计数器/时钟输出使用。
5、独立波特率发生器寄存器BRT 独立波特率发生器寄存器BRT(地址为9CH,复位值为00H)用于保存重装时间常数。 STC12C5A60S2系列单片机是1T的8051单片机,复位后兼容传统8051单片机。 如果UART串口用定时器1做波特率发生器,AUXR中的T1x12/AUXR.6位就可以控制UART串口是12T还是1T。
三亿文库3y.uu456.com包含各类专业文献、生活休闲娱乐、各类资格考试、幼儿教育、小学教育、中学教育、高等教育、94stc单片机串口使用等内容。 
 STC单片机串口程序_电子/电路_工程科技_专业资料。//注意,如您使用的 MCU 没有那个功能,就不要操作相应的寄存器 //注意,如您使用的 MCU 没有那那么大的扩展 ...  STC单片机串口下载方法_机械/仪表_工程科技_专业资料。附件 STC 单片机串口下载方法第一步:双击运行 STC_ISP_V3.1 软件。 第二步:选定单片机型号。 第三步:点击...  STC 单片机串口下载使用说明书 1、注意学习板、串口线、USB 线和电脑的连接顺序:因为电脑串口不能带电拔插,所以要一定 要按下面的顺序连接和断开。 连接时的顺序...  stc单片机串口使用_电子/电路_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 stc单片机串口使用_电子/电路_工程科技_专业资料。stc单片机串口原理...  STC单片机串口下载教程_电子/电路_工程科技_专业资料。STC单片机串口下载教程 1、未安装驱动之前图 2、驱动安装 3、安装驱动之后图 4、下载示意图 5、下载成功...  使用stc单片机_信息与通信_工程科技_专业资料。aa//使用 stc 单片机,器件选择 ...//反馈当前位置 //串口中断程序 void Int_UART() interrupt 4 using 0 { ...  实验一:STC 单片机开发系统的建立及使用――Keil μ Vision、Proteus 软件的使用...电平芯片MAX232、 USB转串口芯片PL2303, 可以直接连接PC机RS232串口或PC机USB ...  STC 单片机烧写程序使用教程 1、 把开发板连接到电脑上 把串口线(每端 9 个孔的线)一端插到电脑的串口上,一端插在 开发板上;把 USB 一端插到电脑的串口...}

我要回帖

更多关于 stc12c5a60s2最小系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信