标题:
单片机串口通信控制led亮灭程序
[打印本页]
作者:
momoli
时间:
2021-7-18 10:06
标题:
单片机串口通信控制led亮灭程序
/*现象:在串口调试助手中选择字符显示与字符发送。发送字符1,则led1亮;发送字符0,led1灭。
注意:发送后将发送区的字符清除,否则会继续再次发送。*/
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 receivedata;//将发送的字符保存到一个变量中
sbit led=P2^0;
void UsartInit()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF4;
TL1=0XF4;
ES=1;
EA=1;
TR1=1;
}
void work()
{
if(receivedata=='1')
{
led=0;
}
else if(receivedata=='0')
{
led=1;
}
}
void main()
{
UsartInit();//串口初始化
while(1)
{
work();
}
}
void Usart() interrupt 4
{
receivedata=SBUF;
RI=0;
SBUF=receivedata;
while(!TI)
TI=0;
}
作者:
祥ZD
时间:
2022-6-3 18:17
我那个用的STC-ISP的串口助手,用仿真画的,但是出现问题,就是我不管发1还是0,都不对,我换if else语句之后,一直是else里边运行,说明我串口数据传输乱了,波特率也是9600,为之奈何
作者:
祥ZD
时间:
2022-6-3 20:40
PCON=0X80; 把这一句去掉就可以用了,。。。为什么要写这一句
作者:
新昌小徐
时间:
2022-6-3 23:31
祥ZD 发表于 2022-6-3 20:40
PCON=0X80; 把这一句去掉就可以用了,。。。为什么要写这一句
PCON的最高位是 1的话,波特率倍增。
你算计数器1的重载值是这样算的,256-晶振频率/12/16/2/波特率
如果PCON=0X80,就是最高位是1,启用波特率倍增,计算公式就变成了256-晶振频率/12/16
原理如下,定时器1给串口模块提供节拍,定时器计数频率等于晶振频率/12,模块接收数据的时候,它不能在数据突变的情况下来测量电压然后决定接收到的数据是1还是0,所以,需要在采集分成16等分,然后在7,8,9次采样的时候获得电压,如果有二次是1,就是1,如果有二次是0,就是0,一次采错,不影响结果,这样提高了测量的正确性。所以在倍频的情况下,每次采样的机器周期次数令其为x
12/11059200就是执行一个机器周期所需要的时间
12X*16/11059200就是传送一个位需要的时间
12*x*16*波特率/11059200就是传送波特率次数所需的时间,如波特率是9600,传送9600位的时间就是1秒
这样12*X*16*波特率/11059200=1
X=11059200/12/16
得到的值就是计数器每次采样计的数。256-X就是重载值。
如果没有启用倍增的话公式变成256-晶振频率/12/16/2/波特率。好似是采用32次采样。
作者:
Hovey_W
时间:
2022-7-14 16:36
膜拜各位大佬
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1