想做一个根据光照调节亮度的LED灯
pwm调节亮度和adc0832的数据输出是两个子程序
分别拿来测试都测试不行 更别说组合起来了..
输出都为P1口 接了8个发光二极管每个二极管都串联了1K的电阻
adc0832是打算读取光照传感器的数据直接在P1输出 这是测试一
程序就是网上找的 自己也写过 时序也对照过了 应该是没问题的
可是仿真的时候改变传感器光照输出的数据也没有变化
在实物上也一样 改变光照也是输出的灯的个数都是没有变化的
adc0832的程序如下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit DO=P2^2;
sbit CLK=P2^0;
sbit DI=P2^1;
sbit CS=P2^3;
uchar adc0832_data()
{
uchar i,Dat1=0,Dat2=0;
CLK = 0;DI = 1;CS = 0;_nop_();CLK = 1;//第一个上升沿
CLK = 0;DI = 1;_nop_();CLK = 1;//第二个上升沿 DI=1表示 双通道 单极性 输入
CLK = 0;DI = 0;_nop_();CLK = 1;//第三个上升沿 DI=0表示选择通道1(CH0)
_nop_();CLK = 0;//第四个下降沿 开始输出转换数据
for(i=0;i<8;i++)//读取8位数据
{
CLK = 1;
CLK = 0;
_nop_();
if(DO) Dat1|=0x80>>i;
}
for(i=0;i<8;i++)//读取8位相反数据
{
if(DO) Dat2|=0x01<<i;
CLK = 1;
CLK = 0;
_nop_();
}
CS = 1;DI = 1; CLK = 1;//读取完成释放总线
if(Dat1==Dat2)//数据效验如果正确则返回读取数据
return Dat1;
}
void main()
{
uchar a;
while(1)
{
a=adc0832_data();
P1=a;};}
至于pwm调节亮度子程序测试的方法是打算运用定时器完成从最亮到最暗的变化
程序如下
#include<reg52.h>
#define uint unsigned int
uint LEVEL=10;
void LIGHT(void) //PWM点亮程序
{
uint n;
for(n=0;n<10;n++) //10级
{
if(n<=LEVEL)
P1=0x00;
if(n>LEVEL) //调整占空比
P1=0xff;}
}
void main()
{
TMOD=0x01; //T0中断1
TR0=1;
ET0=1;
TH0=(65535-50000)/256;TL0=(65535-50000)%256; //刷新率20HZ
EA=1;
while(1)
{LIGHT();};}
void T0_test(void) interrupt 1
{
TH0=(65535-50000)/256;TL0=(65535-50000)%256;
if(LEVEL=0)LEVEL=10;
LEVEL--;
}
仿真时所有的led都是恒定亮度 电压也没有变化 实物也是
不知道问题出在哪 纠结了很久了 求大神们解答
另外 因为纠结这些问题太久了开始怀疑自己的逻辑
按照课本上的一些程序直接输到keil中然后用protues模拟以及输入52中
都得不到应该有的结果
比如说这个程序
#include"reg52.h"
sbit PWM=P1^0;//定义输出脚
void main()
{
TMOD=0x01; //定时器0工作方式1
TH0=(65536-10000)/256; //12M晶振10MS计时常数
TL0=(65536-10000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1);
}
//中断函数,启动后每10MS进入一次中断
void T0_time(void) interrupt 1
{
TH0=(65536-10000)/256; //12M晶振10MS计时常数
TL0=(65536-10000)%256;
if(PWM)PWM=0; //输出脚取反
else PWM=1;
}
虽然说我的晶振是11.0592M的但这也应该就影响个时间吧
完全不明白为什么会仿真无结果以及无法在单片机上得出结果
已经快崩溃了....
是不是我学错了什么.....
pwm调节亮度和adc0832的数据输出是两个子程序
分别拿来测试都测试不行 更别说组合起来了..
输出都为P1口 接了8个发光二极管每个二极管都串联了1K的电阻
adc0832是打算读取光照传感器的数据直接在P1输出 这是测试一
程序就是网上找的 自己也写过 时序也对照过了 应该是没问题的
可是仿真的时候改变传感器光照输出的数据也没有变化
在实物上也一样 改变光照也是输出的灯的个数都是没有变化的
adc0832的程序如下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit DO=P2^2;
sbit CLK=P2^0;
sbit DI=P2^1;
sbit CS=P2^3;
uchar adc0832_data()
{
uchar i,Dat1=0,Dat2=0;
CLK = 0;DI = 1;CS = 0;_nop_();CLK = 1;//第一个上升沿
CLK = 0;DI = 1;_nop_();CLK = 1;//第二个上升沿 DI=1表示 双通道 单极性 输入
CLK = 0;DI = 0;_nop_();CLK = 1;//第三个上升沿 DI=0表示选择通道1(CH0)
_nop_();CLK = 0;//第四个下降沿 开始输出转换数据
for(i=0;i<8;i++)//读取8位数据
{
CLK = 1;
CLK = 0;
_nop_();
if(DO) Dat1|=0x80>>i;
}
for(i=0;i<8;i++)//读取8位相反数据
{
if(DO) Dat2|=0x01<<i;
CLK = 1;
CLK = 0;
_nop_();
}
CS = 1;DI = 1; CLK = 1;//读取完成释放总线
if(Dat1==Dat2)//数据效验如果正确则返回读取数据
return Dat1;
}
void main()
{
uchar a;
while(1)
{
a=adc0832_data();
P1=a;};}
至于pwm调节亮度子程序测试的方法是打算运用定时器完成从最亮到最暗的变化
程序如下
#include<reg52.h>
#define uint unsigned int
uint LEVEL=10;
void LIGHT(void) //PWM点亮程序
{
uint n;
for(n=0;n<10;n++) //10级
{
if(n<=LEVEL)
P1=0x00;
if(n>LEVEL) //调整占空比
P1=0xff;}
}
void main()
{
TMOD=0x01; //T0中断1
TR0=1;
ET0=1;
TH0=(65535-50000)/256;TL0=(65535-50000)%256; //刷新率20HZ
EA=1;
while(1)
{LIGHT();};}
void T0_test(void) interrupt 1
{
TH0=(65535-50000)/256;TL0=(65535-50000)%256;
if(LEVEL=0)LEVEL=10;
LEVEL--;
}
仿真时所有的led都是恒定亮度 电压也没有变化 实物也是
不知道问题出在哪 纠结了很久了 求大神们解答
另外 因为纠结这些问题太久了开始怀疑自己的逻辑
按照课本上的一些程序直接输到keil中然后用protues模拟以及输入52中
都得不到应该有的结果
比如说这个程序
#include"reg52.h"
sbit PWM=P1^0;//定义输出脚
void main()
{
TMOD=0x01; //定时器0工作方式1
TH0=(65536-10000)/256; //12M晶振10MS计时常数
TL0=(65536-10000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1);
}
//中断函数,启动后每10MS进入一次中断
void T0_time(void) interrupt 1
{
TH0=(65536-10000)/256; //12M晶振10MS计时常数
TL0=(65536-10000)%256;
if(PWM)PWM=0; //输出脚取反
else PWM=1;
}
虽然说我的晶振是11.0592M的但这也应该就影响个时间吧
完全不明白为什么会仿真无结果以及无法在单片机上得出结果
已经快崩溃了....
是不是我学错了什么.....