| 同求帮助 |
| 内部定时器的设置问题 |
bayga456 发表于 2017-4-22 09:43 谢谢,就是TR0的问题! |
|
左边的单片机的程序是这样的: #include<reg51.h> #define uchar unsigned char sbit key=P1^0; //定义按键所在端口 uchar a; //定义变量a 存放要发送的数据 void Init_UART() //串口初始化 12T/定时器1作波特率发生器 { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1=TH1=xxxx; //设定定时初值 (你自己定义波特率) ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //开串口中断 } void delay() //延时程序 自己写 20ms够了 { //............... } void main() { Init_UART(); //初始化UART a=0xfe; //赋值 要发送的数据 while(1) //主循环 { if(key==0) //如果 按键按下 { delay(); //防抖 if(key==0) //如果按键依旧按下 { while(!TI); //等到按键释放才动作 SBUF=a; //给串口缓冲区传送数据 while(!TI); //等待发送标记 } } } } 右边的单片机的程序是这样的: #include<reg51.h> #include<intrins.h> #define uchar unsigned char uchar b=0; //定义变量b 存放收到的数据 bit flag_uart=0; //定义标记 是否接收到数据 void Init_UART() //串口初始化 12T/定时器1作波特率发生器 { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1=TH1=xxxx; //设定定时初值 (你自己定义波特率 和发送的一样) ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //开串口中断 } void Server_UART() interrupt 4 //中断4 服务 { TI=0; //发送标志位 TI置0 if(RI==1) //如果接收位1 有数据接收 { RI=0; //清除接收标志 硬件可以接收数据 b=SBUF; //从接收缓冲区SBUF读取数据到数据缓冲区RX flag_uart=1; //接收标记置1 收到数据 } } void main() { P1=0x00; //显示端口清零 Init_UART(); //串口初始化 while(1) //主循环 { if(flag_uart==1) //如果 接收标记为1 收到数据 { flag_uart=0; //接收标记清零 可以再次接收 P1=b; //赋值 P1端口值为收到的数据 } } } |
| 把程序的TR0=1;改为TR1=1;试试 |
| TR0=1;改为TR1=1;试试,c51用TR1的溢出率,不是TR0 |
| 昨天看到了类似的问题,你仿真图里的单片机晶振频率设置的是多少,12MHz? |