📄 serial.c
字号:
/************************************************************
* 文件名: Serial.c *
* 文件说明: 读端口P0,如果数值改变,则将P0口读到的数送 *
* PC机显示。 *
************************************************************/
#include "REG51.h"
unsigned char data PreValue; // 存放读P0口的先前值
unsigned char data ChangeFlag=0; // P0口数据改变标志
/************************************************************
* 函数原型: void Init_Serial(void) *
* 函数描述: 初始化串口,晶振为11.0592MHz,波特率为19200bps *
************************************************************/
void Init_Serial(void)
{
SCON = 0x50; // 串口工作方式1
TMOD = (TMOD&0x0F)|0x20; // 选择定时器1方式2
PCON = 0x80; // 波特率倍增
TH1 = 0xFD; // 计数初值, 19200bps
TR1 = 1; // 启动定时器1
ES = 0;
}
/***********************************************************
* 函数原型: void Init_Time0(void) *
* 函数描述: 初始化定时器0,定时到就读P0口,如果读到的数 *
* 与上一次的不同,设置标志位 *
***********************************************************/
void Init_Time0(void)
{
TMOD = (TMOD&0xF0)|0x01; // 定时器0工作方式1
TH0 = 0x0; // 装计数初值
TL0 = 0x0;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开定时器0中断
EA = 1; // 开总中断
}
//--------------------------------------------------------//
//--------------- 主程序 ---------------//
//--------------------------------------------------------//
void main(void)
{
Init_Serial();
Init_Time0();
while(1)
{
if(ChangeFlag==0x01)
{
SBUF = PreValue; // 将P0口的值送PC显示
while(TI == 0);
TI = 0;
ChangeFlag = 0;
}
}
}
/****************************************************
* 函数原型: void Time0_isr() interrupt 1 *
* 函数描述: 定时器0中断服务程序,读端口P0,然后 *
* 与先前值比较,若不等则置标志位 *
****************************************************/
void Time0_isr() interrupt 1
{
unsigned char Temp;
TH0 = 0x0;
TL0 = 0x0;
P0 = P0|0xFF;
Temp = P0;
if(Temp != PreValue)
{
PreValue = Temp;
ChangeFlag = 0x01;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -