找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4725|回复: 5
打印 上一主题 下一主题
收起左侧

[求助]51单片机与PC串口通信程序,T1作为波特率发生器时,T0无法中断

[复制链接]
跳转到指定楼层
楼主
ID:23515 发表于 2013-4-13 18:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <stc89.h>
#define uchar unsigned char
#define uint  unsigned int
uint tjs;

void init_time()//定时器模式初始化
{
EA=1;  //开总中断
TMOD=0x02;//设定时器0模式2定时 100um
TH0=TL0=155;//置定时器0初值,中断后,TH0中的值重新装入TL0,THO中值不变
TR0=0; //启动定时器0
ET0=1; //允许T0中断
SCON =0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |=0x80 ; //SMOD=1;
IE |=0x10;   //串行口中断 (IE |=0x10;)开启  (IE &=0xEF;)关闭
TH1 =0xf3 ;   //晶振=12MHz波特率4800
}
/////////////////////////////////////

void sendchar(uchar ch){
TR1=1;     //启动定时器1
ET1=1;    //不允许T1中断
TI=0;
SBUF=ch;
while (TI==0) P05=0;  //为什么会卡在这里?( P05脚的发光管一直亮!)
TR1= 0 ;     ////启动定时器1
ET1=0;    //不允许T1中断
}

//////////////////////////////
void main(void){
P14=0;   //允许LED亮
init_time();//初始化定时器
TR0=1; //启动定时器T0
while(1){
if(tjs==5000){P01=~P01;tjs=0;}
if(tjs==1000)  sendchar(0x39);
} }

void t0_int(void) interrupt 1
{tjs++;}

 

 

 


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2013-4-15 09:38 | 只看该作者

你这是一个完整的程序?P05、P01、P14定义了吗?

应该是:TH0=0XFF;  TL0=155;

你或者:th0=(65535-100)/256;

           tl0=(65535-100)%256;

回复

使用道具 举报

板凳
ID:7485 发表于 2013-4-15 10:46 | 只看该作者

刚才没注意,你是用的是模式2。100us初值设165,不是155(0xa5) 。

要设置波特率。

void initUart(void)       //波特率9600  晶振11.0592
{
 TMOD|=0x20;
 SCON=0x50;
 PCON|=0x80;
 TH1=0xfa;
 TL1=0xfa;
 TR1=1;
}

回复

使用道具 举报

地板
ID:7485 发表于 2013-4-15 15:18 | 只看该作者

你的程序问题太多。

 

 

给你改了一下。试过了,可以正常运行。

#include "STC89C5xRC.H"
#define uchar unsigned char
#define uint  unsigned int
 sbit P05=P0^5;
 sbit P14=P1^4;
 sbit P01=P0^1;
uint tjs;
void init_time()//定时器模式初始化
{
EA=1;  //开总中断
TMOD=0x02;//设定时器0模式2定时 100um
TH0=0xA5;
TL0=0XA5;//置定时器0初值,中断后,TH0中的值重新装入TL0,THO中值不变
TF0 = 0;  //清除TF0标志
TR0=0; //启动定时器0
ET0=1; //允许T0中断

 PCON |= 0x80;  //使能波特率倍速位SMOD
 SCON = 0x50;  //8位数据,可变波特率
 TMOD &= 0x0F;  //清除定时器1模式位
 TMOD |= 0x20;  //设定定时器1为8位自动重装方式
 TL1 = 0xF9;  //设定定时初值
 TH1 = 0xF9;  //设定定时器重装值
 ET1 = 0;  //禁止定时器1中断
 TR1 = 1;  //启动定时器1
}

void sendchar(uchar ch)
{
SBUF=ch;
while(!TI)  P05=0;
TI = 0;  //为什么会卡在这里?( P05脚的发光管一直亮!)
P05=1;

}

//////////////////////////////
void main(void){
P14=0;   //允许LED亮
init_time();//初始化定时器
TR0=1; //启动定时器T0
while(1){
if(tjs==5000)
{
P01=~P01;
tjs=0;
}
if(tjs==1000)  sendchar(0x39);
} }

void t0_int(void) interrupt 1
{

tjs++;
}

回复

使用道具 举报

5#
ID:62967 发表于 2014-6-15 16:49 | 只看该作者
ahshmj 发表于 2013-4-15 15:18
你的程序问题太多。
&nbsp;
&nbsp;

捡个现成的呵呵               
回复

使用道具 举报

6#
ID:62967 发表于 2014-6-15 16:50 | 只看该作者
ahshmj 发表于 2013-4-15 15:18
你的程序问题太多。
&nbsp;
&nbsp;

捡个现成的呵呵               
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表