上面那個(gè)8253A的3個(gè)計(jì)數(shù)器全用,下面的那個(gè)8253只用計(jì)數(shù)器0。每個(gè)計(jì)數(shù)器的gate腳通過脈沖信號(hào)選中,就會(huì)對(duì)時(shí)鐘脈沖進(jìn)行計(jì)數(shù)。仿真使用虛擬串口通信時(shí),串口助手得到的數(shù)據(jù)不變是怎么回事,這是做實(shí)驗(yàn)要用的一個(gè)電路,糾結(jié)老長時(shí)間了,實(shí)在不知道錯(cuò)在哪,編譯沒錯(cuò),求高手指導(dǎo)8253的使用或者給出以前做過的項(xiàng)目的例子,小弟在此謝過!程序如下:
01.jpg (659.7 KB, 下載次數(shù): 82)
下載附件
電路圖
2014-11-8 21:05 上傳
#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; //設(shè)定計(jì)數(shù)器1為模式2,定時(shí)器T0工作模式1
SCON=0x50;
PCON=0x80; //波特率加倍
TH1=0xE8;
TL1=0xE8; //設(shè)定波特率為4800,定時(shí)器T1自動(dòng)重新裝載定時(shí)初值
TR1=1; //啟動(dòng)計(jì)數(shù)器
ES=0;
TH0=47104/256;
TL0=47104%256;
EA=1;
ET0=1;
TR0=1; //上面是定時(shí)器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; //對(duì)計(jì)數(shù)器1寫入控制字并賦初值
XBYTE[0x7FFC]=65535;
XBYTE[0x7FFF]=0x72; //對(duì)計(jì)數(shù)器2寫入控制字并賦初值
XBYTE[0x7FFD]=65535;
XBYTE[0x7FFF]=0xB2; //對(duì)計(jì)數(shù)器3寫入控制字并賦初值
XBYTE[0x7FFE]=65535;
XBYTE[0xBFF7]=0x32; //對(duì)計(jì)數(shù)器4寫入控制字并賦初值
XBYTE[0xBFF3]=65535;
P32=1;
Init_com(); //串口初始化
while(1)
{}
}
void timer0() interrupt 1
{
P32=0; //輸出信號(hào)控制晶體管的開斷,實(shí)現(xiàn)對(duì)各計(jì)數(shù)器的復(fù)位
data1=65535-XBYTE[0x7FFC];
data2=65535-XBYTE[0x7FFD];
data3=65535-XBYTE[0x7FFE];
data4=65535-XBYTE[0xBFF3]; //XBYTE[0xAFF3]
send(data1); //發(fā)送計(jì)數(shù)數(shù)據(jù)
send(data2);
send(data3);
send(data4);
TH0=55536/256;
TL0= 55536%256;
P32=1; //開通各計(jì)數(shù)器
}
|