#include <AT89X52.H> #define uint unsigned int #define uchar unsigned char uchar code tabel[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 这个数组存放0~9 uint counter;//定义计数器,用来计量脉冲次数 sbit wei_ge=P1^0; //定义引脚 sbit wei_shi=P1^1; sbit wei_bai=P1^2; sbit wei_qian=P1^3; sbit BUZZER=P2^0; void delay_(unsigned int j) { unsigned int k; while (--j!=0) { for (k=0;k<600;k++); } } /* 延时子程序 *******************************************************/ void delay(uint xms) { uint j; for(;xms>0;xms--) for(j=110;j>0;j--); } /* 数码管扫描显示子程序 ************************************************/ void shuma_show(uint date) { uchar ge,shi,bai,qian;// 数码管显示变量声明 ge=date%10;// 个位数换算 shi=date/10%10;// 十位换算 bai=date/100%10;// 百位换算 qian=date/1000;// 千位换算 wei_ge=1;// 打开个位显示 P0=tabel[ge]; // 数据输入数码管内 delay(2);// 延时显示 2ms wei_ge=0;// 关闭个位显示 wei_shi=1;// 打开个位显示 P0=tabel[shi]; // 数据输入数码管内 delay(2);// 延时显示 2ms wei_shi=0;// 关闭个位显示 wei_bai=1;// 打开个位显示 P0=tabel[bai]; // 数据输入数码管内 delay(2);// 延时显示 2ms wei_bai=0;// 关闭个位显示 wei_qian=1;// 打开个位显示 P0=tabel[qian]; // 数据输入数码管内 delay(2);// 延时显示 2ms wei_qian=0;// 关闭个位显示 } /* 初始化子程序 **********************************************************/ void inti() { wei_ge=wei_shi=wei_bai=wei_qian=0;// 各 I/O 口初始化 TMOD=0x05;// 设置计数器 0 工作方式 1 ,为 16 位计数器,且为外部计数 TH0=0;// 计数器高 8 位装 0 TL0=0;// 计数器低 8 位装 0 TR0=1;// 开计数器 } /* 主程序 ***************************************************************/ void main() { BUZZER=0; inti(); while(1) { counter=TH0*255+TL0;// 读计数器数据 } if(counter==1000) { TH0=TL0=0; } // 计满清零 shuma_show(counter);// 数码管扫描显示 if((counter%100==0)&& counter!=0)// 逢百提醒 { BUZZER=1; delay(500); BUZZER=1; } } }
|