首页资源分类嵌入式处理器51内核 > STC11F04闪光灯

STC11F04闪光灯

已有 445125个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:STC11F04闪光灯

    分    享:

    文档简介

    用STC11F04单片机控制LED灯恒流源,模拟相机闪光灯效果,通按键可以控制灯光亮度,亮度也可微调.

    文档预览

    #include "INTRINS.H" #include typedef unsigned int uint; typedef unsigned char uchar; typedef unsigned long int ulong; #define out0 P16 #define out1 P17 #define rs485en P33 #define fbfh 254 //通用地址 //#define os_jfuj (65536-4000000/12/10) //0.1秒 //#define os_jfuj2 4 //0.1秒 * os_jfuj2 #define rpqv_jfuj 80 //按键时间 #define rpqv_ymlf 300 //按键设置 uchar rxwy_xe[4]; //指令数组 uchar rxwy_ynvi[8]; //指令记录 bit rvtf_rxwy=0; //执行指令标志位 bit wyhh,rvra,dk,da,h,gh,ytdd,xpih,bcwy1,bcwy2,iqlu1, iqlu2; //定义键盘控制指令标志位, //停止,扫描,右,左,上,下,放大,缩小,聚焦-,聚焦+,光圈UP,光圈Down, uchar cblf_ymet,cblf_ymlf; //预置调用,预置设置 uint trgq_rprm=0, //特殊控制 trgq_kgn=0; //特殊号 uchar code ihtr_yx[]= //波特率数组,建立在程序储存区 11.0592MHz 《0/1/2/3/4 不倍速 12T》《 5/6/7/8/9 倍速 1T》条件 /* 0 1 2 3 4 5 6 7 8 9 1200,2400,4800,9600,14400,19200,28800,38400,57600,115200 */ {0xE8,0xF4,0xFA,0xFD, 0xfe, 0xDC, 0xE8, 0xEE, 0xF4, 0xFA}; uchar ihtr=1; //波特 (默认为 2400 ) uchar smkg=2; //机号,在第一次用时设定,可随时自定义 (默认为 01号) uchar qvte_flyy=0; //键盘协议(默认PELCO-D/2400) /* 键盘协议 数字表(不可变) ___________________________________________________________________ |qvte_flyy| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |---------|---------|---------|---------|-----|-----|---------|-----| |键盘协议 | Pelco-D | Pelco-P | Samsung | B01 | A01 | Kalatel | SAE | ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ */ uchar jfuj=30; //百分之20功率 uchar jfuj2=20; //闪百分之20功率 uchar osiq_saaa; bit cejn_sffn; //通电标志 //bit ymlf_saaa=0; //设置模式(1为进入设置模式) //uchar tfqp_os=0; //选灯 //uint mfad; //周期 uchar thjf,jjiq; //延时,曝光 uint j1,j2; ////////////////////////////////////////////////////////////////// //延时1MS 用内部时钟 void Delay1ms(uint i) { uint n; while (i--) { n=100; while (n--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } } //读EEPROM函数 uchar EEPROM_R(uint i) //i为要读取的字节地址 { uchar ia; IAP_CONTR=0x83; //允许读写EEPROM操作和指令等特时间,指令等特时间对应≤12MHz IAP_CMD=1; //读取操作 IAP_ADDRL=i; //EEPROM的底位地址 IAP_ADDRH=i>>8; //EEPROM的高位地址 IAP_TRIG=0x5a; //读启动指令 IAP_TRIG=0xa5; //读启动 _nop_(); //CPU等特 ia=IAP_DATA; //读取到的数据传给ia return (ia); //反回ia值 } //擦除EEPROM函数 void EEPROM_E(uint i) //i为扇区的任一地址 { IAP_CONTR=0x83; //允许读写EEPROM操作和指令等特时间,指令等特时间对应≤12MHz IAP_CMD=3; //擦除一个扇区操作 IAP_ADDRL=i; //EEPROM的底位地址 IAP_ADDRH=i>>8; //EEPROM的高位地址 IAP_TRIG=0x5a; //写启动指令 IAP_TRIG=0xa5; //写启动 _nop_(); //CPU等特 } //写EEPROM函数 void EEPROM_W(uint i,uchar ia) //i为要写的字节地址,ia为要写的数据(一字节) { IAP_CONTR=0x83; //允许读写EEPROM操作和指令等特时间,指令等特时间对应≤12MHz IAP_CMD=2; //写一个字节操作 IAP_ADDRL=i; //EEPROM的底位地址 IAP_ADDRH=i>>8; //EEPROM的高位地址 IAP_DATA=ia; //把要写的数据传入EEPROM数据寄存器 IAP_TRIG=0x5a; //读启动指令 IAP_TRIG=0xa5; //读启动 _nop_(); //CPU等特 } //-------------------读取数据----------------------- void yfbc_ovrn () { thjf=EEPROM_R(0x0000); //0x0000 if(thjf>100) thjf=1; jjiq=EEPROM_R(0x0001); //0x0001 if(jjiq>250) jjiq=10; /* ihtr=EEPROM_R(0x0002); //0x0002 波特 if(ihtr>ihtr_yx_ovt) ihtr=lfyw_ihtr; qvte_flyy=EEPROM_R(0x0003); //0x0003 键盘协议 if(qvte_flyy>qvte_flyy_ovt) qvte_flyy=lfyw_qvte_flyy; */ } //------------------保存数据---------------------------- void wkdh_ovrn () { EEPROM_E(0); //擦除EEPROM 第一扇区 // EEPROM_E(0x0200); //擦除EEPROM 第二扇区 EEPROM_W(0x0000,thjf); //0x0000 延时 EEPROM_W(0x0002,jjiq); //0x0002 曝光 /* EEPROM_W(0x0003,qvte_flyy); //0x0003 键盘协议 EEPROM_W(0x0004,thfc_bcwy); //0x0004 自动聚焦 EEPROM_W(0x0005,thfc_tolf); //0x0005 自动翻转 EEPROM_W(0x0006,pwus_jfuj); //0x0006 空闲时间 EEPROM_W(0x0007,pwus_alce); //0x0007 空闲功能 EEPROM_W(0x0008,tgyn_alce); //0x0008 重启功能 EEPROM_W(0x0009,kkth_flyy); //0x0009 品牌协议 EEPROM_W(0x000a,yowu_gkya); //0x000a 变倍速度 EEPROM_W(0x000b,ovpb_yowu); //0x000b 数字变倍 EEPROM_W(0x000c,cblf_bcwy); //0x000c 预置聚焦 EEPROM_W(0x000d,lfrr_esqc); //0x000d 黑白彩色 EEPROM_W(0x000e,uxiq_puwi); //0x000e 背光补偿 EEPROM_W(0x000f,nj_nnuy); //0x000f 慢快门 EEPROM_W(0x0010,mghi_txxy); //0x0010 同步系统 EEPROM_W(0x0011,tqfc_jtim); //0x0011 移动监测 EEPROM_W(0x0012,pa_fcdy); //0x0012 宽动态 EEPROM_W(0x0013,tqpg_kkd); //0x0013 稳定器 EEPROM_W(0x0014,jjiq_saaa); //0x0014 曝光模式 EEPROM_W(0x0015,nnuy_cdov); //0x0015 快门参数 EEPROM_W(0x0016,iqlu_cdov); //0x0016 光圈参数 EEPROM_W(0x0017,ypya_cdov); //0x0017 亮度参数 EEPROM_W(0x0018,rrr_gutq); //0x0018 白平衡 EEPROM_W(0x0019,xaqc_fuuw); //0x0019 红色增益 EEPROM_W(0x001a,ajqc_fuuw); //0x001a 蓝色增益 EEPROM_W(0x001b,rvra_xykg); //0x001b 扫描编号 */ // wkdh_sffn=0; } ////////////////////////////////////////////////////////////////// // void uw1_T1() interrupt 3 { // static bit alyx=0; //功率 } ////////////////////////////////////////////////////////////////// //闪 void uw0_T0() interrupt 1 { uint jj1,jj2; static uchar i=0; if(osiq_saaa==2) { jj1=65536-jfuj*10; jj2=65536-(100-jfuj)*10; cejn_sffn=~cejn_sffn; if(cejn_sffn==0) { TL0=jj1; TH0=jj1>>8; out0=1; out1=1; } else { // i=65536-j1; TL0=jj2; TH0=jj2>>8; out0=0; out1=0; } } else if(osiq_saaa==3) { if(i==0) { i++; TL0=j2; TH0=j2>>8; out1=1; out0=1; } else { i=osiq_saaa=0; out1=0; out0=0; TR0=0; } } else if(osiq_saaa==4) { if(i==0) { i=1; out1=0; out0=0; } else if(i==1) { i=2; out1=1; out0=1; } else { osiq_saaa=0; i=0; out1=0; out0=0; TR0=0; } } } ////////////////////////////////////////////////////////////////// //--------------------------RS485串口通信设置------------------------------- void rs485_ini() { /* PCON &= 0x7f; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T AUXR &= 0xfe; //串口1选择定时器1为波特率发生器 TMOD &= 0x0f; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xF4; //设定定时初值 TH1 = 0xF4; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 REN=1; //允许串口接收数据 ES=1; //允许串口中断 rs485en=0; //控制MAX485收发,0为收,1为发. */ if(ihtr<5) { PCON &= 0x3F; //波特率不倍速 SM0用于指定串行口的工作方式 AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T } else { PCON |= 0x80; //波特率倍速 AUXR |= 0x40; //定时器1时钟为Fosc,即1T } switch (qvte_flyy) //键盘协议 选择 { case 0: //Peico-D case 1: //Peicd-P case 2: //Samsung case 3: //B01 case 5: //Kalatel SCON=0x50; // SM0=0; // SM1=1; //串口以方式 1 工作 // SM2=0; //非多机通 break; case 4: SCON=0xF0; // SM0=1; // SM1=1; //串口以方式3 工作 // SM2=1; //多机通模式 break; default: break; } AUXR &= 0xfe; //串口1选择定时器1为波特率发生器 TMOD &= 0x0f; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式,同时也是启动定时器工作 TL1=TH1=ihtr_yx[ihtr]; //设定定时初值 设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 REN=1; //允许串口接收数据 ES=1; //允许串口中断 rs485en=0; //控制MAX485收发,0为收,1为发. } //RS485串口通信中断 void rs485_khon() interrupt 4 { static uchar rxwy_pbab=0; //定义指令字节静态变量,用于记录指令字节数 uchar i,p; static uint sucw; //定义校验 if(RI) { RI=0; i=SBUF; rxwy_pbab++; switch (qvte_flyy) { case 0: //Pelco-D 协议 case 1: //Pelco-P 协议 switch (rxwy_pbab) { case 1: //第一个字节 rxwy_ynvi[rxwy_pbab-1]=i; //指令记录 if(i==0xa0) //同步? Y 进入第二个字节接收状态 { qvte_flyy=1; //Pelco-P 协议 sucw=i; //Pelco-P 校验数 } else if(i==0xff) qvte_flyy=0; //同步? 自适应Pelco 协议 else rxwy_pbab=0; //否,反回接收下次指令 break; case 2: //第二个字节 rxwy_ynvi[rxwy_pbab-1]=i; //指令记录 if(i==fbfh||i==smkg) //地址字节是否通用地址或机号 { if(qvte_flyy==0) sucw=i; //Pelco-D 校验数 else sucw^=i; //Pelco-P 校验数 } else rxwy_pbab=0; //否,反回接收下次指令 break; case 3: //第三个字节至第六字节为指令数据,全接收 case 4: case 5: case 6: rxwy_ynvi[rxwy_pbab-1]=i; //指令记录 rxwy_xe[rxwy_pbab-3]=i; //指令存入指令组 if(qvte_flyy==0) sucw+=i; //Pelco-D 校验数 else sucw^=i; //Pelco-P 校验数 break; case 7: //第七字节 case 8: //第八字节 rxwy_ynvi[rxwy_pbab-1]=i; //指令记录 if(qvte_flyy==0||rxwy_pbab==8) { if(qvte_flyy==0) sucw%=0x100; if(sucw%0x100==i) { rvtf_rxwy=1; //校验正确,执行指令标志位置1 指示指令可以执行 p=rxwy_xe[0]|rxwy_xe[1]|rxwy_xe[2]|rxwy_xe[3]; wyhh=rvra=dk=da=h=gh=ytdd=xpih=bcwy1=bcwy2=iqlu1=iqlu2=cblf_ymet=cblf_ymlf=trgq_rprm=trgq_kgn=0; //清标志位 if(p) //查是否 全局停止 指令 { if((rxwy_xe[1]&0x01)==0) //判断指令所属性,0为常态控制,即自动扫描\光圈缩扩\聚散焦\变倍\上下左右等 { if(rxwy_xe[1]&0x06||rxwy_xe[0]&0x10) //查水平是否有动作,水平左右转,自动扫描 { if(rxwy_xe[0]&0x10) //自动扫描,360度转. rvra=1; //扫描标志置位 else { if((rxwy_xe[1]&0x02)!=0) dk=1; //右标志 置位 else da=1; //左标志置位 } } if(rxwy_xe[1]&0x18) //查垂直是否有动作 { if((rxwy_xe[1]&0x10)!=0) gh=1; //下标志置位 else h=1; //上标志置位 } if(rxwy_xe[1]&0x60) //判断是否缩放 { if(rxwy_xe[1]&0x20) ytdd=1; //判断是否放大,放大标志置位 else xpih=1; //缩小,缩小标志置位 } if(qvte_flyy==0) { if(rxwy_xe[0]&0x01||rxwy_xe[1]&0x80) //判断是否焦距 { if(rxwy_xe[1]&0x80) bcwy1=1; //散焦,远距离聚焦- else bcwy2=1; //聚焦,近距离聚焦+ } if(rxwy_xe[0]&0x06) //判断是否光圈缩放 { if(rxwy_xe[0]&0x02) iqlu1=1; //光圈UP标志置位 else iqlu2=1; //光圈Down标志置位 } } else { if(rxwy_xe[0]&0x03) //判断是否焦距 { if(rxwy_xe[0]&0x01) bcwy1=1; //散焦,远距离聚焦- else bcwy2=1; //聚焦,近距离聚焦+ } if(rxwy_xe[0]&0x0c) //判断是否光圈缩放 { if(rxwy_xe[0]&0x04) iqlu1=1; //光圈UP标志置位 else iqlu2=1; //光圈Down标志置位 } } } else //指令码2的BIT0为1,即为特殊控制指令 { if(rxwy_xe[1]==0x07&&rxwy_xe[0]==0) //判断是否调用预置点 { cblf_ymet=rxwy_xe[3]; //预置位 调用标志位 置位 } else if(rxwy_xe[1]==0x03&&rxwy_xe[0]==0) { cblf_ymlf=rxwy_xe[3]; //预置位 设置标志位 置位 } } trgq_rprm=rxwy_xe[0]; trgq_rprm=trgq_rprm<<8|rxwy_xe[1]; trgq_kgn=rxwy_xe[2]; trgq_kgn=trgq_kgn<<8|rxwy_xe[3]; } else wyhh=1; //全停止标志 置位 } rxwy_pbab=0; //回归指令第一字节 } else { if(i==0xAF) { sucw^=i; } else rxwy_pbab=0; } break; default: rxwy_pbab=0; break; } break; default: break; } } else TI=0; } ////////////////////////////////////////////////////////////////// //灯模式 函数 void os_saaa (uchar k) { // uint i; switch (k) { case 1: TR0=0; if(osiq_saaa!=1) { osiq_saaa=1; out1=1; out0=1; } else { osiq_saaa=0; out1=0; out0=0; } break; case 2: // jfuj=50; //百分之五十电流 if(osiq_saaa!=2) { osiq_saaa=2; TL0=65536-jfuj*10; TH0=65536-jfuj*10>>8; TR0=1; out1=1; out0=1; } else { osiq_saaa=0; TR0=0; out1=0; out0=0; } break; case 3: // TR0=0; if(osiq_saaa!=3) { osiq_saaa=3; // i=0; TL0=j1; TH0=j1>>8; TR0=1; out1=0; out0=0; } break; case 4: // TR0=0; if(osiq_saaa!=4) { osiq_saaa=4; // i=0; TL0=~0; TH0=0; TR0=1; out1=1; out0=1; } break; default: break; } } //主函数 用外部11.0592 void main () { uchar i; uint j=0; uchar a10=1,b10=1; // uchar p=1; Delay1ms (10); TMOD &= 0xf0; //清除定时器0 工作模式位 TMOD |= 0x01; //定时器0 工作在16位定时的模式1下 AUXR &= ~T0x12; //定时器0 时钟都为12T WAKE_CLKO&=0xcc; //关CLKOUT 输出 EA=1;ET0=1;//ET1=1; //开总中断,开定时器0中断和1的中断 rs485_ini(); yfbc_ovrn (); j1=65536-8*thjf; //延时 j2=65536-389*jjiq; //曝光 P1=0x0f; while(1) { WDT_CONTR|=CLR_WDT; //喂狗 if(rvtf_rxwy) { rvtf_rxwy=0; if(cblf_ymet<=100) { thjf=cblf_ymet; j1=65536-8*thjf; //延时 wkdh_ovrn(); } if(cblf_ymlf<=250) { jjiq=cblf_ymlf; j2=65536-389*jjiq; //曝光 wkdh_ovrn(); } if(cblf_ymet==251) //开灯 { os_saaa(1); } if(cblf_ymet==252) //半亮灯 { os_saaa(2); } if(cblf_ymet==253) //闪光 { os_saaa(3); } if(cblf_ymet==254) //双闪 { os_saaa(4); } } Delay1ms (10); a10=P1&0x0f; Delay1ms (10); b10=P1&0x0f; if(a10==b10) { if(a10!=0x0f) { i=a10; } else if(i) { if(j<=100) { switch (i) { case ~0xf1: //D0 os_saaa(1); break; case ~0xf2: //D1 os_saaa(2); break; case ~0xf4: //D2 os_saaa(3); break; case ~0xf8: //D3 os_saaa(4); break; default: break; } i=0; } j=0; } } } }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。