1、学习三极管的使用( 二 )


TMOD |= 0x01; //配置T0为模式1
TH0 = ; //加载T0重载值
TL0 = ;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
= 1; //输出高电平
/* 关闭PWM */ void ()
TR0 = 0; //停止定时器
ET0 = 0; //禁止中断
= 1; //输出高电平
/* T0中断服务函数 , 产生PWM输出 */
void ()1
if ( == 1) //当前输出为高电平时 , 装载低电平值并输出低电平
TH0 = LowRH; TL0 = LowRL;
= 0;
else //当前输出为低电平时 , 装载高电平值并输出高电平
TH0 = ; TL0 = ;
= 1;
6、单片机UART使用
单片机 1 想给单片机 2 发送数据时 , 比如发送一个 0xE4 这个数据 , 用二进制形式表示就是  , 在 UART 通信过程中 , 是低位先发 , 高位后发的原则 , 那么就让 TXD 首先拉低电平 , 持续一段时间 , 发送一位 0 , 然后拉高 , 再持续一段时间 , 发送了一个1
这段“持续的时间”就是1/baud(波特率) 。在通信时两个单片机波特率要一致 。
在实际发送时发一个字节要发10位 , 因为要加上起始位和中止位 。
51 单片机内部存在这样一个 UART 模块 , 控制它的寄存器为SCON:
其中模式1便是8位数据加一位起始位和一位停止位的模式 。
要使用此模块 , 需要用定时器给此模块提供采样定时 , 也就是给它提供波特率 , 作为它的波特率发生器 。对于单片机来讲 , 这个波特率发生器只能由定时器 T1 或定时器 T2 产生 , 采用T1产生波特率时 , 需要使用T1的模式2(自动重装载模式) , 且必须关闭T1的中断 。
定时器的重载值计算公式: TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
其中“16”指的是在数据采集时 , 模块实际上会将一个位检测16次 。和波特率有关的还有一个寄存器 , 是一个电源管理寄存器 PCON , 他的最高位可以把波特率提高一倍 , 也就是如果写 PCON |= 0x80 以后 , 计算公式就成了: TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
可以设需要计数的次数为X , 那么X* (12/晶振值) = 一次采样的时间 = 1/(波特率*16).
使用代码
/* 串口配置函数 , baud-通信波特率 */
void ( int baud)
SCON = 0x50; //配置串口为模式1
TMOD &= 0x0F; //清零T1的控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 256 - (/12/32)/baud; //计算T1重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止T1中断
ES = 1; //使能串口中断
TR1 = 1; //启动T1
/* UART中断服务函数 */
void ()4
{ if (RI) //接收到字节
RI = 0; //手动清零接收中断标志位
SBUF = SBUF + 1; //接收的数据+1后发回 , 左边是发送SBUF , 右边是接收SBUF
if (TI) //字节发送完毕
TI = 0; //手动清零发送中断标志位
7、基于1602液晶的时序图学习
读操作时序的 RS 引脚和 R/W 引脚 , 这两个引脚先进行变化 , 不管它原来是什么 。读指令还是读数据 , 都是读操作 , 而且都有可能 , 所以 RS 引脚既有可能是置为高电平 , 也有可能是置为低电平 , 而 RS 和 R/W 变化了经过 Tsp1 这么长时间后 , 使能引脚 E 才能从低电平到高电平发生变化 。
而使能引脚 E 拉高经过了 tD 这么长时间后 ,  输出 DB 的数据就是有效数据了 , 我们就可以来读取 DB 的数据了 。读完了之后 , 先把使能 E 拉低 , 经过一段时间tHD1、tHD2后 RS、R/W 和 DB 才可以继续变化 。