#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit btn=P3^2; sbit led=P1^0; #include<intrins.h> #include <absacc.h> //包含绝对地址访问库函数 #define SEG1 XBYTE[0xffec] #define SEG2 XBYTE[0xffed] #define SEG3 XBYTE[0xffee] #define SEG4 XBYTE[0xffef] typedef unsigned char uint8; typedef unsigned int uint16; //共阳 uint8 code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9 #define CMD 0x00 #define DAT 0x01 #define DataPort P0//LCD数据口 uint16 N=0; uint8 C_50ms; uint8 Z=0; uint8 count=0;//储存定时器T0中断次数 bit flag_1s=0;//计满1秒钟标志位 /**ms级延时子程序**/ void delay(uint16 t) { uint16 a; for(;t>0;t--) for(a=123;a>0;a--); } void all_init() { TMOD=0x01;//设置T0位工作方式1——作为16位定时器 ET0=1;//打开定时器0的中断 TR0=1;//打开定时器0 TH0=(65536-50000)/256;//装入初值 TL0=(65536-50000)%256; IT0=1;//外部中断0为下降沿中断 EX0=1;//打开外部中断 EA=1;//打开总中断 } /*------------------------------------------------ 外部中断程序 ------------------------------------------------*/ /**定时器0中断服务子程序**/ void timer0() interrupt 1 { C_50ms++; if(C_50ms==20) { EX0=0;//关闭外部中断0 C_50ms=0;//定时1s之后C_50ms清零 N=Z*60;//计算转速 Z=0;//初始化圈数 flag_1s=1;//1s标志位置1 TH0=0x3c;//重新赋值 TL0=0xb0; EX0=1;//打开外部中断0,开始计数。 } TH0=(65536-50000)/256; TL0=(65536-50000)%256; } void wai0() interrupt 0 { count++; if(count==2) //两次外部脉冲,电机转一圈。 { Z++;//转圈+1 count=0;//初始计数值 } } /*------------------------------------------------ 主程序 ------------------------------------------------*/ main() { all_init(); while(1){ if(flag_1s==1) { flag_1s=0;//1s标志位清零 SEG4 = smg[N%10]; SEG3 = smg[N/10%10]; SEG2 = smg[N/100%10]; SEG1 = smg[N/1000%10]; } } }