秒表-八位数码管显示.doc_第1页
秒表-八位数码管显示.doc_第2页
秒表-八位数码管显示.doc_第3页
秒表-八位数码管显示.doc_第4页
秒表-八位数码管显示.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

秒表-八位数码管显示1 ;* 2 ; 标题: 秒表-八位数码管显示(汇编) 3 ; 作者: wentao 4 ; 5 ; 日期: 2007.3.3 6 ; 软件: Keil A51 V8.00 7 ; 芯片: AT89X51 8 ; 说明: 实验板实测通过,数码管为8位共阳 9 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! 10 ;* 11 12 dot_l equ 30h ;30单元存储百分之一秒值 13 dot_h equ 31h ;31单元存储十分之一秒值 14 sec_l equ 32h ;32单元存储秒个位值 15 sec_h equ 33h ;33单元存储秒十位值 16 min_l equ 34h ;34单元存储分个位值 17 min_h equ 35h ;35单元存储分十位值 18 hou_l equ 36h ;36单元存储时个位值 19 hou_h equ 37h ;37单元存储时十位值 20 21 dot equ 38h ;38单元为百分之一秒计数器(0.00s-0.99s) 22 sec equ 39h ;39单元为秒计数器(00s-59s) 23 min equ 40h ;40单元为分计数器(00m-59m) 24 hou equ 41h ;41单元为时计数器(00h-00h) 25 26 dis_b equ 42h ;dis_b(42单元)作为位码选通数码管 27 dis_r equ 43h ;dis_r(43单元)为取段码时的偏移量 28 29 key_t equ 44h ;44单元为键按下的次数标记 30 31 K bit p1.4 ;K键与P1.4相连 32 33 org 0000h 34 ajmp start 35 org 000bh ;定时器0的中断入口地址 36 ajmp time0 ;跳到定时器0的中断服务程序处 37 org 001bh ;定时器1的中断入口地址 38 ajmp time1 ;跳到定时器1的中断服务程序处 39 org 0030h 40 start: 41 mov p2,#0xff ;关所有数码管 42 mov p1,#0xff ;p1为准双向口,作输入时先写1 43 44 mov dis_b,#0x7f ;初始选通P2.7口数码管 45 mov dis_r,#0 ;初始化偏移量为0 46 mov dot,#0 ;百分之一秒计数器清零 47 mov sec,#0 ;秒计数清零 48 mov min,#0 ;分计数清零 49 mov hou,#0 ;时计数清零 50 mov key_t,#0 ;键按下次数清零 51 52 mov tmod,#00010001b ;定时/计数器0、1工作于方式1 53 mov th0,#0xd8 ;预置定时常数55536(d8f0),产生10ms时基信号 54 mov tl0,#0xf0 55 mov th1,#0xfc ;预置定时常数64536(fc18),产生1ms间隔用于动态显示 56 mov tl1,#0x18 57 58 setb ea ;开总中断 59 setb et0 ;定时/计数器0允许中断 60 setb et1 ;定时/计数器1允许中断 61 clr tr0 ;关定时/计数器0 62 setb tr1 ;开定时/计数器1 63 64 lop: 65 jb K,lop ;键(P1.4)未按下则返回 66 lcall d_10ms ;延时10ms消抖 67 jb K,lop ;是抖动则返回重新扫描 68 jnb K,$ ;等待键松开 69 lcall key_to ;调用键处理部分 70 ajmp lop ;循环显示 71 72 key_to: ;键处理子程序 73 inc key_t ;键按下次数加1 74 mov a,key_t ;按下次数送入a 75 cjne a,#1,key_2 ;不是1次继续检测是否是第2次 76 setb tr0 ;第1次按下启动定时器0 77 ret 78 key_2: cjne a,#2,key_3 ;也不是2次继续检测是否是第3次 79 clr tr0 ;第2次按下关闭定时器0 80 ret 81 key_3: cjne a,#3,back ;也不为3则结束 82 mov dot,#0 ;第3次按下将四个计数器清零 83 mov sec,#0 84 mov min,#0 85 mov hou,#0 86 mov key_t,#0 ;按键次数清零 87 back: ret 88 ;- 89 time0: ;定时器0中断服务程序 90 push psw ;保护现场 91 push acc 92 93 inc dot ;百分之一秒计数器加1 94 mov a,dot ;计数器值送入a 95 cjne a,#100,over ;未计到100则返回继续计数 96 mov dot,#0 ;计到100后清零 97 inc sec ;秒计数器加1(进位10ms*100=1s) 98 mov a,sec ;秒计数值送入a 99 cjne a,#60,over ;未计到60则返回继续计数 100 mov sec,#0 ;计到60后秒计数器清零 101 inc min ;分计数器加1(进位60s=1m) 102 mov a,min ;分计数值送入a 103 cjne a,#60,over ;未计到60则返回继续计数 104 mov min,#0 ;计到60后分计数器清零,重新计时 105 inc hou ;时计数器加1(进位60m=1h) 106 mov a,hou ;时计数器送入a 107 cjne a,#100,over ;未计到100则返回继续计数 108 mov hou,#0 ;计到100后清零 109 110 over: mov th0,#0xd8 ;重置定时常数 111 mov tl0,#0xf0 112 pop acc ;恢复现场 113 pop psw 114 reti ;中断返回 115 ;- 116 time1: ;定时器1中断服务程序 117 push psw ;保护现场 118 push acc 119 push b 120 ;以下是百分之一秒计数器值个位十位分开 121 mov a,dot ;百分之一秒计数器值送入a(被除数) 122 mov b,#10 ;除数10送入b 123 div ab ;a除以b 124 mov dot_l,b ;余数b(百分之一秒值)送入百分之一秒存储单元 125 mov dot_h,a ;商a(十分之一秒值)送入十分之一秒存储单元 126 ;以下是秒计数器值个位十位分开 127 mov a,sec ;秒计数器值送入a(被除数) 128 mov b,#10 ;除数10送入b 129 div ab 130 mov sec_l,b ;余数b(秒个位值)送入秒个位存储单元 131 mov sec_h,a ;商a(秒十位值)送入秒十位存储单元 132 ;以下是分计数器值个位十位分开 133 mov a,min ;分计数器值送入a(被除数) 134 mov b,#10 ;除数10送入b 135 div ab 136 mov min_l,b ;余数b(分个位值)送入分个位存储单元 137 mov min_h,a ;商a(分十位值)送入分十位存储单元 138 ;以下是时计数器值个位十位分开 139 mov a,hou ;时计数器值送入a(被除数) 140 mov b,#10 ;除数10送入b 141 div ab 142 mov hou_l,b ;余数b(小时个位值)送入时个位存储单元 143 mov hou_h,a ;商a(小时十位值)送入时十位存储单元 144 145 mov dptr,#table ;数码管段码表首址送入dptr 146 147 mov a,#dot_l ;取百分之一秒值的地址 148 add a,dis_r ;基址+偏移量 149 mov r0,a ;R0为欲显示值的地址 150 mov a,r0 ;取欲显示值送入a 151 ; dis_r : 0 1 2 3 4 5 6 7 152 ;对应单元: dot_l dot_h sec_l sec_h min_l min_h hou_l hou_h 153 movc a,a+dptr ;取对应值的段码 154 mov p2,dis_b ;位码送入P2口 155 156 mov r0,dis_b ;取位码判断是否为需加小数点的位liuwentao 157 cjne r0,#0xdf,b3 ;不是P2.5再判断是否为P2.3 158 ajmp add_dot ;是P2.5则段码加上小数点显示 159 b3: cjne r0,#0xf7,b1 ;也不是P2.3再判断是否为P2.1 160 ajmp add_dot ;是P2.3则段码加上小数点显示 161 b1: cjne r0,#0xfd,com ;也不是P2.1则正常送段码 162 163 add_dot: anl a,#0x7f ;是P2.5,P2.3,P2.1则段码和7f做与操作使对应位显示小数点 164 com: mov p0,a ;段码送入P0口 165 166 inc dis_r ;偏移量加1,下次中断时显示下个数 167 anl dis_r,#0x07 ;dis_r增到8时自动清0(使之在0到7间循环) 168 169 mov a,dis_b ;位码循环右移,下次中断时选通下个数码管 170 rr a 171 mov dis_b,a 172 173 mov th1,#0xfc ;重置定时常数 174 mov tl1,#0x18 175 176 pop b 177 pop acc ;恢复现场 178 pop psw 179 reti 180 181 d_10ms: mov r5,#20 ;1+(1+2*255)*20+2*20=10.261ms12M 182 temp1: mov r6,#255 ;1+2*255 183 djnz r6,$ 184 djnz r5,temp1 185 ret 186 187 table: db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf ;段码表 188 ; 0 1 2 3 4 5 6 7 8 9 - 对应内容 189 190 end 191 /* 192 * 标题: 八位数码管显示(C51) 193 * 作者: wentao 194 195 * 日期: 2007.3.3 196 * 软件: Keil C51 V8.02 197 * 芯片: AT89X51 198 * 说明: 实验板实测通过,数码管为8位共阳 199 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! 200 */ 201 202 #include 203 #include 204 #define uchar unsigned char 205 206 void delay_ms(uchar ms); / 延时毫秒12M,ms最大值255 207 void key_scan(); / 按键扫描 208 void key_to(); / 按键处理 209 210 uchar code dis_code11 = 0xc0,0xf9,0xa4,0xb0,0x99, /段码表 211 / 0 1 2 3 4 对应内容 212 0x92,0x82,0xf8,0x80,0x90,0xbf; 213 / 5 6 7 8 9 - 214 215 uchar data dis8; / dis0为百分之一秒值,dis1为十分之一秒值 216 / dis2为秒个位值,dis3为秒十位值 217 / dis4为分个位值,dis5为分十位值 218 / dis5为时个位值,dis6为时十位值 219 220 uchar data dot = 0; / 百分之一秒计数器(0.00s-0.99s) 221 uchar data sec = 0; / 秒计数器(00s-59s) 222 uchar data min = 0; / 分计数器(00m-59m) 223 uchar data hou = 0; / 时计数器(00h-99h) 224 225 uchar data dis_b; / dis_b为位码选通数码管 226 uchar data dis_r; / dis_r为取段码时的偏移量 227 228 uchar data key_t = 0; / 按键次数,初始为0 229 230 sbit K = P14; / K键与P1.4相连 231 232 void main() 233 234 P2 = 0xff; / 关所有数码管 235 P1 = 0xff; / p1为准双向口,作输入时先写1 236 dis2 = 10; / -在段码表中偏移量为10 237 dis5 = 10; / -在段码表中偏移量为10 238 dis_b = 0x7f; / 初始选通P2.7口数码管 239 dis_r = 0; / 初始化偏移量为0 240 241 TMOD = 0x11; / 定时/计数器0,1工作于方式1 242 TH0 = 0xd8; / 预置定时常数55536(d8f0),产生10ms时基信号 243 TL0 = 0xf0; 244 TH1 = 0xfc; / 预置定时常数64536(fc18),产生1ms间隔用于动态显示 245 TH1 = 0x18; 246 EA = 1; / 开总中断 247 ET0 = 1; / 定时/计数器0允许中断 248 ET1 = 1; / 定时/计数器1允许中断 249 TR0 = 0; / 关闭定时/计数器0 250 TR1 = 1; / 启动定时/计数器1 251 while(1) 252 253 if(K != 1) / 有键按下 254 255 delay_ms(10); / 延时10ms去抖 256 if(K != 1) / 确定是有键按下 257 258 while(K != 1); / 等待键松开 259 key_to(); / 按键处理 260 261 262 263 264 void key_to() / 按键处理子程序 265 266 key_t+; / 按键次数加1 267 if(key_t = 1) / 第一次按下 268 TR0 = 1; / 启动定时器0 269 else 270 271 if(key_t = 2) / 第二次按下 272 TR0 = 0; / 关闭定时器0 273 else 274 275 if(key_t = 3) / 第三次按下 276 277 dot = 0; / 四个计数器清零 278 sec = 0; 279 min = 0; 280 hou = 0; 281 key_t = 0; / 按键次数清零 282 283 284 285 286 287 void tiem0(void) interrupt 1 / T/C0中断服务程序(产生10ms时基信号) 288 289 dot+; / 百分之一秒计数器加1 290 if(dot = 100) / 计数值到100 291 292 dot = 0; / 清零 293 sec+; / 秒计数器加1(进位10ms*100=1s) 294 if(sec = 60) / 秒计数值到60 295 296 sec = 0; / 秒计数器清零 297 min+; / 分计数器加1(进位60s=1m) 298 if(min = 60) / 分计数到60 299 300 min = 0; / 分计数器清零 301 hou+; / 时计数器加1(进位60m=1h) 302 if(hou = 100) / 时计数器到100 303 hou = 0; / 时计数器清零 304 305 306 307 TH0 = 0xd8; / 重置定时常数 308 TL0 = 0xf0; 309 310 void time1(void) interrupt 3 / T/C1中断服务程序(延时1ms数码管动态显示) 311 312 uchar data t = 0; / 段码临时变量 313 314 dis0 = dot % 10; / 百分之一秒计数器个位分离出来赋绐dis0 315 dis1 = dot / 10; / 百分之一秒计数器十位分离出来赋绐dis1 316 dis2 = sec % 10; / 秒计数器个位赋绐

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论