蓝桥杯单片机定时器与中断秒表实验+Proteus仿真
蓝桥杯单片机定时器与中断秒表实验
- Proteus仿真

秒表实验
实验目标:在CT107D单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,具有清零、暂停、启动功能。
实验要求:
- 显示格式为: 分-秒- 0.05秒(即50ms),例:08-26-18表示: 8分 26秒900毫秒。
- 独立按键S4为:暂停|启动;独立按键S5为:清零 ,按键均为按下有效。
程序代码
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| #include "reg52.h"
sbit S4 = P3^3; sbit S5 = P3^2;/\*独立按键\*/
unsigned char t_m = 0;/\*分\*/ unsigned char t_s = 0;/\*秒\*/ unsigned char t_005s = 0;/\*50毫秒\*/
unsigned char code SMG_NoDot[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f};/\*共阳数码管真值\*/
void SelectHC573(unsigned char channel)/\*74HC573锁存器\*/ { switch(channel) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } void DelaySMG(unsigned int t)/\*数码管延时函数\*/ { while(t--); } void DisplaySMG\_Bit(unsigned char value, unsigned char pos)/\*数码管显示函数\*/ { P0 = 0x00; SelectHC573(6); P0 = 0x01 << pos; P2=0x00;//消隐 SelectHC573(7); P0 = value; P2=0x00;//消隐 }
void DisplayTime()/\*设置数码管显示内容\*/ { DisplaySMG\_Bit(SMG_NoDot[t_005s%10],7); DelaySMG(500);
DisplaySMG\_Bit(SMG_NoDot[t_005s/10],6); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[16],5); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[t_s%10],4); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[t_s/10],3); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[16],2); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[t_m%10],1); DelaySMG(500); DisplaySMG\_Bit(SMG_NoDot[t_m/10],0); DelaySMG(500); }
//=============定时器相关函数======================== void InitTimer0() /\*定时器0初始化\*/ { TMOD = 0x01; TH0 = (65535 - 50000) / 256; TL0 = (65535 - 50000) % 256; ET0 = 1; EA = 1; TR0 = 1; }
//定时器中断服务函数 void ServiceTimer0() interrupt 1 //默认中断优先级 1 { TH0 = (65535 - 50000) / 256; TL0 = (65535 - 50000) % 256; t_005s++; if(t_005s == 20) { t_s++; t_005s = 0; if(t_s == 60) { t_m++; t_s = 0; } if(t_m == 99) { t_m = 0; } } } //==================按键相关函数================================= void DelayK(unsigned char t) /\*按键延时函数\*/ { while(t--); } void ScanKeys() /\*按键读值并设置按键功能\*/ { if(S4 == 0) //秒表启动与暂停 { DelayK(100); if(S4 == 0) { TR0 = ~TR0; while(S4 == 0) { DisplayTime(); } } } if(S5 == 0) //秒表清零 { DelayK(100); if(S5 == 0) { t_005s = 0; t_s = 0; t_m = 0; while(S5 == 0) { DisplayTime(); } } } } //==================函数================================= void main() { InitTimer0(); while(1) { DisplayTime(); ScanKeys(); } }
|
仿真资源和程序源码
1 2 3
| 链接:https://pan.baidu.com/s/1hLA69iEetIyEYXpdJ3-7lQ 提取码:4jc7
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!