找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1531|回复: 4
打印 上一主题 下一主题
收起左侧

这个自动模式用Proteus怎么也仿不出来(pwm调光)大家帮帮忙

[复制链接]
跳转到指定楼层
楼主
ID:677757 发表于 2019-12-30 19:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>            /?????
#define uchar unsigned char   /??? ???    ????0~255
#define uint  unsigned int    /?? ???    ????0~65535
sbit SCL=P2^2;        //SCL???P2???2??,??ADC0832SCL?
sbit DO=P2^3;        //DO???P2???3??,??ADC0832DO?
sbit CS=P2^0;        //CS???P2???0??,??ADC0832CS?
sbit ZD=P1^3;
sbit SD =P1^4;  
sbit D0= P0^0;
sbit D1 = P0^1;   
sbit D2=P0^2;        
sbit D3=P0^3;        
sbit D4=P0^4;        
sbit D5=P0^5;
sbit D6 = P0^6;  
sbit D7=  P0^7;
sbit td_led = P3^5;
uchar f_pwm_l ;      /?
bit flag_moshi;
uchar dangwei;  //
uchar guangxian;            /????
/***********************1ms????*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********???????********************************************************/   
/?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;
}
uchar key_can;
/********************??????*****************/
void key()
{
static uchar key_new;
key_can = 20;
if((P2 & 0xf0) != 0xf0)
{
delay_1ms(1);
if(((P2 & 0xf0) != 0xf0) && (key_new == 1))
{
key_new = 0;
switch(P2 & 0xf0)
{
case 0xe0:  key_can = 1;  break;    /1?
case 0xd0:  key_can = 2;  break;    /2?
case 0xb0:  key_can = 3;  break;    /3?
}
SD = 0;
delay_1ms(80);
ZD = 0;
}
}
else
key_new = 1;   
}
/***************??***************/
void led_dangwei(uchar dat)
{
switch(dat)
{
case 7: TR1 = 0;     //
td_led = 1;
P0=0x00;/?
break;
case 6: TR1 = 1;     //
f_pwm_l = 20;
P0=0x01;
break;
case 5: TR1 = 1;     //
f_pwm_l = 40;
P0=0x03 ;
break;
case 4: TR1 = 1;     //
f_pwm_l = 60;
P0=0x07;
break;
case 3: TR1 = 1;     //
f_pwm_l = 80;
P0=0x0f;
break;
case 2: TR1 = 1;     //
f_pwm_l = 90;
P0=0x1f;
break;
case 1: TR1 = 1;     //
f_pwm_l = 95;
P0=0x3f;
break;
case 0: TR1 = 0;     //
td_led = 0;
P0=0x7f;
break;
}   
}
/****************??????***************/
void key_with()
{
if(key_can == 1)      /
{
flag_moshi = ~flag_moshi;
}       //
if(flag_moshi == 1)      /?
{
if(key_can == 2)  //
{
dangwei ++;   
if(dangwei >= 7)
dangwei = 7;
}
if(key_can == 3)  //
{
if(dangwei != 0)
dangwei --;
}
led_dangwei(dangwei) ;    //
}
}
/*************???0?????***************/
void time_init()     
{
EA  = 1;          /?
TMOD = 0X10;      /1????1
ET1  = 1;          /?0??
TR1  = 0;          /??0??
}
/********************************************************************
* ?? : Main()
* ?? : ???
* ?? : ?
* ?? : ?
***********************************************************************/
void Main()
{
time_init();                    /???
SD = 0;
f_pwm_l = 99;
while(1)
{
key();
if(key_can < 10)
key_with();
if(flag_moshi == 0)      /?
{ZD = 0;
SD=1;}
else
{SD = 0;
ZD=1;  }       /?
if(flag_moshi == 0)      /?
{if(guangxian<10)
P0=0x7f;
if(guangxian<25&&guangxian>=10)
P0=0x3f;
if(guangxian<37.5&&guangxian>=25)
P0=0x1f;
if(guangxian<50&&guangxian>=37.5)
P0=0x0f;
if(guangxian<62.5&&guangxian>=50)
P0=0x07;
if(guangxian<75&&guangxian>=62.5)
P0=0x03;
if(guangxian<87.5&&guangxian>=75)
P0=0x01;
if(guangxian<=99&&guangxian>=87.5)
P0=0x00;
if(guangxian <= 10)        //
{
TR1 = 0;     //
td_led = 0;
P0=0x7f;  
}else if(guangxian >= 90)    //   
{
TR1 = 0;     //
td_led = 1;
P0=0x00;
}else
{
TR1 = 1;   
f_pwm_l = guangxian;   
}   
}
guangxian = ad0832read(1,0); /?
guangxian = guangxian *99/255;
delay_1ms(1);
}   
}
/*******************???1???????PWM ??***********************/
void Timer1() interrupt 3  /??1
{
static uchar value_l;
TH1=0xfe;    //   
TL1=0x0c;    //
if(td_led==0)
{
value_l+=1;
if(value_l > f_pwm_l)  /
{
td_led=1;   
}
}
else               
{
value_l+=1;
if(value_l  > 100 - f_pwm_l)          /
{
td_led=0;
}
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:677757 发表于 2020-1-1 15:34 | 只看该作者
不是24小时必答区吗
回复

使用道具 举报

板凳
ID:155507 发表于 2020-1-1 22:18 | 只看该作者
原理图得提供啊,至少框图有吧,怎么接线的
写程序要养成良好的备注习惯,不然别人怎么看的懂你的代码

http://www.51hei.com/bbs/dpj-126842-1.html
回复

使用道具 举报

地板
ID:332444 发表于 2020-1-2 08:34 | 只看该作者
仿真是没有亮度大小可言的
回复

使用道具 举报

5#
ID:149451 发表于 2020-1-3 08:57 | 只看该作者
xianfajushi 发表于 2020-1-2 08:34
仿真是没有亮度大小可言的

这个不准确。你串个电阻在LED上,通过调试电阻的阻值看看亮度就知道了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表