简单的单片机程序求助(c语言)

发布网友 发布时间:2022-04-22 04:56

我来回答

4个回答

热心网友 时间:2024-02-15 11:16

数码管显示路灯亮的时间是一个常见的应用场景,可以通过单片机来实现。下面是一个简单的C语言程序示例,用于控制数码管显示路灯亮的时间。
```c
#include
sbit D1 = P2^0; // 定义数码管引脚
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(unsigned int time) // 数码管显示函数
{
unsigned int i;
unsigned int digit[4]; // 数码管的四位数值
digit[0] = time / 1000; // 千位
digit[1] = (time % 1000) / 100; // 百位
digit[2] = (time % 100) / 10; // 十位
digit[3] = time % 10; // 个位
for(i = 0; i < 4; i++)
{
switch(i)
{
case 0: D1 = 1; D2 = 0; D3 = 0; D4 = 0; break; // 显示千位
case 1: D1 = 0; D2 = 1; D3 = 0; D4 = 0; break; // 显示百位
case 2: D1 = 0; D2 = 0; D3 = 1; D4 = 0; break; // 显示十位
case 3: D1 = 0; D2 = 0; D3 = 0; D4 = 1; break; // 显示个位
}
P0 = digit[i]; // 设置数码管显示的数值
delay(1); // 延时1ms
P0 = 0x00; // 关闭数码管
}
}
void main()
{
unsigned int time = 0; // 路灯亮的时间,单位为秒
while(1)
{
display(time); // 显示路灯亮的时间
delay(1000); // 延时1秒
time++; // 时间加1秒
}
}
```
上述程序使用了8051系列单片机,通过控制P0口的输出来控制数码管的显示。程序中的`delay`函数用于延时,`display`函数用于显示数码管的数值。`main`函数中的循环不断更新时间并显示在数码管上。
该程序的原理是每隔1秒更新一次时间,并将时间的四位数值分别显示在数码管的四位上。其中,千位显示在D1引脚,百位显示在D2引脚,十位显示在D3引脚,个位显示在D4引脚。通过控制这四个引脚的高低电平,以及P0口的输出,实现数码管的显示。
需要注意的是,上述程序只是一个简单的示例,实际应用中可能需要根据具体的数码管型号和单片机型号进行适当的修改。同时,还需要根据实际需求添加其他功能,比如通过按键控制时间的增减、设置亮灯时间等。

热心网友 时间:2024-02-15 11:16

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

bit red,green,yellow,turnred;//定义红绿黄灯标志位

code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;

P1=0xfc; //红灯亮
red =1;
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0;
delay(300); //短暂延时
P0=Dis_Gewei; //显示个位
P2=1;
delay(300);
}

}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值99

TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒减1
if(second==0)
{ //这里添加定时到0的代码 ,可以是灯电路,继电器吸合等,或者执行一个程序
if(red)
{
red=0;yellow=1;
second=5;
P1=0xF3;//黄灯亮5秒
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=50;
P1=0xCF;//绿灯亮50秒
}
else if(green)
{
yellow=1;green=0;
second=5;
P1=0xF3;//黄灯亮5秒
turnred=1;
}
else if(yellow && turnred)
{
red=1;yellow=0;
P1=0xFC;//红灯亮60秒
second=60;
turnred=0;
}

}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理

}
}

热心网友 时间:2024-02-15 11:17

C51单片机中,可以采用定时器Timer和循环+延时语句(需要估算一个_nop_()操作的时长,然后实现延时函数)两种方式实现延时操作。
记得关注我,有什么问题可以直接向我提问。

热心网友 时间:2024-02-15 11:17

学习了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com