📄 main.c
字号:
#pragma large
#include "public.h"
sfr T2MOD = 0xC9;
void Delay(UINT ms)
{
UINT i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<100;j++)
{
_nop_();
}
}
}
void SetupComm0Para(ULONG iBaudRate)
{
//tm= 256 - (oscFrequency/32/6/iBaudRate);
//TL1=tm; //定时器1作为串口1的波特率发生器,公式:bps=11059200/32/12/(256-TH1) 接 9600波特率 目前在89c54中使用了双倍速,这里公式中除12改为除6
//TH1=tm; //
unsigned short T2Time;
T2CON=0x30;//bps mode
T2Time= maxOverFlow - (oscFrequency/16/iBaudRate)+1; // T2=0ffffh-(11059200/(bps*16*2)),相同时不溢出。所有加一
TL2=T2Time&0xFF;
TH2=(T2Time&0xff00)>>8;
RCAP2L=T2Time&0xFF;
RCAP2H=(T2Time&0xFF00)>>8;
REN=1; //允许串口接收位
PS =0; //串行口中断声明为高优先级中断
PSH = 1; //优先级1
ES= 1; //允许串行口中断
//TR1=1; //开定时器1
TR2=1;
}
void initTimer1()
{
TH1=0x2C; //25ms 中断
TL1=0x0c;
TMOD&=0x0F;
TMOD|=0x10; //模式1 16位定时器
PT1=0;
PT1H=0;
ET1=1;//运行中断
TR1=1;
}
main()
{
UCHAR xdata flag;
UCHAR xdata tmp;
//CKCON=0xc1;//12分频
//PMR=0x40;
/*
表1 TMOD寄存器结构 定时/计数器的方式控制字TMOD,字节地址为89H
D7 D6 D5 D4 D3 D2 D1 D0
GATA C/T M1 M0 GATA C/T M1 M0
←T1方式字段→ ←T0方式字段→
定时器 模式 M1 M0
0 0 13位定时计数器
0 1 16位定时/计数器
1 0 8位自动重装载定时器 可用作波特率发生器
1 1 定时器0 可以分为两个8位定时器,定时器1只能工作在模式0,1,2
TCON 结构 定时器控制积存器TCON,字节地址为88H,位地址为88H—8FH
D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 一次为 T1中断标志 T1允许 T0中断标志 T0允许 外部中断1请求标志 外部中断1类型
表3 IE寄存器结构 中断允许寄存器
IE D7 D6 D5 D4 D3 D2 D1 D0
EA - ET2 ES ET1 EX1 ET0 EX0 Et2 为89c54 的定时器2
位地址 AFH ACH ABH AAH A9H A8H
· EA:中断总控制位,EA=1,CPU开放中断。EA=0,CPU禁止所有中断。
· ES:串行口中断控制位,ES=1允许串行口中断,ES=0,屏蔽串行口中断。
· ET1:定时/计数器T1中断控制位。ET1=1,允许T1中断,ET1=0,禁止T1中断。
· EX1:外中断1中断控制位,EX1=1,允许外中断1中断,EX1=0,禁止外中断1中断。
· ET0:定时/计数器T0中断控制位。ET1=1,允许T0中断,ET1=0,禁止T0中断。
· EX0:外中断0中断控制位,EX1=1,允许外中断0中断,EX1=0,禁止外中断0中断。
SCON D7 D6 D5 D4 D3 D2 D1 D0 串口控制
SM0 SM1 SM2 REN TB8 RB8 TI RI
1).SM0、SM1:串行口工作方式控制位。
SM0,SM1 工作方式
00 方式0
01 方式1
10 方式2
11 方式3
(2).SM2:多机通信控制位。
多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3).REN:允许接收位。
REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4).TB8:发送接收数据位8。
在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5).RB8:接收数据位8。
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6).TI:发送中断标志位。
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
(7).RI:接收中断标志位。
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
*/
if(P3_5==0)
P3_5=1;
else
P3_5=0;
TMOD=0x00; //定时器0处于定时器模式3 8位定时器 定时器1处于模式2 8位自动重装载模式
PCON=0x00; //波特率不倍增
SCON=0x40; //串口0工作在模式1 SM1 SM0=0 1 1位起始 8位数据 1位停止
SP=0xa0; //define the stack pointer//
SetupComm0Para(9600); //打开串口0
initTimer1();
EA= 1;//开中断
KeyInit();
flag=0;
while(1)
{
gMainLoopTimeOut =20;
tmp=keyproc();
if(tmp!=0)
{
//WriteTxBuf(tmp);
SBUF=tmp;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -