80C51固件,采用Keil for 8051编译器,双LED灯,分别连接P0口和P1口,编写C51源程序,要求实现如下功能:数码管的初始显示值为“00”;当1s产生时,秒计数器加1;秒计数到60时清0,并从“00”重新开始,如此周而复始进行。
时间: 2023-07-16 12:16:56 浏览: 110
数码管显示加一程序(C51程序)
以下是基于Keil for 8051编译器的C51源程序,实现双LED灯和数码管的计时器功能:
```c
#include <reg52.h>
#define LED1 P0_0 // 定义LED1连接的P0.0口
#define LED2 P1_0 // 定义LED2连接的P1.0口
sbit D1 = P2^2; // 数码管数码1连接的P2.2口
sbit D2 = P2^3; // 数码管数码2连接的P2.3口
sbit D3 = P2^4; // 数码管数码3连接的P2.4口
sbit D4 = P2^5; // 数码管数码4连接的P2.5口
sbit S1 = P2^6; // 数码管选择信号1连接的P2.6口
sbit S2 = P2^7; // 数码管选择信号2连接的P2.7口
unsigned char code led_table[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; // LED灯显示表
unsigned char code num_table[] = { // 数码管显示表
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
unsigned char second_cnt = 0; // 秒计数器
unsigned char display_cnt = 0; // 显示计数器
unsigned char display_data[4] = {0, 0, 0, 0}; // 数码管显示数据
void delay_ms(unsigned int ms) // 毫秒级延时函数
{
unsigned int i,j;
for(i=0; i<ms; i++)
for(j=0; j<114; j++);
}
void display() // 数码管显示函数
{
S1 = 1; S2 = 0; P0 = num_table[display_data[0]]; delay_ms(1); // 数码1显示
S1 = 0; S2 = 1; P0 = led_table[display_cnt % 8]; delay_ms(1); // LED1闪烁
S1 = 0; S2 = 0; P0 = 0xFF; delay_ms(1); // 数码2、3、4灭
S1 = 1; S2 = 0; P0 = num_table[display_data[1]]; delay_ms(1); // 数码2显示
S1 = 0; S2 = 1; P0 = led_table[display_cnt % 8]; delay_ms(1); // LED1闪烁
S1 = 0; S2 = 0; P0 = 0xFF; delay_ms(1); // 数码1、3、4灭
S1 = 1; S2 = 0; P0 = num_table[display_data[2]]; delay_ms(1); // 数码3显示
S1 = 0; S2 = 1; P0 = led_table[display_cnt % 8]; delay_ms(1); // LED1闪烁
S1 = 0; S2 = 0; P0 = 0xFF; delay_ms(1); // 数码1、2、4灭
S1 = 1; S2 = 0; P0 = num_table[display_data[3]]; delay_ms(1); // 数码4显示
S1 = 0; S2 = 1; P0 = led_table[display_cnt % 8]; delay_ms(1); // LED1闪烁
S1 = 0; S2 = 0; P0 = 0xFF; delay_ms(1); // 数码1、2、3灭
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位定时器模式)
TH0 = 0xFC; TL0 = 0x18; // 定时1ms
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while (1) // 主循环
{
display(); // 数码管显示函数
}
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC; TL0 = 0x18; // 定时1ms
second_cnt++; // 秒计数器加1
if (second_cnt >= 1000) // 若秒计数到1000,则清0
{
second_cnt = 0;
display_cnt++;
if (display_cnt >= 60) // 若显示计数到60,则清0
{
display_cnt = 0;
display_data[0] = 0;
display_data[1] = 0;
display_data[2] = 0;
display_data[3] = 0;
}
else // 否则秒计数转换为4位BCD码
{
display_data[0] = second_cnt % 10;
display_data[1] = second_cnt / 10;
display_data[2] = display_cnt % 10;
display_data[3] = display_cnt / 10;
}
}
}
```
注:以上代码中,数码管、LED灯和定时器的连接方式需要根据实际硬件连接进行修改。
阅读全文