有一个关于单片机程序的问题,求大神解答,急急急

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit out=P3^7;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;

sbit SCL=P1^2; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P1^3; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P1^0; //CS定义为P1口的第4位脚,连接ADC0832CS脚

uchar h1,date;
unsigned char adval;
void delay(uint z)
{
uchar y;
for(;z>0;z--)
for(y=5;y>0;y--);
}

/***********读数模转换数据********************************************************/
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
// 1 1 0 通道
// 1 1 1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=SGL;
SCL=1; //第二个上升沿
SCL=0;
DO=ODD;
SCL=1; //第三个上升沿
SCL=0; //第三个下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //开始从第四个下降沿接收数据
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校验数据
value1<<=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
return value;
return 0;
}

void penquan() //PWM调压
{
date=ad0832read(1,0);

h1=(255-date);
out=1;
delay(h1);
if(h1>30) led1=1; else led1=0;
if(h1>70) led2=1; else led2=0;
if(h1>100) led3=1; else led3=0;
if(h1>130) led4=1; else led4=0;
if(h1>160) led5=1; else led5=0;
if(h1>180) led6=1; else led6=0;
if(h1>200) led7=1; else led7=0;
if(h1>220) led8=1; else led8=0;

out=0;
delay(date);

}
void main()
{

while(1)
{

penquan(); //给定个延时次数

}
}
这是一个音乐喷泉电路的程序,主要芯片就是ADC0832和AT89C51,有大神看得懂这段程序么?

第1个回答  2016-05-24
首先初始化各个IO口。
delay是个延时函数。

ad0832read是个读ADC的函数,估计ADC0832是用来读取音乐声音大小的。

penquan是最后的功能函数。根据音乐的声音大小,点亮LED灯,声音越大,灯亮的越多。
第2个回答  2016-05-24
应该是调整电位器电压 用8个LED灯来表示电压大小本回答被网友采纳

急求!!!哪位朋友指点下单片机程序题~~
CALL DELAY1 MOV DPTR,#INFO1 ;指针指到显示信息1 MOV A,#1 ;显示在第一行 CALL LCD_SHOW MOV DPTR,#INFO2 ;指针指到显示信息2 MOV A,#2 ;显示在第二行 CALL LCD_SHOW RET;---INFO1: DB " CALCULATOR ",0 ;LCD 第一行显示信息INFO2: DB " ",0 ;LCD 第二行显示信息;---INIT_LCD: ;8...

急!51单片机程序麻烦讲解三句
1、“keyflag=(keyflag+1)%3;”是用来判断按键次数的。keyflag初始值为0,首次按键keyflag加1,对3取余数是1,执行switch语句的case 1;再次按键keyflag加1,对3取余数是2,执行switch语句的case 2;第三次按键keyflag加1,对3取余数是0,执行switch语句的case 0;此时再按键的话,keyflag加1...

单片机习题,急求答案,谁帮帮忙,在下感激不尽!!!
12、关于定时器,若振荡频率为12MHz,在方式1下最大定时时间为(A )。A、8.192ms B、 65.536ms C、 0.256ms D、16.384ms 13、MCS—51单片机的复位信号是( B )有效。A.高电平 B.低电平 C.脉冲 D.下降沿 14、能够用紫外光擦除ROM中程序的只读存储器称为( D...

单片机问题,急求
MOV A, @20H 注:20H如果想取内容,就用(20H),若取20H这个数,用#20H MOV R0, @R2 注:@只给R0、R1用的,是指R0、R1内容作为地址取那个地址的数 MOV 20H, 30H 注:两个存储单元是不能直接复制的,而且储存单元要加括号 MOVX A, @A+DPTR 注:只有下面两种用法:MOVC A,@A+DPTR是...

急急急急急急!!!如果单片机PSW中的Rs1=00,Rs0=01,那么Ro=?求高手啊!
1. 在单片机的PSW(程序状态字)中,RS1和RS0是两位二进制位,它们用于选择寄存器组。当RS1=0且RS0=1时,这表示选择了第1组寄存器。2. 由于RS1和RS0的组合选择了第1组寄存器,R0(通常是第1组中的第一个寄存器)的地址将被设置为08H。3. R0的内容将反映内部数据存储器中08H地址单元的值。4...

单片机问题!急!
你所说的“每次程序都是使用JTAG仿真器和编译软件将程序烧到MCU里”,其实已经将程序烧到单片机中了!不信你拔掉JTAG,然后给单片机上电,它就会自己跑起来的。需要仿真调试的时候才总是需要“JTAG仿真器和编译软件”,不需要调试时只需一次性烧入程序,不执行仿真功能就可以了。

有关单片机的作业题目 初始化并行I\/O芯片8255,使其A口,B口,C口为基 ...
8255是可编程I/O口扩展芯片。对8255输入不同的指令可改变I/O口的工作方式。8255与单片机系统连接方式简单,工作方式由程序设定,图2为8255的引脚图。8255内部有4个寄存器:分别为寄存器A、B、C和控制寄存器。A、B、C寄存器的数据就是引脚PA7~PA0、PB7~PB0、 PC7~PC0上输入或输出的数据。而...

【急】有关单片机的几个问题,求大神!
编写一段程序,实现将片内RAM中从30H开始的连续10个字节的数据传送到50H开始的连续10个字节中。(这个比较搞不懂)MOV R0, #30H MOV R1, #50H MOV R2, #10 LOP:MOV A, @R0 MOV @R1, A INC R0 INC R1 DJNZ R2, LOP END --- 单片机RAM中,(50H)=3CH,写出每条...

...在线等待回答,急···关于 关于分析单片机程序
1.MOV A,30H (A)=( 50h )MOV R1,A (R1)=( 50h )MOV A , @R1 (A)=( 80h )2、请分析下列程序的功能。(1) MOV 60H, 30H 将30h里德数据放到60h里,两个数均代表内存地址 (2) MOV R0, #60H 将立即数60h放到R0中 MOV ...

...的堆栈的作用和操作规律。补考试题,求解,急急急
1.堆栈用于响应中断或调用子程序时保护断点地址,也可通过栈操作指令(push 和pop保护和恢复现场)其中入栈时先SP+1再将内容压入当前SP所指示的堆栈单元 中,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中,再将 SP减1.2.中断允许寄存器的功能是控制CPU对中断的开放和屏蔽以及每个...

相似回答