📄 8051与8253测速.c
字号:
#include<AT89X51.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CT1 0x7d00 /*8253计数器#1端口地址*/
#define CT2 0x7e00 /*8253计数器#2端口地址*/
#define CWR 0x7f00 /*8253计数器CWR控制字端口地址*/
sfr WDTRST = 0xA6;
code uchar NH=0x1f,NL=0xff; /*8253#1、#2的初值为8192,即2的13次*/
code uchar dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*共阳段码*/
char xdata *com_ct1=CT1,*com_ct2=CT2,*com_cwr=CWR;
void delay(void)
{
uint i;
for(i=2500;i>0;i--)
;
}
void main(void)
{
/********定义与转速计算有关的值********/
uint data k1,k2; /*8253#1和#2的计数值*/
uchar data temH1,temL1,temH2,temL2; /*8253#1和#2锁存值*/
ulong data m,n; /*计数值和转速值*/
uchar data ng,ns,nb,nq; /*转速值的个、十、百、千位*/
/*8253与显示初始化,设定三通初值、工作方式*/
*com_cwr= 0x74 ; /*8253#1工作方式2,二进制计数*/
*com_ct1= NL ; /*先写低8位,再写高8位*/
*com_ct1= NH ;
*com_cwr= 0xb4 ; /*8253#2工作方式2,二进制计数*/
*com_ct2= NL ;
*com_ct2= NH ;
WDTRST=0x1E; /*初始化看门狗*/
WDTRST=0xE1;
IE=0x81; /*只允许INT0中断*/
IT0=1; /*选择INT0脉冲触发方式*/
}
/************** 外部中断0*****************/
void INT_INT0 (void) interrupt IE0_VECTOR
{
*com_cwr= 0x44 ; /*锁存#1和#2的值*/
*com_cwr= 0x84 ;
temL1=*com_ct1; /*先读低8位,再读高8位*/
temH1=*com_ct1;
temL2=*com_ct2;
temH2=*com_ct2;
*com_cwr= 0x74 ; /*8253#1和#2重新置初值并计数*/
*com_ct1= NL ; /*先写低8位,再写高8位*/
*com_ct1= NH ;
*com_cwr= 0xb4 ;
*com_ct2= NL ;
*com_ct2= NH ;
k1=0x2000 - temH1<<8-temL1; /*存储计数值*/
k2=0x2000 - temH2<<8-temL2;
m=k2<<13+k1; /*计算ALE脉冲的计数值*/
n=120000000/m; /*计算转速值*/
nq=n/1000; /*存储转速值*/
nb=n/100%10;
ns=n%100/10;
ng=n%10;
/************** 显示程序 *****************/
do
{
WDTRST=0x1E; /*喂狗指令*/
WDTRST=0xE1;
P3_5=1; P3_3=0; P3_1=0; P3_0=0; /*显示千位*/
P1=dispcode[nq];
delay();
P3_5=0; P3_3=1; P3_1=0; P3_0=0; /*显示百位*/
P1=dispcode[nb];
delay();
P3_5=0; P3_3=0; P3_1=1; P3_0=0; /*显示十位*/
P1=dispcode[ns];
delay();
P3_5=0; P3_3=0; P3_1=0; P3_0=1; /*显示个位*/
P1=dispcode[ng];
delay();
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -