上面那个8253A的3个计数器全用,下面的那个8253只用计数器0。每个计数器的gate脚通过脉冲信号选中,就会对时钟脉冲进行计数。仿真使用虚拟串口通信时,串口助手得到的数据不变是怎么回事,这是做实验要用的一个电路,纠结老长时间了,实在不知道错在哪,编译没错,求高手指导8253的使用或者给出以前做过的项目的例子,小弟在此谢过!程序如下:
#include<reg51.h>
#include<ctype.h>
#include<intrins.h>
#include<stdio.h>
#include<string.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uint dat,dat1,data1,data2,data3,data4;
sbit P32=P3^2 ;
void Init_com()
{
TMOD=0x21; //设定计数器1为模式2,定时器T0工作模式1
SCON=0x50;
PCON=0x80; //波特率加倍
TH1=0xE8;
TL1=0xE8; //设定波特率为4800,定时器T1自动重新装载定时初值
TR1=1; //启动计数器
ES=0;
TH0=47104/256;
TL0=47104%256;
EA=1;
ET0=1;
TR0=1; //上面是定时器T0的初始化程序
}
void send(dat)
{
SBUF=dat/256;
while(!TI);
TI=0; //RI 清零。
SBUF=dat;
while(!TI);
TI=0; //RI 清零。
}
void main()
{
P32=0;
XBYTE[0x7FFF]=0x32; //对计数器1写入控制字并赋初值
XBYTE[0x7FFC]=65535;
XBYTE[0x7FFF]=0x72; //对计数器2写入控制字并赋初值
XBYTE[0x7FFD]=65535;
XBYTE[0x7FFF]=0xB2; //对计数器3写入控制字并赋初值
XBYTE[0x7FFE]=65535;
XBYTE[0xBFF7]=0x32; //对计数器4写入控制字并赋初值
XBYTE[0xBFF3]=65535;
P32=1;
Init_com(); //串口初始化
while(1)
{}
}
void timer0() interrupt 1
{
P32=0; //输出信号控制晶体管的开断,实现对各计数器的复位
data1=65535-XBYTE[0x7FFC];
data2=65535-XBYTE[0x7FFD];
data3=65535-XBYTE[0x7FFE];
data4=65535-XBYTE[0xBFF3]; //XBYTE[0xAFF3]
send(data1); //发送计数数据
send(data2);
send(data3);
send(data4);
TH0=55536/256;
TL0= 55536%256;
P32=1; //开通各计数器
}
|