目录

  • 1 项目1  电子琴设计
    • 1.1 课程概述
    • 1.2 蜂鸣器发声
    • 1.3 不同音阶发声和控制
    • 1.4 多功能电子琴
      • 1.4.1 播放一首乐曲的程序编写与仿真
      • 1.4.2 具有多功能电子琴设计与实施
      • 1.4.3 具有多功能电子琴程序编写和仿真
      • 1.4.4 具有多功能电子琴设计--直播程序讲解
  • 2 项目2  LED流水灯设计
    • 2.1 左右依次循环点亮的流水灯设计
    • 2.2 多种花样点亮的流水灯设计
    • 2.3 可调节型多功能亮灯的流水灯设计
  • 3 项目3 直流电机控制
    • 3.1 直流电机的双向转动设计
    • 3.2 转速可调的直流电机转动设计
    • 3.3 多功能直流电机双向转动设计
  • 4 项目4  步进电机控制
    • 4.1 步进电机的双向转动设计
    • 4.2 转速可调的步进电机转动设计
    • 4.3 多功能步进电机双向转动设计
  • 5 项目5 直流电机、步进电机、舵机综合设计
    • 5.1 综合设计
  • 6 项目6 广告灯设计
    • 6.1 在8*8点阵上显示一个字符
    • 6.2 在16*16点阵上显示一个汉字
    • 6.3 在16*16点阵上显示滚动汉字
  • 7 项目7 液晶显示设计
    • 7.1 在1602液晶屏上显示字符
    • 7.2 在1602液晶屏上显示自定义符号和图形
  • 8 电子万年历的制作
    • 8.1 简单万年历的制作
    • 8.2 复杂万年历的制作
    • 8.3 创新万年历的制作
  • 9 作品考核--制作18B20温控风扇
    • 9.1 任务书(拟实现的主要功能)
      • 9.1.1 单片机相关资料
      • 9.1.2 18B20相关资料
      • 9.1.3 PWM脉宽调制资料
      • 9.1.4 74H573介绍
      • 9.1.5 数码管介绍
    • 9.2 原理图、PCB图、焊接图、仿真图
    • 9.3 程序
可调节型多功能亮灯的流水灯设计

1、 可调节型多功能流水灯设计



2、 可调节型多功能流水灯设计--程序编写


3、 可调节型多功能流水灯设计--仿真


4、可调节型多功能流水灯--程序如下:

#include <at89X52.h>

#define uchar unsigned char

#define uint unsigned int


#define LED P2 //8个LED接口

#define KEY P1 //按键接口


sbit INDICATOR = P3^3; //指示灯接口


uchar code led_mod_1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED从左到右点亮

uchar code led_mod_2[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //LED从右到左点亮

uchar code led_mod_3[8] = {0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //从左到右依次点亮

uchar code led_mod_4[8] = {0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //从右到左依次点亮

uchar code led_mod_5[4] = {0xe7,0xc3,0x81,0x00}; //中间两个向傍边点亮

//uchar code led_mod_6[8] = {}; //产生堆积的效果


bit led_mod_select; //LED流水灯模式切换标志,0:手动切换:1:自动切换

uchar time = 50; //计时时间,计时time*10ms

uchar mod_count = 0; //模式计数

uchar output_count = 0; //状态输到LED接口计数


bit stop; //停止/运行标志,0:运行;1:停止

bit suspend; //暂停/继续标志,0:继续;1:暂停


void delay_ms(uint n) //延时函数,单位时间为1ms左右

{

uint i;

uchar j;

for(i=0;i<n;i++)

for(j=0;j<110;j++);

}


void led_output(uchar *led_out,uchar num,uchar *num_count,uchar *led_mod) //向LED接口输出8种状态

{

LED = *(led_out+*num_count);

(*num_count)++;

if(*num_count>=num)

{

*num_count = 0;

if(led_mod_select) //自动切换模式

{  

(*led_mod)++; //切换到下一个模式

}

}

}


uchar key_scan() //按键扫描

{

uchar key_val;

KEY = 0xff;

if(KEY!=0xff)

{

KEY = 0xff;

delay_ms(10); //按键消抖

if(KEY!=0xff)

{

key_val =  KEY;

// key_val = key_val&0x07; //按键只接低3位I/O口,需要屏蔽高5位I/O口

while(KEY!=0xff) //按键是否释放

KEY = 0xff;

return key_val; //返回按键值

}

}

return 0; //无按键按下

}


void key_function() //按键功能

{

uchar val;

val = key_scan();

switch(val)

{

case 0xfe: //上一个模式

if((0==stop)&&(0==suspend))     //处于运行和继续的状态

{

if(led_mod_select==0)

{

mod_count --;

output_count = 0;

}

}

break;

case 0xfd: //下一个模式

if((0==stop)&&(0==suspend))

{

if(led_mod_select==0)

{

mod_count ++;

output_count = 0;

}

}

break;

case 0xfb: //模式切换

if((0==stop)&&(0==suspend))

{

led_mod_select = ~led_mod_select;

INDICATOR = led_mod_select;

output_count = 0;

mod_count = 0;

}

break;

case 0xf7: //时间加

if((0==stop)&&(0==suspend))

{

time = time+10;

if(time>=100)

{

time = 100;

}

}

break;

case 0xef: //时间减

if((0==stop)&&(0==suspend))

{

if(time<10)

{

time = 10;

}

time = time-10;

}

break;

case 0xdf: //暂停/继续

if(0==stop)

{

suspend = ~suspend;

if(suspend)

{

TR0 = 0;

}

else

{

TR0 = 1;

}

}

break;

case 0xbf: //停止/开始

stop = ~stop;

if(stop)

{

TR0 = 0; //定时器停止计数

//初始化变量

LED = 0xff;

led_mod_select = 1;

suspend = 0;

INDICATOR = led_mod_select;

led_mod_select = 1; //LED流水灯自动切换

time = 50; //计时时间,计时time*10ms

mod_count = 0; //模式计数从0开始

output_count = 0; //数组的第一个状态

}

else

{

TR0 = 1; //定时器开始计数

}

break;

case 0x7f:

break;

default:break;

}

}

void main_init() //主函数初始化

{

led_mod_select = 1; //LED流水灯自动切换

TMOD = 0x01; //初始化定时器寄存器

TH0 = (0xffff-10000)/256; //10ms的计时值初值

TL0 = (0xffff-10000)%256;

IE = 0x82;

TR0 = 1;

}


void main() //主函数

{

main_init();

while(1)

{

key_function();

}

}


void led_display() interrupt 1

{

static uchar time_count = 0; //时间计数,单位时间为10ms


TH0 = (0xffff-10000)/256; //重装10ms的计时值

TL0 = (0xffff-10000)%256;

time_count++;

if(time_count>=time)

{

time_count = 0;

switch(mod_count)

{

case 0: led_output(led_mod_1,8,&output_count,&mod_count); break;

case 1: led_output(led_mod_2,8,&output_count,&mod_count); break;

case 2: led_output(led_mod_3,8,&output_count,&mod_count); break;

case 3: led_output(led_mod_4,8,&output_count,&mod_count); break;

case 4: led_output(led_mod_5,4,&output_count,&mod_count); break;

default: mod_count = 0; break;

}

}

}