上面那個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; //開通各計數器
}
|