代码开源!PCB布线简单,就不发上来献丑!
电路原理图如下:
单片机源程序如下:
#include "reg51.h" typedef unsigned int u16;//对数据类型进行声明定义 typedef unsigned char u8;//对数据类型进行声明定义 sbit P30=P3^1; //数码管第2位 sbit P31=P3^0; //数码管第1位 sbit k1=P3^4; //将单片机的P3.4端口定义为时间加 sbit k2=P3^5; //将单片机的P3.5端口定义为时间减 sbit k3=P3^7; //将单片机的P3.7端口定义为启动 sbit out=P3^3; //驱动脉冲输出 //数码管真值表// u8 code LED_CODE[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //共阳数码管显示0~F的段码 u16 Cntms1=0,Cntms2=0,num1,num2;ke; u8 num; //定时变量=毫秒 void Delay(unsigned long int t) { while(--t); } /*****************************************************加按键检测*****************************************************/ /*当此函数检测到有效按键时返回1,没有检测到有效值时返回0*/ bit key0(void) { static unsigned char a = 0; if(k1 == 0) { if(a < 50) a++; } else a = 0; if(a == 49) return 1; else return 0; } /*****************************************************减按键检测*****************************************************/ /*当此函数检测到有效按键时返回1,没有检测到有效值时返回0*/ bit key1(void) { static unsigned char i = 0; if(k2 == 0) { if(i < 50) i++; } else i = 0; if(i == 49) return 1; else return 0; } /*****************************************************启动按键检测*****************************************************/ /*当此函数检测到有效按键时返回1,没有检测到有效值时返回0*/ bit key2(void) { static unsigned int l = 0; //定义静态变量,用来记录延时计数. if(k3 == 0) // K3(按下-松开)当K3为低电平时记数变量开始自增.i计数达到99输出有效值1 未达到99时输出0 { if(l <1000) //如果按键计数值小于1000 l++; //那么计数自增 } else //K3高电平i清0 l = 0; if(l == 999) //如果变量i的值累加到999, return 1; //就返回1,说明已检测到的按键有效 else return 0; //返回0,说明检测到按键值无效 } /************************************************************************************************************** 数码管动态显示程序 **************************************************************************************************************/ void display() { static u8 i=0; if(i==0) { P30=1; P31=0; P1=LED_CODE[num/10]; for(ke = 0;ke <100;ke++); P31=1; P1=0Xff; i=1; } else { P30=0; P31=1; P1=LED_CODE[num%10]; for(ke = 0;ke <100;ke++); P30=1; P1=0Xff; i=0; } } //****************************************************主函数****************************************************// void main() { bit m = 0,m1 = 0,m2=0; //声明一个位变量.存储按键状态. unsigned char i; out=0; //初始化输出端口 num=30;//定时变量赋初值 k1 = 1; //加按键输入端口电平置高 k2 = 1; //减按键输入端口电平置高 k3 = 1; while(1) //主循环 { m = key0(); //采集加按键 m1 = key1(); //采集减按键 m2 = key2(); //采集按键 if(m == 1) //如果采集到加按键值. { if(num < 99) num++; //计数自增 } if(m1 == 1) //如果采集到减按键值. { if(num >1) num--; //计数自减 } if(m2 == 1) { for(i=0;i<2;i++) //for循环大括号中的程序循环执行2次 { out=1; //将P3.3口赋值 1,对外输出高电平 Delay(num*50); //调用延时程序;更改延时数字可以更改延时长度;用于改变输出脉冲时间 out=0; //将P3.3口赋值 0,对外输出低电平 Delay(3000); } } display();//显示数值 } }
复制代码