1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| #include<reg51.h> //单片机头文件 #define uint unsigned int #define uchar unsigned char #define CF P0 //宏定义 uint sec=0; //数码管显示同步定义数值sec 后面还会讲 sbit K1=P3^2; //K1复位 就是将运行的程序结束 然后重新开始运行 sbit K2=P3^1; //暂停 sbit K3=P3^0; //开始 sbit LED1=P2^0; sbit LED2=P2^1; sbit LED3=P2^2; //位选定义 sbit LED4=P2^3; uchar disbuff[]={0,0,0,0}; //数码管显示位数的数值数组 uchar const num[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //0-9的共阴显示码 void delay(int s) { uint i,j; for(i=0;i<s;i++) //延时函数 for(j=114;j>0;j--); } void DigDisplay() //显示函数 { LED1=1;LED2=1;LED3=1;LED4=0; //最右边一位开启 也就是个位 CF = disbuff[0]; delay(5); CF=0x00;//消隐 LED1=1;LED2=1;LED3=0;LED4=1; //十位 CF=disbuff[1]; //因为人肉眼的可见变化最小为500ms 这个数码管此刻的变化为微秒级 所以不会看到有不显示的情况 delay(5); CF=0x00; //消隐 LED1=1;LED2=0;LED3=1;LED4=1; //百位 CF=disbuff[2]; delay(5); CF=0x00; //消隐 LED1=0;LED2=1;LED3=1;LED4=1; //千位 CF=disbuff[3]; delay(5); CF=0x00; //消隐 } void Count() //计算函数 { disbuff[0]=num[sec%10]; //个位数字 disbuff[1]=num[sec/10%10]; //十位数字 disbuff[2]=num[sec/100%10]; //百位数字 disbuff[3]=num[sec/1000%10]; //千位数字 } void KEY() //按键函数 { if(K1==0); //启动 delay(10); if(K1==0) {TR0=1;} while(!K1) DigDisplay();Count(); //按键释放 if(K2==0) { delay(5); if(K2==0) { TR0=0; //关闭定时器 } } while(!K2)DigDisplay();Count(); if(K3==0) { delay(10); if(K3==0) { sec=0; TH0=0x3c;//设定T0初始值(高八位) TL0=0xb0; } } } void main() { TMOD=0x11;//设定定时气的工作方式 TH0=0x3c;//设定初始值(高八位) TL0=0xb0;//设定T0初始值(低五位) 设定时间为50ms ET0=1; //内部中断 EA=1; //打开总中断 TR0=1; //启动定时器0 while(1) // while循环 { Count(); //计算 DigDisplay(); //延时 KEY(); } } void time1() interrupt 1 { uchar m; TH0=0x3c; TL0=0xb0; //重新赋初值 m++; //50ms m++ if(m==20) { // 每50ms执行20次也就是一秒 m=0; sec++; //每一秒数码管的显示同步数值加一 if(sec==10000) //因为我们显示只能到9999 所以达到最大显示需要清零 { sec=0; } } }
|