当前位置:首页 > 单片机 > 单片机
[导读]#include"STC12C5616AD.H"#define uint unsigned int#define uchar unsigned charuchar MSG[]="ilovetheworld " ;uint num;void delay(uint x){uchar i;while(x--){for(i = 0;i < 120;i++);}}void Send_char(uchar c

#include"STC12C5616AD.H"

#define uint unsigned int

#define uchar unsigned char

uchar MSG[]="ilovetheworld " ;

uint num;

void delay(uint x)

{

uchar i;

while(x--)

{

for(i = 0;i < 120;i++);

}

}

void Send_char(uchar ch)//发送单个字符

{

SBUF=ch; //送入缓冲区

while(TI!=1); //等待发送完毕

TI=0; //软件清零

}

void Send_order(uchar *p)//发送字符串

{

while(*p!='')

{

Send_char(*p);

p++;

}

}

void Start(void )

{

PCON |= 0x80; //使能波特率倍速位SMOD

SCON = 0x50; //8位数据,可变波特率

AUXR |= 0x40; //定时器1时钟为Fosc,即1T

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

// TMOD &= 0x0F; //清除定时器1模式位

TMOD = 0x23; //设定定时器1为8位自动重装方式

TL1 = 0x64; //设定定时初值

TH1 = 0x64; //设定定时器重装值

// ET1 = 0; //禁止定时器1中断

// TR1 = 1; //启动定时器1

TH0 = 0x10; //设置定时初值

TF1=0;

ET1 = 1; //禁止定时器1中断

TR1 = 1; //启动定时器1

EA=1;

}

void send()interrupt 3

{

num++;

}

void main()

{

Start();

delay(200);

while(1)

{

if(num>3000)

{

num=0;

// Send_order(MSG);//成功

//Send_char('A'); //成功

SBUF=0xAA;//成功

SBUF=0xbb;

}

}

}

下面对单片机定时器0工作方式三的设置进行说明:

若将T0设置为模式3,TL0和TH0被分成为两个相互独立的8位计数器。

TL0使用T0的各控制位、引脚和中断源,其操作模式和模式0、1相同。

TH0用于简单的内部定时,它占用定时器T1的控制位TR1和TF1,其启动和关闭仅受TR1的控制。

TH0仅占用T1的与中断有关的IE中的位,但并未占用TMOD中的位,TMOD中的T1的控制位仍然由T1使用。

定时器T1无工作模式3,若T1设置为模式3,就会使T1立即停止计数。

T1仍可设置为模式0~2,由于TR1和TF1被定时器T0占用,计数器开关已被接通,此时,仅用T1控制位C/T切换其定时器或计数器工作方式就可使T1运行。寄存器(8位、13位或16位)溢出时,只能将输出送入串行口或用于不需要中断的场合。一般情况下,当定时器T1用作串行口波特率发生器时,定时器T0才设置为工作模式3。此时,常把定时器T1设置为模式2,用作波特率发生器。

由此,也就可以总结出串口发送其实就只与TMOD有关,至于TR1、ET1、还有TF1是没关系的。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭