/*************************************************************************
*工程名称:单片机控制可控硅调光 *
*单片机型号:STC12C5202AD *
*晶振频率:12MHz *
*带AD转换器转换口在P1口 *
*作者:新兴光电 *
*日期:2014-11-23 *
*************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//AD转换相关
sfr P1M0=0x91; //P1口模式配置寄存器0
sfr P1M1=0x92; //P1口模式配置寄存器1
sfr ADC_CONTR=0XC5; //ADC控制寄存器
sfr ADC_DATA=0XC6; //A/D转换结果寄存器 高8位
sfr ADC_LOW2=0xBE; //A/D转换结果寄存器 低2位
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sbit control_scr=P1^0; //可控硅触发控制端
uchar flag=0; //过零检测标志位
uchar count=0; //触发控制标志位
uchar liangdu; //亮度调节
uchar SCR_close_flag; //可控硅关闭标志位
//uchar add_flag; //亮度递增标志位
//uchar dec_flag; //亮度递减标志位
/*******1ms基准延时程序*******************/
void Delay1ms(uint i) //1ms延时程序
{
uchar j;
while(i--)
{
for(j=0;j<125;j++)
{ ; }
}
}
/****************************************/
/************************************/
void delaykt(void) //导通延时
{
unsigned char a;
// for(a=2;a>0;a--); //初始值为2
for(a=2;a>0;a--);
}
/************************************/
/************************************
void delay(int z) //可调延时
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************************/
/************************************
void delay9ms(void) //误差-0.43402777778us 延时9ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=224;b>0;b--)
for(a=17;a>0;a--);
}
/************************************/
/************************************
void Delay9ms() //@12.000MHz stc12c5616ad
{
unsigned char i, j;
_nop_();
_nop_();
i = 106;
j = 10;
do
{
while (--j);
} while (--i);
}
/************************************/
/************************************/
void Delay9ms() //@12.000MHz 9950us
{
unsigned char i, j;
_nop_();
_nop_();
i = 117;
j = 33;
do
{
while (--j);
} while (--i);
}
/************************************/
/************************************/
void init() //初始化
{
control_scr=1; //触发控制端初始化
SCR_close_flag=1; //允许控制可控硅
EA=1; //总中断打开
EX1=1; //外部中断1
IT1=1; //外部中断1触发方式选择 下降沿
}
/*************************初始化ADC***************************/
void InitADC()
{
// P1ASF = 0x80; //
P1=P1M0=P1M1=0xff; //设置P1口为开漏模式
ADC_DATA = 0; //清除AD转换结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //设置ADC控制器,打开ADC电源位,设置转换速度
Delay1ms(1); //ADC上电并延时
}
/*************************************************************/
/**************************读取ADC结果************************/
uchar GetADCResult(uchar ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
// ADC_CONTR &= ~ADC_FLAG; //Close ADC
ADC_CONTR=0x00;
return ADC_DATA; //返回ADC结果
}
/*************************************************************/
/**********************过零检测*******************************/
void zhongduan() interrupt 2 //外部中断1中断程序
{
flag=1; //过零检测标志位
}
/*************************************************************/
/*************************************************************/
void timepd() //同步标志判断与定时器设置
{
if(flag==1)
{
flag=0;
// InitADC(); //ADC初始化程序
GetADCResult(1); //采样P1^1口
if(ADC_DATA>125) //获得P1.1口ADC转换结果 电压是否高于2.44V
{
if(liangdu==20)
{
init(); //可控硅控制初始化
// liangdu++;
}
if(liangdu<94)
{
liangdu++;
}
else liangdu=94;
}
if(ADC_DATA<102) //获得P1.1口ADC转换结果
{
if(20<liangdu<=94)
{
liangdu--;
}
else
{
liangdu=20;
SCR_close_flag=0; //可控硅禁止导通
control_scr=1; //触发控制端初始化 关闭可控硅
// EX1=0; //关闭外部中断1
// ET1=0; //定时器1中断关闭
// TR1=0; //定时器0关闭
}
}
TMOD=0x10; //设置定时器1工作模式
// TH1=(65536-1000*(10-liangdu))/256; //原始参数
// TL1=(65536-1000*(10-liangdu))%256;
TH1=(65536-105*(95-liangdu))/256; //延时时间在0-10ms内任意值
TL1=(65536-105*(95-liangdu))%256;
ET1=1; //定时器1中断开
TR1=1;
}
}
/************************************/
/************************************/
void time1() interrupt 3 //定时器1中断程序
{
count=1; //触发控制标志位
}
/************************************/
/************************************/
void chufa() //MOS3020触发
{
if(count==1)
{
/* count=0;
control_scr=0;
delaykt();
control_scr=1;
delay9ms();
control_scr=0;
delaykt();
control_scr=1; */
count=0;
if(SCR_close_flag==1)
{
control_scr=0;
delaykt();
control_scr=1;
// delay9ms();
// control_scr=0;
// delaykt();
// control_scr=1;
}
}
}
/************************************/
void main()
{
liangdu=20; //最小20
InitADC(); //ADC初始化程序
init(); //可控硅控制初始化
while(1)
{
// keyscanf();
/* if(ADC_DATA<10) //获得P1.1口ADC转换结果
{
if(n==40)
{
n=0;
if(liangdu>0)
{
liangdu--;
}
else liangdu=0;
}
if(liangdu==0)
{
control_scr=1; //触发控制端初始化 关闭可控硅
EX1=0; //关闭外部中断1
ET1=0; //定时器1中断关闭
TR1=0; //定时器0关闭
}
} */
timepd(); //同步标志判断与定时器设置
chufa(); //触发控制程序
}
}
kekonggui.rar_51可控硅_单片机 可控硅_可控硅
版权申诉
160 浏览量
2022-09-19
21:41:47
上传
评论
收藏 23KB RAR 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+
最新资源
- 基于微信小程序+mysql的答题系统的设计与实现+全部资料+详细文档(毕业设计).zip
- H5U的PLC固件,用于EthernetIP通讯时升级固件使用
- Jumpserver堡垒机快速入门视频.zip
- 基于springboot+mysql+redis实现个性化书籍推荐和相似帖子推荐的社区图书馆+论坛+失物招领平台
- 软考中级软件设计师 法律法规通关笔记
- 基于java+sqlserver实现的员工培训系统
- java毕业设计基于Springboot的贫困生资助系统源码+使用文档+全部资料(优秀项目).zip
- 基于随机森林和袋装法对PM2.5浓度进行回归预测
- 静态路由实验.docx
- Rust语言探索之旅:从入门到实践,构建安全高效的系统级应用-文章博客-markdown材料.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈