资源简介
1. 用16盏以上的LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭);
2. 可以用输入按钮在几种灯光效果间切换;
3. 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果;
4. 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换;
5. 使用定时中断延时。
程序中实现了十钟灯光效果,分别是:
顺时针流水灯、逆时针流水灯、交替闪烁、顺时针对角灯、逆时针对角灯、顺时针逐个点亮、顺时针逐个熄灭、逆时针逐个点亮、逆时针逐个熄灭、二进制加法。
代码片段和文件信息
/**************************************************************************************************
模块名称:51单片机彩灯控制器
模块功能:实现十种循环彩灯控制
编写人员:mengkun (http://mkblog.cn)
编写日期:2016/12/18
**************************************************************************************************/
#include
#define false 0
#define true 1
#define uchar unsigned char
#define uint unsigned int
sbit pause_key = P3^0; //暂停按钮
sbit auto_key = P3^1; //手动模式的效果切换
sbit change_key = P3^2; //手动模式效果切换
sbit pauseLed = P3^6; //暂停、启动指示灯
sbit autoLed = P3^7; //自动、手动模式指示灯
int ledCode[8]={0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f}; //led段码(单个显示)
int ledCode2[8]={0xfe0xfc0xf80xf00xe00xc00x800x00}; //led段码(半显示半灭)
int disCode[10]={0x030x9f0x250x0d0x990x490x410x1f0x010x09}; //数码管段码 0~9
void displayLed(void); //显示led的主函数
void keyScan(void); //键盘扫描处理函数
void Delay10ms(unsigned int n); //延时10ms
bit isPause = false; //是否暂停
bit isAuto = true; //是否自动运行
bit isChange = false; //是否要切换下一个效果
uchar time; //计时满0.5s
uchar types; //第几种灯光显示方案
uint counts; //灯光的第几个
/*******************************************************************************
* 函 数 名 : T0_INT
* 函数功能 : T0定时器中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void T0_INT(void) interrupt 1
{
TL0= (65536-50000)/256;
TH0= (65536-50000)%256;
time ++;
if(time >= 10) //定时时间:0.5s
{
time=0;
if(isChange == true) //可以变换下一种显示效果了
{
counts = 0;
types++; //显示下一种效果
if(types > 9) types = 0;
P0 = disCode[types]; //更新数码管显示
isChange = false;
}
displayLed();
counts++;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
TMOD=0x61; //0110 0001 //方式一
TL0= (65536-50000)/256; //50ms
TH0= (65536-50000)%256;
TR0=1; //开启T0
ET0=1; //T0中断允许
EA=1; //总中断开启
time = 0; //定时器时间扩种(0.5s)
counts = 0; //灯光的第几次
types = 0; //灯光显示模式
pauseLed = 0; //暂停指示灯灭
P0 = disCode[types]; //更新数码管显示
while(1)
{
keyScan(); //键盘扫描及处理
}
}
/*******************************************************************************
* 函 数 名 : keyScan
* 函数功能 : 键盘扫描处理
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void keyScan(void)
{
if(pause_key == 0) //按下了暂停按钮
{
Delay10ms(1);
if(pause_key == 0)
{
isPause = ~isPause;
pauseLed = isPause;
if(isPause == true)
{
ET0=0; //关闭T0中断
P0 = 0xfd; //数码管显示 “-”
P1 = 0x00; //所有的灯都亮起来
P2 = 0x00;
}else{
ET0=1; //T0中断允许
P0 = disCode[types]; //更新数码管显示
displayLed();
}
while(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7622 2016-12-18 15:56 main.c
文件 118971 2016-12-18 15:51 1.DSN
文件 3397 2016-12-18 15:42 1.hex
- 上一篇:pic16f877a的跑马灯
- 下一篇:ms12-020 xp补丁
评论
共有 条评论