活动介绍

51单片机中头文件为#include<reg52.h>不用按键控制的数码管显示秒表计时的代码

时间: 2024-04-09 08:27:32 浏览: 220
以下是一个使用51单片机控制数码管显示秒表计时的示例代码: ```c #include <reg52.h> // 定义数码管显示的数字编码 unsigned char code digitCode[] = { 0xC0, // 显示0 0xF9, // 显示1 0xA4, // 显示2 0xB0, // 显示3 0x99, // 显示4 0x92, // 显示5 0x82, // 显示6 0xF8, // 显示7 0x80, // 显示8 0x90 // 显示9 }; // 定义数码管的位选择编码 unsigned char code digitSelect[] = { 0xFE, // 第1位数码管 0xFD, // 第2位数码管 0xFB, // 第3位数码管 0xF7 // 第4位数码管 }; // 定义全局变量 unsigned char second = 0; // 秒数 // 延时函数 void delay(unsigned int count) { unsigned int i, j; for (i = 0; i < count; i++) { for (j = 0; j < 120; j++); } } // 数码管显示函数 void display(unsigned char num) { P2 = digitCode[num]; } // 数码管位选择函数 void selectDigit(unsigned char digit) { P0 = digitSelect[digit]; } // 定时器中断函数 void timer0Interrupt() interrupt 1 { TH0 = (65536 - 50000) / 256; // 定时器初值 TL0 = (65536 - 50000) % 256; second++; // 秒数自增 } // 初始化函数 void init() { TMOD = 0x01; // 设置定时器0为模式1 TH0 = (65536 - 50000) / 256; // 定时器初值 TL0 = (65536 - 50000) % 256; EA = 1; // 打开总中断 ET0 = 1; // 打开定时器0中断 TR0 = 1; // 启动定时器0 } // 主函数 void main() { unsigned char i; init(); // 初始化 while (1) { for (i = 0; i < 4; i++) { selectDigit(i); // 选择位 display(second % 10); // 显示数字 delay(5); // 延时一段时间 } } } ``` 这段代码使用定时器中断来实现秒表计时功能,通过循环选择数码管位,并在每个位上显示秒数的个位数字。请注意,该代码仅供参考,具体的硬件连接和编译环境可能会有所不同,需要根据实际情况进行调整和修改。
阅读全文

相关推荐

帮我解释一下这个代码的每行的具体含义#include <reg51.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char code uchar seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sbit START_SAVE = P3^2; sbit STOP_SHOW = P3^3; uchar second_shi = 0; uchar second_ge = 0; uchar rank = 1; uchar rank_time[9][2]; bit run_flag = 0; bit display_mode = 0; uint timer_count = 0; void delay(uint i){ while(i--); } void timer0_init(){ TMOD = 0x01; TH0 = 0x3C; TL0 = 0xB0; EA = 1; ET0 = 1; } void ext_int_init(){ IT0 = 1; IT1 = 1; EX0 = 1; EX1 = 1; } void display(){ if(display_mode){ P1 = seg[rank_time[rank-1][0]]; P2 = seg[rank_time[rank-1][1]]; } else{ P1 = seg[second_shi]; P2 = seg[second_ge]; } P0 = seg[rank]; } void timer0() interrupt 1{ TH0 = 0x3C; TL0 = 0xB0; timer_count++; if(timer_count == 20){ timer_count = 0; second_ge++; if(second_ge > 9){ second_ge = 0; second_shi++; if(second_shi > 9) second_shi = 0; } } } void int0() interrupt 0{ EX0 = 0; if(!run_flag){ run_flag = 1; display_mode = 0; second_shi = 0; second_ge = 0; rank = 1; TR0 = 1; } else{ if(rank <= 9){ rank_time[rank-1][0] = second_shi; rank_time[rank-1][1] = second_ge; rank++; } } display(); while(!START_SAVE); EX0 = 1; } void int1() interrupt 2 { EX1 = 0; if(run_flag){ run_flag = 0; TR0 = 0; display_mode = 1; rank = 1; } else{ if(display_mode){ rank++; if(rank > 9) rank = 1; } } display(); while(!STOP_SHOW); EX1 = 1; } void main(){ P0 = P1 = P2 = 0xFF; timer0_init(); ext_int_init(); while(1){ display(); } }