基于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 引言 温度是工业生产中主要的被控参数之一,与之相关的各种温 ...
随机推荐
- Linux面试题(史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- csp-s模拟测试52-53
留坑.... 改完题再说吧. 留坑....最近考得什么鬼??模拟53T1 u(差分) 一道差分题????然而考场没有想到如何维护斜率上的差分,事后经miemeng和cyf的生(xuan)动(xue)讲 ...
- 【dog与lxy】8.25题解-necklace
necklace 题目描述 可怜的dog最终还是难逃厄运,被迫于lxy签下城下之约.这时候lxy开始刁难dog. Lxy首先向dog炫耀起了自己的财富,他拿出了一段很长的项链.这个项链由n个珠子按顺序 ...
- Jenkins用户权限管理-Role-based Authorization Strategy插件
02-Jenkins用户权限管理-Role-based Authorization Strategy插件 在jenkins的使用过程中,需要给用户分配只管理特定项目的权限来保证项目相关人员只能管理对应 ...
- LevelDB学习笔记 (1):初识LevelDB
LevelDB学习笔记 (1):初识LevelDB 1. 写在前面 1.1 什么是levelDB LevelDB就是一个由Google开源的高效的单机Key/Value存储系统,该存储系统提供了Key ...
- 【spring源码系列】之【Bean的实例化】
人生需要探索的热情.坚持的勇气以及热爱生活热爱自己的力量. 1. Bean的实例化 上一篇讲述了bean的生命周期,其中第一步就涉及到了bean的实例化,本文重点分析bean实例化,先进入源码中的Ab ...
- Jenkins CI&CD 自动化发布项目实战(上篇)
Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...
- 6、负载均衡HAproxy介绍
6.1.常用负载均衡器软件说明: 现在常用的三大开源软件负载均衡器分别是Nginx.HAProxy.LVS. 1.nginx负载均衡的特点: (1)工作在网络的七层之上,可以针对http应用做一些分流 ...
- Sherlock and His Girlfriend题解
题目描述 Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 n件珠宝.第i 件的价值是i+1.那就是说,珠宝的价值分别为2,3,4,-,n+1 . ...
- Linux下的SSH,你知道多少?
Openssh介绍 OpenSSH 是 SSH (Secure Shell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件.而实现此功能的传统方式,如telnet(终 ...