基于STC51单片机的霓虹灯
基于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单片机的霓虹灯的更多相关文章
- ET 与RETI 基于51单片机中断跳出指令“RETI”浅议
最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...
- 基于51单片机IIC通信的PCF8591学习笔记
引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
- 基于51单片机个LCD1602的万年历程序
小白 第一次跟新博客 基于51单片机和LCD1602的万年历程序 可实现走时和调时功能 有简单的1602菜单制作 欢迎大家交流 LCD1602和51单片机的连接方法 RS = P3^5; //数据/命 ...
- 基于51单片机的CAN通讯协议C语言程序
//-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...
- 单片机DIY制作-基于STM32单片机甲醛二氧化碳温度湿度采集系统
基于STM32单片机甲醛二氧化碳温度湿度采集系统 实践制作DIY-GC008-甲醛二氧化碳温度湿度采集系统 一.功能说明: 基于STM32单片机设计-甲醛二氧化碳温度湿度采集系统 二.功能介绍: 1. ...
- 一种基于C51单片机的非抢占式的操作系统架构
摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Kei ...
- 基于ATmgea8单片机设计的加热控制系统(转)
源:http://blog.163.com/zhaojun_xf/blog/static/3005058020085102562729/ 1 引言 温度是工业生产中主要的被控参数之一,与之相关的各种温 ...
随机推荐
- Java JDK 动态代理(AOP)使用及实现原理分析
一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式U ...
- js笔记14
1.作用域面试题 画图分析 2.DOM document object model 节点树状图 document>documentElement>body>tagname 3.我们常 ...
- Springboot下载Excel的3种方式
Springboot下载Excel的3种方式 汇总一下浏览器下载和代码本地下载实现的3种方式. (其实一般都是在代码生成excel,然后上传到oss,然后传链接给前台,但是我好像没有实现过直接点击就能 ...
- Linux中系统时间同步ntpdate简介
Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步.所 ...
- 103、kickstart自动化安装操作系统
103.1.前言: 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有: 光盘安装系统===>一个 ...
- as3.0 Flex 图像处理
as3.0 Flex 图像处理 已知的一些图像处理,主要是得到颜色过滤矩阵,不完整,大家一起来补充. //颜色转换数组,所有的0都是可调值public var colorArray:Array = [ ...
- Docker安装单点RabbitMQ
环境准备 Centos 7.5 docker环境 安装步骤 拉取镜像 $ docker pull rabbitmq:management 说明: 获取rabbiymq镜像的时候要记得获取managem ...
- Laravel + Swoole 打造IM简易聊天室
最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. (一)扩展安装 pecl install swool ...
- JavaWeb中Servlet和Jsp跳转路径的写法
最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...
- hdu 2093 成绩排名
思路: 没啥思路,就是定义结构体,跟题目,走,当时没想到对那个括号的处理,后面看了题解,才知道用个getchar直接判断 算是一个值得思考的点. 代码: #include<bits/stdc++ ...