基于STC51单片机的霓虹灯

设计要求:

  • 使用PWM驱动8个LED灯
  • 人眼不能观察到灯光全灭
  • 灯光要有动画效果

设计概述:

​  按照设计要求,为了更直观的说明脉冲宽度调制技术(PWM),所以霓虹灯的动画效果为流水灯形式。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的LED灯模块,8个LED灯由P1口来控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。

​​  PWM是一种方波,可以实现数字信号控制模拟电路,它有两个重要参数周期或频率,占空比。占空比 = 高电平时间/周期,最小为0%,最大为100%,通过调整占空比来控制高电平,低电平所占比例,进而调控LED灯的亮灭与明暗变化。STC89C52中P1口为低电平有效,将P1口置0,LED灯亮,置1灯灭。若将P1口的电平输出信号调整成高低电平各占50%,即在一个周期内高电平,低电平所占比例都是50%,P1口控制的LED灯将会明暗闪烁。

​​  市面上的许多51单片机开发板大同小异,都是用P1口控制LED灯,所以在此就不提供智能小车的原理图和实物图。

源代码:

软件模拟PWM方波通常利用定时器来实现。

参考代码1:

#include <reg52.h>
//定义一个全局变量pwm,通过对全局变量的累加来控制PWM的占空比
unsigned int pwm = 0;
/*
利用定时器和I/O口来输出PWM方波实现8个LED灯的明暗变化
*/ /*定时器中断服务函数*/
void Timer0() interrupt 1
{
pwm++;
if(pwm == 500)
{
P1 = 0xfe;//第1盏灯亮
}
else if(pwm == 1000)
{
P1 = 0xff;//第1盏灯灭
}
else if(pwm == 1500)
{
P1 = 0xfd;//第2盏灯亮
}
else if(pwm == 2000)
{
P1 = 0xff;
}
else if(pwm == 2500)
{
P1 = 0xfb;//第3盏灯亮
}
else if(pwm == 3000)
{
P1 = 0xff;
}
else if(pwm == 3500)
{
P1 = 0xf7;//第4盏灯亮
}
else if(pwm == 4000)
{
P1 = 0xff;
}
else if(pwm == 4500)
{
P1 = 0xef;//第5盏灯亮
}
else if(pwm == 5000)
{
P1 = 0xff;
}
else if(pwm == 5500)
{
P1 = 0xdf;//第6盏灯亮
}
else if(pwm == 6000)
{
P1 = 0xff;
}
else if(pwm == 6500)
{
P1 = 0xbf;//第7盏灯亮
}
else if(pwm == 7000)
{
P1 = 0xff;
}
else if(pwm == 7500)
{
P1 = 0x7f;//第8盏灯亮
}
else if(pwm == 8000)
{
P1 = 0xff;
pwm = 0;
}
} void main()
{
TMOD |= 1<<1; //通过移位运算符"<<"来改变位的状态
TMOD &= ~(1<<0); //置定时器/计数器的工作方式为方式2 TMOD &= ~(1<<2); //选择定时工作方式
TMOD &= ~(1<<3); //门控位:由运行控制位TR启动定时器 TL0 = 156;
TH0 = 156; //100us进入一次中断,0.1毫秒 ET0 = 1; //定时器0开中断
EA = 1; //CPU开中断
TR0 = 1; //启动定时器0
while(1) //防止程序跑飞
;
}

参考代码2:

/*第一个文件为自定义头文件
此头文件里声明pwm_led_ctl函数
*/
#ifndef _LED_H
#define _LED_H //控制某一盏灯亮
char pwm_led_ctl(unsigned int led_num);
#endif /*
第二个文件
此源文件用于实现pwm_led_ctl函数
*/
#include <reg52.h>
#include "led.h"
//软件模拟PWM方波,通过变量pwm调控PWM占空比
char pwm_led_ctl(unsigned int led_num)
{
unsigned int pwm;
for(pwm = 0;pwm <= 2000;pwm++)
{
if(pwm == 1000)
{
P1 &= ~(1<<led_num);//通过移位运算符"<<"逐个点亮LED灯
}
else if(pwm == 2000)
{
P1 |= 1<<led_num;
}
}
return 0;
} /*
第三个文件
主函数源文件
*/
#include <reg52.h>
#include "led.h" /*定时器中断服务函数*/
void Timer0() interrupt 1
{
unsigned int i;
for(i=0;i<8;i++)
{
pwm_led_ctl(i);
}
} void main()
{
TMOD |= 1<<1; //通过移位运算符"<<"来改变位的状态
TMOD &= ~(1<<0); //置定时器/计数器的工作方式为方式2 TMOD &= ~(1<<2); //选择定时工作方式
TMOD &= ~(1<<3); //门控位:由运行控制位TR启动定时器 TL0 = 156;
TH0 = 156; //100us进入一次中断,0.1毫秒 ET0 = 1; //定时器0开中断
EA = 1; //CPU开中断
TR0 = 1; //启动定时器0
while(1) //防止程序跑飞
;
}

基于STC51单片机的霓虹灯的更多相关文章

  1. ET 与RETI 基于51单片机中断跳出指令“RETI”浅议

    最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...

  2. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  3. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  4. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  5. 基于51单片机个LCD1602的万年历程序

    小白 第一次跟新博客 基于51单片机和LCD1602的万年历程序 可实现走时和调时功能 有简单的1602菜单制作 欢迎大家交流 LCD1602和51单片机的连接方法 RS = P3^5; //数据/命 ...

  6. 基于51单片机的CAN通讯协议C语言程序

      //-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...

  7. 单片机DIY制作-基于STM32单片机甲醛二氧化碳温度湿度采集系统

    基于STM32单片机甲醛二氧化碳温度湿度采集系统 实践制作DIY-GC008-甲醛二氧化碳温度湿度采集系统 一.功能说明: 基于STM32单片机设计-甲醛二氧化碳温度湿度采集系统 二.功能介绍: 1. ...

  8. 一种基于C51单片机的非抢占式的操作系统架构

    摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Kei ...

  9. 基于ATmgea8单片机设计的加热控制系统(转)

    源:http://blog.163.com/zhaojun_xf/blog/static/3005058020085102562729/ 1 引言 温度是工业生产中主要的被控参数之一,与之相关的各种温 ...

随机推荐

  1. Java JDK 动态代理(AOP)使用及实现原理分析

    一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式U ...

  2. js笔记14

    1.作用域面试题 画图分析 2.DOM document object model 节点树状图 document>documentElement>body>tagname 3.我们常 ...

  3. Springboot下载Excel的3种方式

    Springboot下载Excel的3种方式 汇总一下浏览器下载和代码本地下载实现的3种方式. (其实一般都是在代码生成excel,然后上传到oss,然后传链接给前台,但是我好像没有实现过直接点击就能 ...

  4. Linux中系统时间同步ntpdate简介

    Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步.所 ...

  5. 103、kickstart自动化安装操作系统

    103.1.前言: 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有: 光盘安装系统===>一个 ...

  6. as3.0 Flex 图像处理

    as3.0 Flex 图像处理 已知的一些图像处理,主要是得到颜色过滤矩阵,不完整,大家一起来补充. //颜色转换数组,所有的0都是可调值public var colorArray:Array = [ ...

  7. Docker安装单点RabbitMQ

    环境准备 Centos 7.5 docker环境 安装步骤 拉取镜像 $ docker pull rabbitmq:management 说明: 获取rabbiymq镜像的时候要记得获取managem ...

  8. Laravel + Swoole 打造IM简易聊天室

    最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. (一)扩展安装 pecl install swool ...

  9. JavaWeb中Servlet和Jsp跳转路径的写法

    最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...

  10. hdu 2093 成绩排名

    思路: 没啥思路,就是定义结构体,跟题目,走,当时没想到对那个括号的处理,后面看了题解,才知道用个getchar直接判断 算是一个值得思考的点. 代码: #include<bits/stdc++ ...