钻石会员
主题
帖子
积分11988
阅读权限50
注册时间2011-1-9
最后登录1970-1-1
在线时间 小时
|
本帖最后由 384065902 于 2013-6-11 07:08 编辑
用小单片机做的,频率12m,要是没有也可用stc89?52之类的。
这是电路图
单片机用的是stc15f104.
因为引脚少所以用的是正反矩阵扫描
灯的扫描顺序是1-4-3-2-5-8-7-6
上面的1234是速度指示,5678是剩余时间,均可指示16种状态,由单个灯闪烁的长短决定。
按钮长按是切换设置,短按是+1.
控制输出是一个低频的pwm调速,场效应管是n沟道的。
下面是程序,基于keil的tiny准系统做的。
//_________________________________________________________________________
include <rtx51tny.h> //频率12M,tiny时钟轮片为200
#include <reg52.h>
sbit NN=P3^2;//-----------------------更改io口时须同时更改job_0中的open_io,以起到消隐作用
sbit PP=P3^3;
sbit NP=P3^1;
sbit PN=P3^0;
sbit PWM=P3^5;
sbit key=P3^4;
sfr p3m1 =0xb1; //io口状态控制寄存器
sfr p3m0 =0xb2;
sfr contr =0xc7;//系统软复位使用的寄存器
char speed =14;//速度变量
char time =16;//计时变量
bit time_end ;//计时结束标志位
bit time_en; //计时判断有效标志位
bit t_stop; //计时停止标志位
char code sm[]={1,1,0,0,1,1,0,0};
char code sd[]={0,8,12,16,20,25,30,35,40,46,52,60,68,76,84,92,100};//非线性16级速度
char buff[8]={0,0,0,0,0,0,0,0}; //八个灯的显示使能位;
// 1,4,3,2,5,8,7,6
void clock(char i)//0.025s delay time
{
while(i--)
os_wait2(2,125);
}
void open_io(char io)//悬空io口,P3.0--P3.3
{
if(io==-1)
{p3m1=0x0f;
p3m0=0x28;}
if(io==0)
{p3m1=0x01;
p3m0=0x2e;}
if(io==1)
{p3m1=0x02;
p3m0=0x2d;}
if(io==2)
{p3m1=0x04;
p3m0=0x2b;}
if(io==3)
{p3m1=0x08;
p3m0=0x27;}
if(io==4)
{p3m1=0x00;
p3m0=0x2f;}
if(io==5)
{p3m1=0x0c;
p3m0=0x23;}
}
void pwm(unsigned char zk)//100级pwm发生器,载波频率22hz。
{
char pwm_js;
pwm_js=pwm_js%100;
if(zk>pwm_js)
PWM=1;
else
PWM=0;
os_wait2(2,2);//(2,x)x=2 F=25hz; x=1 F=50hz.
pwm_js++;
}
void dis_sd(char i)//简易写灯函数
{
if(i==0)
{buff[0]=0;
buff[1]=0;
buff[2]=0;
buff[3]=0;
}
if(i==1)
{buff[0]=1;
buff[1]=0;
buff[2]=0;
buff[3]=0;
}
if(i==2)
{buff[0]=1;
buff[1]=0;
buff[2]=0;
buff[3]=1;
}
if(i==3)
{buff[0]=1;
buff[1]=1;
buff[2]=0;
buff[3]=1;
}
if(i==4)
{buff[0]=1;
buff[1]=1;
buff[2]=1;
buff[3]=1;
}
}
void dis_tm(char i)//简易写灯2
{
if(i==0)
{buff[4]=0;
buff[5]=0;
buff[6]=0;
buff[7]=0;
}
if(i==1)
{buff[4]=1;
buff[5]=0;
buff[6]=0;
buff[7]=0;
}
if(i==2)
{buff[4]=1;
buff[5]=0;
buff[6]=0;
buff[7]=1;
}
if(i==3)
{buff[4]=1;
buff[5]=1;
buff[6]=0;
buff[7]=1;
}
if(i==4)
{buff[4]=1;
buff[5]=1;
buff[6]=1;
buff[7]=1;
}
}
job0 () _task_ 0 { //管4线扫描8个LED
char shu,pn;
os_create_task (1);
os_create_task (2);
os_create_task (4);
p3m0=0x2f;
while (1) {
shu=shu%8;
pn=shu%2;
if(shu<4)
{
if(buff[shu]==1)
{
open_io(5);
PN=pn;
NP=!pn;
open_io(3);
NN=sm[shu];
}
if(buff[shu]==0)
{open_io(5);}
}
else
{
if(buff[shu]==1)
{
open_io(5);
PN=pn;
NP=!pn;
open_io(2);
PP=sm[shu];
}
if(buff[shu]==0)
{open_io(5);}
}
shu++;
os_wait2(2,2);
if(time_end==1)
{open_io(-1);}
}
}
job1 () _task_ 1 { //pwm调用函数
while (1) {
if(time_end==0)
pwm(sd[speed]);
if(time_end==1)
pwm(0);
}
}
job2 () _task_ 2 { //短长按键设置与一些显示效果
char js=0,js2=0;
char set=0;
os_create_task (3);
os_wait2(2,200);
os_delete_task (3);
os_wait2(2,100);
dis_tm(0);
clock(20);
dis_tm(4);
clock(20);
dis_tm(0);
clock(20);
dis_tm(4);
clock(20);
dis_tm(0);
clock(20);
os_create_task (3);
while (1) {
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(4);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
clock(6);
if(key==0)
{
os_delete_task (3);
js2=0;
set++;
set=set%2;
if(set==0)
{
dis_tm(0);
clock(20);
dis_tm(4);
clock(20);
dis_tm(0);
clock(30);
}
if(set==1)
{
dis_sd(0);
clock(20);
dis_sd(4);
clock(20);
dis_sd(0);
clock(30);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
os_create_task (3);
if(js2)
{if(set==0)
{time++;
time=time%18;
}
if(set==1)
{speed++;
speed=speed%17;
if(speed==0)
speed=1;
}
js=0;
}
}
os_wait2(2,200);
os_wait2(2,200);
js++;
js2++;
if(js2)
{js2=1;}
if(js<=50)
time_en=0;
if(js>50)
{time_en=1;
js=51;}
}
}
job3 () _task_ 3 { //闪烁灯式速度(15种)显示与定时(16步)显示
char s_dis,t_dis;
char s_to ,t_to ;
char js=0,t_js=0;;
while (1) {
js=js%4;
s_dis=speed%4;
s_to=speed/4;
t_dis=time%4;
t_to=time/4;
if(s_to==0)
{
if(js<s_dis)
buff[0]=1;
if(js>=s_dis)
dis_sd(s_to);
}
if(s_to==1)
{
if(js<s_dis)
buff[3]=1;
if(js>=s_dis)
dis_sd(s_to);
}
if(s_to==2)
{
if(js<s_dis)
buff[1]=1;
if(js>=s_dis)
dis_sd(s_to);
}
if(s_to==3)
{
if(js<s_dis)
buff[2]=1;
if(js>=s_dis)
dis_sd(s_to);
}
if(s_to==4)
dis_sd(4);
//------------------------------
if(t_to==0)
{
if(js<t_dis)
buff[4]=1;
if(js>=t_dis)
dis_tm(t_to);
}
if(t_to==1)
{
if(js<t_dis)
buff[7]=1;
if(js>=t_dis)
dis_tm(t_to);
}
if(t_to==2)
{
if(js<t_dis)
buff[5]=1;
if(js>=t_dis)
dis_tm(t_to);
}
if(t_to==3)
{
if(js<t_dis)
buff[6]=1;
if(js>=t_dis)
dis_tm(t_to);
}
if(t_to==4)
{ if(t_dis==1)
{buff[4]=1;
buff[5]=1;
buff[6]=0;
buff[7]=0;
t_stop=1;}
if(t_dis==0)
{
dis_tm(4);
}
}
if(time!=17)
{
t_stop=0;
}
js++;
for(t_js=0;t_js<10;t_js++)
{os_wait2(2,125);}
}
}
job4 () _task_ 4 { //定时判断函数
int js;
while(1){
js=5225;
while(js--)
os_wait2(2,200);
while(t_stop)
os_wait2(2,250);
time--;
if(time==-1)
time=0;
if(time_en==1&time==0)
{time_end=1;
while(time_end)
{os_delete_task(1);
os_delete_task(2);
os_delete_task(3);
buff[0]=0;buff[1]=0;buff[2]=0;buff[3]=0;buff[4]=0;buff[5]=0;buff[6]=0;buff[7]=0;
open_io(-1);
PWM=0;os_wait2(2,200);os_wait2(2,200);
if(key==0)
time_end=0;
}
os_wait2(2,250);
contr=contr|0x20;
}
|
评分
-
查看全部评分
|