单片机功能总结
PCON中只有一位SMOD与串行口工作有关:
SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
1、方式1输出
四、波特率的计算
在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。
EX0:外部中断0允许位;
ET0:定时/计数器T0中断允许位;
EX1:外部中断1允许位;
ET1:定时/计数器T1中断允许位;
ES :串行口中断允许位;
EA :CPU中断允许(总允许)位。
B7
B6
B5
B4
B3
B2
B1
B0
-
-
PT2
PS
PT1
PX1
PT0
PX0
B7
B6
B5
B4
B3
B2
B1
B0
GATE
C/T
sbit LSB=P2^3;
sbit LSC=P2^4;
P0=smgduan[0];数码管显示段
sbit k1=P3^1;//定义P31口是k1独立按键实验
sbit k3=P3^2; //定义按键K3
sbit k4=P3^3; //定义按键K4
sbit led=P2^0;//定义P20口是led
#define GPIO_KEY P1矩阵按键实验P1口高低各4位
sbit SRCLK=P3^6; 74HC595模块8*8LED点阵———点亮一个点实验
sbit RCLK=P3^5;
sbit SER=P3^4;数据
P0=0x7f;列选择
void Hc595SendByte(u8 dat)74HC595模块控制发送字节程序
{
u8 a;
SRCLK=0; //移位时钟
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code shu[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 smgduan[8];
void Timer0Init()
MCS51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套
中断编号
中断名
中断源
0
Байду номын сангаас外部中断0
IE0(P3.2)
1
定时器0溢出中断
TF0
2
外部中断1
IE1(P3.3)
3
定时器1溢出中断
TF1
4
串行口中断
RI
B7
B6
B5
B4
B3
B2
B1
B0
EA
-
ET2
ES
ET1
EX1
ET0
EX0
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
0 1 方式1 16位计数器 TMOD=0x01
1 0 方式2 自动重装8位计数器 TMOD=0x02
1 1 方式3 T0分为2个8位计数器,T1为波特率发生器 TMOD=0x03
================================================================
EA=1;//打开总中断
TR1=1;//打开计数器
}
void main()
{
UsartInit(); //串口初始化
while(1);
}
void Usart() interrupt 4、、串口通信中断函数
{
u8 receiveData;
receiveData=SBUF;//出去接收到的数据
RI = 0;//清除接收中断标志位
TCON:定时器/计数器控制寄存器
可以通过设置此寄存器里面的相关位,让定时器开启或关闭(TR0、TR1,1:开启,0:关闭),可以在主程序中,通过查询其中的相关位(TF1、TF0,1:溢出,0:没有溢出)。,知道定时有没有溢出
TMOD;定时器/计数器工作方式控制寄存器,通过对这个寄存器不同的位进行设置,可以设置:让T0/T1是定时还是计数方式,是13位计数,16位计数,还是8位自计数,定时的启动是通过定时开关自身启动,还是通过外部中断进行启动。
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
//TMOD|=0X10;选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH0=0XFC;//给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
if(i==1000)
{
i=0;
P0=shu[n++];
if(n==16)n=0;
}
串口通信实验*
实现现象:打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
在串口助手上。
#include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;//对数据类型进行声明定义
TF1:定时/计数器T1溢出中断请求标志位
D7
D6
D5
D4
D3
D2
D1
D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
B7
B6
B5
B4
B3
B2
B1
B0
TF2
EXF2
RCLK
TCLK
EXEN2
TR2
C/T2
CP/RL2
外部中断
#include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
write_com(0x38); //显示模式设置
write_com(0x0e); //显示开关、光标设置
write_com(0x06); //地址指针和显示左移
write_com(0x01); //显示清屏,指针和显示清0
write_com(0x80+0x10);
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率= fosc/12
方式2的波特率=(2SMOD/64)·fosc
方式1的波特率=(2SMOD/32)·(T1溢出率)
方式3的波特率=(2SMOD/32)·(T1溢出率)
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。
}
//void Timer0() interrupt 1 //定时器0中断函数,中断号1
void Timer1() interrupt 3 //定时器2中断函数,中断号3
{
staticu16 i;、/局部变量
TH1=0XFC;//给定时器赋初值,定时1ms,16位定时器初始值
TL1=0X18;
i++;
SBUF=receiveData;//将接收到的数据放入到发送寄存器
while(!TI);//等待发送数据完成
TI=0;//清除发送完成标志位
}
控制板
sbit led=P2^0;右边led灯P2口
sbit beep=P1^5;蜂鸣器实验
sbit LSA=P2^2;数码管显示控制38译码器的Y0输出低电平
确定T1的工作方式(编程TMOD寄存器);
计算T1的初值,装载TH1、TL1;
启动T1(编程TCON中的TR1位);
确定串行口控制(编程SCON寄存器);
串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
LCE1602初始化设置
void write_com(uchar com)
{
lcdrs=0;
while(1);
}
void Int0()interrupt 0//外部中断0的中断函数interrupt 2外部中断1的中断函数
{
delay(1000);//延时消抖
if(k3==0)
{
led=~led;
}
}
定时器0实验
B7
B6
B5
B4
B3
B2
B1
B0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
sbit LSA=P2^2;
typedef unsigned int u16;//对数据类型进行声明定义
typedef unsigned char u8;
sbit k3=P3^2; //定义按键K3
sbit k4=P3^3; //定义按键K4
sbit led=P2^0;//定义P20口是led