作者endlessbbs ()
站内ASM
标题Re: [请益] 关於ADC0804讯号撷取的问题
时间Wed Sep 16 15:44:06 2009
小弟把W大给的程式拿去烧录後
发现灯号一开始就会一直亮着四颗
应该是加速规有初始电压的关系
当时小弟自己的写法是以2.5V为基准
2.5V以下就为零
剩下的再用IF去切割成八份量灯
但是W大的写法我不会修改>"<
有嚐试用if去判断,不过不行(应该是我不会用冏)
而且灯号似乎是一口气亮完没有一颗颗的亮上去..冏
有嚐试把延迟的第一个FOR改大一点
结果整个读取就慢下来了Orz
小弟的写法会读不到,猜测有可能是因为这段
else if(B<=0x86)
{
P1=0x00;//P0 = 0000 0000
导致AD一直转换读取0的值
假如不用比较器的话请问程式要怎麽修
假如要加音效让他亮一个灯就逼一声
音效的副程式要怎麽放?(已经有写好音效了只是不知道要怎麽插W大给的主程式里)
我自己适用最笨的写法一个灯号後面就加一个副程式
那个B=P2是令B为暂存器
想说存进去在读取会不会比较顺
但是没有效果= =
不好意思,一口气问这麽多问题,还请各位前辈不吝指教>"<
下面是小弟自己写的全部程式
#include <reg51.h>
#include <stdlib.h>
void delay150us();//宣告ADC读取延迟副程式
void delay90();//灯号延迟1~2秒副程式
void delay_fun(); //LED一颗一颗亮上去延迟副程式
sbit ADCRD=P3^7 ;//设ADCRD脚位为P3.7
sbit ADCWR=P3^6 ;//设ADCWR脚位为P3.6
sbit ADCINTR=P3^2;//设ADCINTR脚位为P3.2
sbit spk=P0^0;//喇叭控制定义位元
unsigned char hi, lo;
unsigned char thi[]={0,223,229,232,233,236,238,240,241,242,244,246,247,247};//音阶对应计时器0计数初值高位元组资料列表
unsigned char tlo[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};//音阶对应计时器0计数初值低位元组资料列表
unsigned char song[]={3,5,5,3,2,1,2,3,5,3,2,3,5,5,3,2,1,2,3,2,1,1,100};//旋律
unsigned char len[]={1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,100};//拍子
delay(int d)
{
int i,j;
for(i=0;i<d;i++)
for(j=0;j<200;j++);
}
void t0isr(void)interrupt 1
{
TH0=hi;
TL0=lo;
spk=~spk;
}
init_timer()
{
TMOD=0x00;
IE=0X82;
}
tone(char t, char l)
{
hi=thi[t];
lo=tlo[t];
TR0=1;
delay(100*l);
TR0=0;
}
play_song(char*t,char*l)
{
while(1)
{
if(*t==100)break;
tone(*t++,*l++);
delay(5);
}
}
main()
{
init_timer();
{
play_song(song,len);
}
spk=0;
while(1)
{
ADCWR=0 ; ADCWR= 1 ;
ADCRD=0 ;
delay111us();
B=P2;
ADCRD=1 ;
if(B>=0xF0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
P1=0x7F;//P0 = 0111 1111
be();
delay_fun();
P1=0xFF;//P0 = 1111 1111
be();
delay_fun();
}
else if(B<=0xEF&&B>=0xE0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
P1=0x7F;//P0 = 0111 1111
be();
delay_fun();
}
else if(B<=0xDF&&B>=0xD0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
}
else if(B<=0xCF&&B>=0xC0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
}
else if(B<=0xBF&&B>=0xB0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
}
else if(B<=0xAF&&B>=0xA0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
}
else if(B<=0x9F&&B>=0x90)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
}
else if(B<=0x8F&&B>=0x87)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
}
else if(B<=0x86)
{
P1=0x00;//P0 = 0000 0000
}
ADCRD=1 ;
delay90();
}
}
void delay111us()
{
int i=0 ;
for(i=0 ; i < 18; i++) ;
}
void delay90()
{
int s,i,k;
for(s=0;s<550;s++)
for(k=0;k<10;k++)
for(i=0;i<12;i++);
}
void delay_fun()
{
int i,k;
for(k=0;k<70;k++)
for(i=0;i<1000;i++);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.134.32.181
※ 编辑: endlessbbs 来自: 140.134.32.181 (09/16 15:50)
※ 编辑: endlessbbs 来自: 140.134.32.181 (09/16 15:53)
※ 编辑: endlessbbs 来自: 118.170.96.229 (09/16 17:37)