各个中断标志位
中断标志号
TMOD 工作方式设置
(一)定时器0或1初始化,定时模式:
TMOD|= ;工作方式设置
TH0= ;
TL0= ;计数初值设置
EA=1; 打开总中断
ET0=1; 打开定时器0中断
TR0=1;开启定时器0
(二)关于计数器应用,P3.4,P3.5口分别是计数器的计数脉冲输入端(即把T0和T1设置为计数模式),每当外部输入的脉冲由1到0发生负跳变时,计数器加1,直到加满溢出,向cpu申请中断。对于12Mhz频率晶振,最高可输入500khz的外部脉冲(根据单片机的指令周期啥的计算),如果是外部脉冲,需要将其接入P3.4或P3.5
定时器0,计数模式:
TMOD|=0x ;工作方式设置
TH0=0X00;
TL0=0X00;计数值设为0
EA=1;
ET0=1;
TR0=1;(这三个也得写),最后注意在中断中要把计数值清零。count=th0; count=count<<8; count=count+tl0,最后count值即为计数总个数(十进制)
(三)外部中断0或1初始化
EA=1;
EX0=1;下降沿触发(=0为高电平触发,一般不用)
IT0=1;打开INT0的中断允许
设置完之后即可在中断里设置外部中断
(四)串行口中断
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为: 10位×240个/秒 = 2400 bps
传输距离随传输速率的增加而减小。当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)。
SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:
SM0和SM1为工作方式选择位,可选择四种工作方式:
PCON电源管理寄存器 :(不可位寻址) 用来管理单片机的电源部分,包括上电复位检测、掉电模式 、空闲模式等
暂时只列出这么多,
当发送使用时,就采用SBUF=XXX; (XXX为需要传送的数据)
当接收使用时,采用XXX=SBUF;
注意:波特率设置在51单片机里只能使用T1(定时器1),T0不能设置,对于12mhz晶振,波特率一般4800,同时令SMOD=1(波特率加倍),这样误差会很小,且传输速率对于一般操作足够用。
例如下边程序,通过串口助手,发送数字(或一个字节)后会,再次在屏幕上接收到数字
#include "reg51.h"
#define u16 unsigned int
#define u8 unsigned char
void delay(u16 x)
{
while(x--);
}
void UsartInit() //串口初始化
{
SCON=0x50; //设置为工作方式1,8位异步模式,REN=1,则启动串行口接收数据
TMOD|=0x20; //定时器1工作方式2,用于产生固定频率的波特率,
PCON=0x80;//波特率加倍
TH1=0XF3; //定时初始值设置,波特率4800,加倍后为9600,波特率一般为9600,我也不太清楚为啥
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开定时器
}
void main()
{
UsartInit();
while(1);
}
void UsrtInit () interrupt 4
{
u8 receivedata;
receivedata=SBUF;//PC机发送数据存入变量中,接收数据
RI=0;//清除接收中断标志位
SBUF=receivedata;//将接收到的数据放入发送寄存器中,
while(!TI);//当TI=0时,说明还在发送,直到TI=1表示在发送停止位,
TI=0;//清除发送中断标志位
}
暂时写这么多,可能会再次更新。