编写C51主程序用 for 循环实现 1-20 连加的和,并送 P0 口上的8位LED显示。
时间: 2023-05-22 16:07:03 浏览: 137
好的,以下是实现该功能的C51主程序代码:
```c
#include <reg52.h>
void main() {
int sum = 0;
int i;
for (i = 1; i <= 20; i++) {
sum += i;
}
P0 = sum;
}
```
这个程序使用 for 循环计算 1-20 的和,并将结果显示在 P0 口上的 8 位 LED 上。
相关问题
80C51固件,采用Keil for 8051编译器,双LED灯,分别连接P0口和P1口,编写C51源程序,要求实现如下功能:数码管的初始显示值为“00”;当1s产生时,秒计数器加1;秒计数到60时清0,并从“00”重新开始,如此周而复始进行。
以下是基于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灯和定时器的连接方式需要根据实际硬件连接进行修改。
单片机p0口接8个LED c51语言,51单片机P1口接8个LED灯,低电平点亮,用定时器1定时250ms,让着8个LED不停闪烁,编写完整的C程序。...
这道题目和之前的题目非常相似,只不过将LED灯的连接口从P0换成了P1。以下是相应的C语言代码:
```c
#include <reg51.h> // 51单片机的寄存器定义
// 定义8个LED灯的IO口
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit LED5 = P0^4;
sbit LED6 = P0^5;
sbit LED7 = P0^6;
sbit LED8 = P0^7;
sbit LED9 = P1^0;
sbit LED10 = P1^1;
sbit LED11 = P1^2;
sbit LED12 = P1^3;
sbit LED13 = P1^4;
sbit LED14 = P1^5;
sbit LED15 = P1^6;
sbit LED16 = P1^7;
// 定义定时器1的初值
#define TH1_INIT 0xFD
#define TL1_INIT 0x4B
// 定时器1中断服务函数
void timer1_isr(void) interrupt 3 using 1
{
static unsigned char cnt = 0; // 计数器
TH1 = TH1_INIT;
TL1 = TL1_INIT; // 重新加载初值
cnt++;
switch(cnt)
{
case 1:
LED1 = !LED1;
break;
case 2:
LED2 = !LED2;
break;
case 3:
LED3 = !LED3;
break;
case 4:
LED4 = !LED4;
break;
case 5:
LED5 = !LED5;
break;
case 6:
LED6 = !LED6;
break;
case 7:
LED7 = !LED7;
break;
case 8:
LED8 = !LED8;
LED9 = !LED9;
LED10 = !LED10;
LED11 = !LED11;
LED12 = !LED12;
LED13 = !LED13;
LED14 = !LED14;
LED15 = !LED15;
LED16 = !LED16;
cnt = 0; // 计数器清零
break;
}
}
void main()
{
TMOD = 0x10; // 定时器1工作在模式1,16位定时器
TH1 = TH1_INIT;
TL1 = TL1_INIT; // 初始值
ET1 = 1; // 开启定时器1中断
TR1 = 1; // 启动定时器1
EA = 1; // 开启总中断
while(1)
{
// 程序主循环
}
}
```
同样需要注意的是,定时器1的初值需要根据实际情况设置,以满足250ms的要求。另外,定时器1中断服务函数中的LED闪烁顺序可以根据需要进行调整。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)