帮我写一个C51程序,利用PWM小灯的亮灯熄灯,来控制静态数码管显示0和1,
时间: 2024-03-19 18:42:10 浏览: 124
51单片机的静态数码管显示程序
4星 · 用户满意度95%
好的,以下是一个基于C51的程序,可以实现PWM小灯的亮灯熄灯,同时控制静态数码管显示0和1:
```
#include <reg52.h> // 引入51单片机常用头文件
sbit led = P1^0; // 定义PWM小灯连接的IO口
sbit digit1 = P2^0; // 定义数码管第1位连接的IO口
sbit digit2 = P2^1; // 定义数码管第2位连接的IO口
sbit digit3 = P2^2; // 定义数码管第3位连接的IO口
sbit digit4 = P2^3; // 定义数码管第4位连接的IO口
unsigned char code segment[]={0xC0, 0xF9}; // 数码管显示0和1的编码
void Timer0Init() // 定时器初始化函数
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器0初值为0xFC67,定时1ms
TL0 = 0x67;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void main()
{
unsigned char count = 0; // 计数器
Timer0Init(); // 初始化定时器
while(1)
{
if(count < 50) // PWM小灯亮50个单位时间
{
led = 1; // PWM小灯亮
}
else // PWM小灯熄灭950个单位时间
{
led = 0; // PWM小灯熄灭
}
if(count < 500) // 数码管显示0,持续500个单位时间
{
digit1 = 0; // 数码管第1位显示0
digit2 = 1; // 数码管第2位关闭
digit3 = 1; // 数码管第3位关闭
digit4 = 1; // 数码管第4位关闭
P0 = segment[0]; // 在第1位显示0
}
else // 数码管显示1,持续500个单位时间
{
digit1 = 1; // 数码管第1位关闭
digit2 = 0; // 数码管第2位显示1
digit3 = 1; // 数码管第3位关闭
digit4 = 1; // 数码管第4位关闭
P0 = segment[1]; // 在第2位显示1
}
count++; // 计数器自增
if(count >= 1000) // 计数器满1000时归零
{
count = 0;
}
}
}
void Timer0() interrupt 1 // 定时器0中断处理函数
{
TH0 = 0xFC; // 重新赋值定时器0初值
TL0 = 0x67;
}
```
这个程序的实现原理是利用定时器产生1ms的定时中断,在定时中断处理函数中控制PWM小灯的亮灯熄灯和静态数码管的显示。程序中将PWM小灯的亮度控制为50/1000,即亮500ms,熄灭500ms,这样就可以实现PWM小灯的呼吸灯效果。同时,程序中将数码管显示0和1的时间控制为500/1000,即显示500ms,不显示500ms。程序中使用的是静态数码管,因此需要通过控制四个数码管位选IO口的高低电平来实现数码管的显示。
阅读全文