5327|4

192

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

想多了解下TH1赋值问题 [复制链接]

12c5a60s2 这个芯片 有2个串口 想让两个在一个程序中使用 一个接受 一个发送 过程是像下边这样吗

???
A接受了 在A送给B 然后B接收 再B发送出去??
要是这种情况就是2个串口都有接受发送过程了??!!

 

第二个问题
void T_Init(void)//定时中断初始化
{
 TMOD = 0x11;//T1使用定时模式,工作模式1,无门控位T0使用定时模式,工作模式1,无门控位
 TH0 = 0xD8;;// 为T0填入初值,定时时间10ms
 TL0 = 0xF0;
 TH1 = 0xD8;;// 为T1填入初值,定时时间10ms
 TL1 = 0xF0;

 TR0 = 1;// 启动T0
 TR1 = 1;// 启动T1
 ET0=1;//开T0中断
 ET1=1;//开T1中断
}
///////功能:串口初始化,波特率9600,方式1/////////
void Init_Com(void)
{
 TMOD = 0x20;
 PCON = 0x00;
 SCON = 0x50;
 TH1 = 0xFd;
 TL1 = 0xFd;

 TR1 = 1;
}
 
这个斑竹帮我解答了一些 但是还是不明白
我看见下面的情况来
 
TI的 不一样啊 这个是肯定不一样吧
TH1 = 0xD8;;// 为T1填入初值,定时时间10ms
TL1 = 0xF0;
串口的一样 这个能不一样吗???
TH1 = 0xFd;
TL1 = 0xFd;
这如何是好??
 
此帖出自51单片机论坛

最新回复

首先在定时器中断里面再进行配置串口,就收数据是不太合适的,配置串口一般都放在初始化程序里面,需要的时候进行检测或者打开就可以了。再一个定时器0的用法有点儿乱,当定时器做为串口的波特率控制器使用时,定时器工作在自动装填模式,是模式几自己去看看吧。我记不清了,好久不用51了。这是也不需要再在定时器中断里面重新装填值了  详情 回复 发表于 2012-2-23 09:17
点赞 关注
 

回复
举报

192

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
原帖由 jishuaihu 于 2012-2-21 09:45 发表  一般有两个串口的单片机两个串口肯定是可以同时工作的,但因为执行指令有个顺序,不能同时给两个串口数据寄存器赋值,因此实际使用的时候也是分开用的(也可以认为是同时赋值,时间差可以很短,只不过是以机器周期来 ...


这是斑竹对另一个问题的回答
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
你把调用上面两个函数的主程序发出了,给你一步一步的说一下。就这样我的理解也许和你说的不一样。
此帖出自51单片机论坛
 
 
 

回复

192

帖子

0

TA的资源

纯净的硅(初级)

4
 

回复 板凳 jishuaihu 的帖子

#include
#define uint unsigned int
#define uchar unsigned char
unsigned char dat; //串口
unsigned char g_count;// 全局变量,timer1_int函数使用
unsigned char g_second;// 全局变量,timer0_int函数使用
sbit p1=P1^1;// 先200ms灭后800ms亮指示灯
sbit p2=P1^2;// 先800ms亮后200ms灭指示灯
sbit p3=P1^3;   //串口数据接收灯
bit flag0=0;
bit flag1=0;

void T_Init(void)//定时中断初始化
{
TMOD = 0x11;//T1使用定时模式,工作模式1,无门控位T0使用定时模式,工作模式1,无门控位
TH0 = 0xD8;;// 为T0填入初值,定时时间10ms
TL0 = 0xF0;
TH1 = 0xD8;;// 为T1填入初值,定时时间10ms
TL1 = 0xF0;
TR0 = 1;// 启动T0
TR1 = 1;// 启动T1
ET0=1;//开T0中断
ET1=1;//开T1中断
}

void main()
{
g_count=0;
g_second=0;
T_Init();
EA=1;
while(1);
}

/* T1溢出中断处理函数*/
void timer1_int() interrupt 3 using 3 // T1溢出中断,使用工作组3
{
TH1 = 0xD8;// 重新填入初值
TL1 = 0xF0;
g_count++;
  if(flag0 == 0 && g_count == 20)//  先灭200ms
  {  
   g_count = 0;// 清0
   p1=0;
   flag0=1;
  }
  else if(flag0 == 1 && g_count == 80)// 后亮800ms
  {
   g_count = 0;// 清0
   p1=1;
   flag0=0;
  }
}

/* T0溢出中断处理函数 */
void timer0_int() interrupt 1 // T0溢出中断,
{
TH0 = 0xD8;// 重新填入初值
TL0 = 0xF0;
g_second++;
  if(flag1 == 0 && g_second == 80)//  先亮800ms
  {  
   g_second = 0;// 清0
   p2=1;
   flag1=1;
/*                        就是这里了 我想的是在这里用串口输入数据显示
        TMOD = 0x20;              
        PCON = 0x00;
        SCON = 0x50;
        TH1 = 0xFd;
        TL1 = 0xFd;
        TR1 = 1;
        if ( RI ) //扫描判断是否接收到数据,
                {
                        dat = SBUF; //接收数据SBUF赋与dat
                        p3=0;//串口数据接收灯亮
                        RI=0; //RI 清零。
                        SBUF = dat;//返回显示       
                }
*/
  }
  else if(flag1== 1 && g_second == 20)// 后灭200ms
  {
   g_second = 0;// 清0
   p2=0;
   flag1=0;
       
  }
}
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
首先在定时器中断里面再进行配置串口,就收数据是不太合适的,配置串口一般都放在初始化程序里面,需要的时候进行检测或者打开就可以了。再一个定时器0的用法有点儿乱,当定时器做为串口的波特率控制器使用时,定时器工作在自动装填模式,是模式几自己去看看吧。我记不清了,好久不用51了。这是也不需要再在定时器中断里面重新装填值了
此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表