系统仿真图
LCD1LM016LVSSVDDVEERSRWE456RV21k233P1.0P1.1P1.2C1U130pF19XTAL17891011121314D0D1D2D3D4D5D6D7RP1123456789RESPACK-8X1晶振18C230pFXTAL29RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C310uR1100293031PSENALEEAU42X1VCC1VCC281P1.0P1.1P1.212345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7X2CRYSTAL3X2RSTSCLKI/O576DS1302单片机C60.1uC70.1uR5Q12k7U2:A(V-)R4680KR82k7R7680k1U3:A274HC1473U3:B474HC145U3:C674HC14U2:A4U2:B4D1LED-REDBUZ1C4(1)8550C410u213C510u65R31k蜂鸣器U2:A(V+)R268k8R668k8R9LM3581kLM358 1
元件清单
名称 STC89C52 30PF电容 10UF电容 1000UF电容 1K电阻 10K电阻 10K电位器 DIP40插座 轻触按键 12M晶振 8550 LED LCD1602 蜂鸣器 板子 铜柱 螺帽 33K电阻 68k电阻 150欧姆电阻 2.7K电阻 680K电阻 0.1UF电容 LM358 DIP插座 光电传感器 74HC14 DIP14插座 USB座子 数量 1 2 3 1 2 1 1 1 5 1 1 1 1 1 1 4 4 1 2 1 2 2 3 1 1 1 1 1 1 1
系统源程序
#include
unsigned char time; //定时器1s计数 unsigned char time1; //定时器15s计数 unsigned int count; //中断计数
unsigned int fre=0; //最后计算的脉搏
unsigned char flag=0;//用于忽略第一次的采样结果。
void timer_init(void) //定时/计数器初始化 {
TMOD=0x66; //计数器0工作工作方式2,自动重装初值 TH0=0; //计数器初值为0 TL0=0;
TR0=1; //计数器开始计数 ET0=1; //打开计数器0中断
TH1=0; //计数器初值为0 TL1=0;
TR1=1; //计数器开始计数 ET1=1; //打开计数器0中断
RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值,
RCAP2L=(65536-62500)%6; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
TH2=RCAP2H; //12M晶振下每次中断62.5ms TL2=RCAP2L;
ET2=1; //打开定时器2中断 TR2=1; //定时器2开始计时 // EA=1; //开总中断 }
void DisplayInit(void) //初始化LCD和时钟的显示,初始化定时器 {
LCDInit();//液晶初始化 timer_init(); //定时器初始化
LCDDispString(1,1,\显示字符串 LCDDispString(0,2,\显示字符串 LCDDispString(9,1,\显示字符串 LCDDispString(9,2,\显示字符串
1
flag=0;//标志位初始化 }
void main(void) //主函数 {
DisplayInit();//初始化
while(1)//死循环 { if(gFunctionCount == 0)//判断是否为正常显示界面 { ;//空操作 } KeyScan();//键盘扫描子函数
} }
//---------------------------------------------------------------- void timer2(void) interrupt 5 //定时器2中断(62.5ms) {
time++;
TF2=0; //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零
if (time==16) //定时1s时间到 {
time=0; //计时清0 time1++;
if(time1 == 15) //15S到 { time1 = 0; EA=0; //关中断 if(flag)//判断是否是第一次测量,第一次测量的结果将舍弃 { fre=(long)count*256+TL0; //count*256强制转换成long型,否则将不产生进位 先判断分频后的 fre=fre*4; if(fre<180) { LCDDispString(0,2,\ /Min\ LCDDispNum(0,2,fre/100); LCDDispNum(1,2,fre/10); LCDDispNum(2,2,fre); LCDDispString(3,2,\
1
相关推荐: