资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
/基于 51 单片机的八位数字秒表 /开发语言:C51 /所选芯片:AT89S51 /开发者:jnu.bluecoffee /开发日期:2009 年 6 月 18 日 /小弟刚刚入道,完全原创。如有转载,请注明出处。#include #include #define DIG_NONE 0xff; #define DIG_1 0x7f #define DIG_2 0xbf #define DIG_3 0xdf #define DIG_4 0xef #define DIG_5 0xf7 #define DIG_6 0xfb #define DIG_7 0xfd #define DIG_8 0xfe#define LINE 0xf7/根据共阴共阳以及接法要调整typedef unsigned char Byte; typedef bit bool;sbit START = P30; sbit RESET = P31;Byte data dis_digit; Byte data min; Byte data sec; Byte data msec; bool data isStarted; Byte data dis_digit; Byte data dis_index; Byte data dis_buff8; Byte data dis_num8;/根据共阴共阳以及数码管接法这里要的表要调整 Byte code number11= 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff;/0,1,2,3,4,5,6,7,8,9,关显示,数码管码表 Byte dis_buff8; / 显示缓冲区 Byte dis_num8; / 秒计数值, BCD 码 Byte dis_index;bit Scan_Key(); void Proc_Key(); void Delayms(Byte ms); void Update_buff(); void Msec_Increment(); void Reset(void);bool Get_Key(bit key);/有效为 1 void MCU_Init(void); void Timer0_Overflow(); void Timer1_Overflow();/sbit K1 = P32;void Msec_Increment()/中断里面的设置 msec += 1; if (msec = 100) msec = 0; sec += 1; if (sec = 60) sec = 0; min += 1; if (min = 60) min = 0; void MCU_Init() P1 = 0xff; P2 = 0xff;TMOD = 0x12; TH1 = 0xd8; TL1 = 0xf0; TH0 = 0x9c; TL0 = 0x00;/定时器 1 选用方式 1 工作,扫描周期 0.01s=10ms,定时器 0 选用工作方式 3 工作, 自动装入,扫描周期 0.1ms=100sReset();min = 0; sec = 0; msec = 0;dis_digit = 0x7f; / 初始显示 P20 口数码管 dis_index = 0;IE = 0x8a; / 使能 timer0, timer1 中断TR0 = 1; TR1 = 0;isStarted = 0; void Reset() min = 0; sec = 0; msec = 0; Update_buff(); void Update_buff() dis_num0 = min / 10; dis_num1 = min % 10; dis_num3 = sec / 10; dis_num4 = sec % 10; dis_num6 = msec / 10; dis_num7 = msec % 10;/这里根据数码管的顺序进行调整 dis_buff0 = numberdis_num7; dis_buff1 = numberdis_num6; dis_buff2 = LINE; dis_buff3 = numberdis_num4; dis_buff4 = numberdis_num3; dis_buff5 = LINE; dis_buff6 = numberdis_num1;dis_buff7 = numberdis_num0; bool Get_Key(bit key)/有效为 1,这里按下为低电平 if (key = 0) return 1; else return 0; void timer0() interrupt 1 P2 = 0xff; / 先关闭所有数码管 P1 = dis_buffdis_index; / 显示代码传送到 P0 口 P2 = dis_digit; / dis_digit = _cror_(dis_digit,1); / 位选通值右移(P20-P27), 下次中断 时选通下一位数码管 /_cror_()为字符循环右移函数 dis_index+; / dis_index / 8 个数码管全部扫描完一遍之后,再回到第一个开始下一次 扫描 void timer1() interrupt 3 TH1 = 0xd8; TL1 = 0xf0; Msec_Increment(); Update_buff(); void delayms(unsigned char ms) / 延时子程序 unsigned char i; while(ms-) for(i = 0; i 120; i+); void main(void) bool startkey, resetkey; MCU_Init(); while(1) startkey = Get_Key(START); resetkey = Get_Key(RESET);if (startkey = 1) Delayms(50); startkey = Get_Key(START); if (startkey = 1) isStarted = !isStarted; TR1 = !TR1; if (resetkey = 1 resetkey = Get_Key(RESET); if (resetkey = 1
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号