久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6397|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于STC12C2520AD單片機(jī)的50W-LED可調(diào)光燈盤控制器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76127 發(fā)表于 2015-4-5 00:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 das 于 2015-4-5 00:36 編輯
  1. //*************************************************************************************//
  2. //--P3.4口采樣過零信號(hào),每10ms采樣到一個(gè)過零高電平,用于PWM0的時(shí)鐘信號(hào)--//
  3. //--P1.2口采樣電位器的輸出調(diào)光電壓,并進(jìn)行8bit的A/D轉(zhuǎn)換--//
  4. /*P3.7口輸出PWM信號(hào),PWM信號(hào)的頻率和相位角應(yīng)該自動(dòng)能根據(jù)P1.6口的過零信號(hào)和P1.2口的模擬信號(hào),
  5. 進(jìn)行計(jì)算分析,輸出時(shí)實(shí)的控制信號(hào),以控制可控硅的導(dǎo)通時(shí)間,達(dá)到調(diào)光的目的;  */
  6. /*P3.2口利用外部中斷功能,實(shí)現(xiàn)紅外線遙控器的解碼,以實(shí)現(xiàn)遙控功能. */
  7. //P1.6是AT24C01的數(shù)據(jù)端;P1.7是AT24C01的時(shí)鐘端,用于存儲(chǔ)紅外搖器的解碼值,達(dá)到記憶亮度的效果//
  8. //P1.0接LED指示燈//
  9. //       2013-9-13 /楊旭
  10. //*************************************************************************************//
  11. #include <stc12c2052ad.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. sbit LED=P1^0;
  16. sbit IR_RE=P3^2;
  17. sbit SDA=P1^6; //AT24C01數(shù)據(jù)端
  18. sbit SCL=P1^7; //AT24C01時(shí)鐘端
  19. //--------------------------------紅外線解碼用變量
  20. static uchar date[]={0,0,0,0};
  21. static uchar qinlong;
  22. //--------------------------------AD轉(zhuǎn)換用變量
  23. static uchar AD_dat_over0,AD_dat_over1;
  24. static uchar j=0; //AD中斷計(jì)數(shù)器
  25. //--------------------------------------------------------------------------/
  26. void delayms(uint a)
  27. {
  28. uint b;
  29. for(b=0;b<a;b++);
  30. }
  31. //--------------------------------------------------------------------------//
  32. void delay882()
  33. {
  34. uchar i,j;
  35. i=35;
  36. do{j=68;
  37.    do{j--;}
  38.    while(j);
  39.    i--;
  40.   }while(i);
  41. }
  42. //-------------------------
  43. void delay1000()
  44. {
  45. uchar i,j;
  46. i=39;
  47. do{j=70;
  48.    do{j--;}
  49.    while(j);
  50.    i--;
  51.   }while(i);
  52. }
  53. //-------------------------
  54. void delay2400()
  55. {
  56. uchar i,j;
  57. i=93;
  58. do{j=70;
  59.    do{j--;}
  60.    while(j);
  61.    i--;
  62.   }while(i);
  63. }
  64. //--------------------------------------------------------------------------//
  65. /*名稱:初始化端口程序
  66.   功能:系統(tǒng)初始化,檢測芯片運(yùn)行
  67. */
  68. /*********************初始化LED程序******************************************/
  69. void int_LED(void)  //LED閃爍3次表示初始化正常
  70. {
  71. uchar a;
  72. for(a=0;a<3;a++)
  73. {
  74.   LED=0;
  75.   delayms(1000);
  76.   LED=1;
  77. }
  78. }
  79. //--------------------初始化端口程序-----------------------------------------/
  80. void int_cushi(void)
  81. {
  82. P1=1;
  83. P3=1;
  84. int_LED();
  85. }
  86. //--------------------------------------------------------------------------//
  87. /*名稱:EEROM通信程序
  88.   功能:完成摸擬I2C功能,完成AT24C01的讀和寫操作
  89. */
  90. //----------
  91. void delay()
  92. { ; ; }
  93. //----------
  94. void start()//啟始信號(hào)
  95. {
  96. SDA=1;
  97. delay();
  98. SCL=1;
  99. delay();
  100. SDA=0;
  101. delay();
  102. }
  103. //----------
  104. void stop()//終止信號(hào)
  105. {
  106. SDA=0;
  107. delay();
  108. SCL=1;
  109. delay();
  110. SDA=1;
  111. delay();
  112. }
  113. //----------
  114. void respons() //應(yīng)答信號(hào),等待或者發(fā)送一個(gè)應(yīng)答信號(hào)
  115. {
  116. uchar i;
  117. SCL=1;
  118. delay();
  119. while((SDA==1)&&(i<250))i++;
  120. SCL=0;
  121. delay();
  122. }
  123. //----------
  124. void I2C_init()//初始化
  125. {
  126. SDA=1;
  127. SCL=1;
  128. }
  129. //----------
  130. void write_byte(uchar date)//寫一字節(jié)
  131. {
  132. uchar i;
  133. SCL=0;
  134. for(i=0;i<8;i++)
  135. {
  136.   date=date<<1;
  137.   SDA=CY;
  138.   SCL=1;
  139.   delay();
  140.   SCL=0;
  141.   delay();
  142. }
  143. }
  144. //----------
  145. uchar read_byte() //讀數(shù)據(jù)(也就是接收從器件傳來的數(shù)據(jù))
  146. {
  147.   uchar i,k;
  148. for(i=0;i<8;i++)
  149. {
  150.   SCL=1;
  151.   delay();
  152.   k=(k<<1)|SDA;
  153.   SCL=0;
  154.   delay();
  155. }
  156. return k;
  157. }
  158. //----------
  159. void delay1(uchar x)
  160. {
  161. uchar a,b;
  162. for(a=x;a>0;a--)
  163.   for(b=100;b>0;b--);
  164. }
  165. //----------
  166. void write_add(uchar address,uchar date)  //寫數(shù)據(jù)_調(diào)用層
  167. {
  168. start();
  169. write_byte(0xa0);  //寫器件地址
  170. respons();     //應(yīng)答
  171. write_byte(address); //寫器件內(nèi)部存儲(chǔ)地址
  172. respons();
  173. write_byte(date); //寫入數(shù)據(jù)
  174. respons();
  175. stop();    //停止
  176. }
  177. //----------
  178. read_add(uchar address) //讀數(shù)據(jù)_調(diào)用層
  179. {
  180. uchar date;
  181. start();
  182. write_byte(0xa0);
  183. respons();
  184. write_byte(address);
  185. respons();
  186. //------------------
  187. start();
  188. write_byte(0xa1);
  189. respons();
  190. date=read_byte();
  191. stop();
  192. return date;
  193. }
  194. //----------
  195. uchar I2C_data()  //主函數(shù)初始化后讀EEROM中的亮度值
  196. {
  197. uchar a;
  198. I2C_init();
  199. delay1(250);
  200. a=read_add(23);
  201. _nop_();
  202. _nop_();
  203. _nop_();
  204. _nop_();
  205. _nop_();
  206. return a;
  207. }
  208. //--------------------------------------------------------------------------/
  209. /*名稱:系統(tǒng)程序設(shè)置
  210.   功能:PWM0設(shè)置,外部中斷0設(shè)置,AD中斷設(shè)置
  211. */
  212. void lcall_sezhi()
  213. {
  214. //-----------------------------------PWM設(shè)置
  215. CMOD=0x86; //------PCA模塊PWM設(shè)置
  216. CCON=0x00; //CMOD=0X84為T0為信號(hào)源,這時(shí)將T0設(shè)置段落打開//0X80時(shí)則用12分頻時(shí)鐘信號(hào)
  217. CL=0x00;   //CMOD=0X86使用外部脈沖信號(hào),從P3.4腳加入信號(hào)
  218. CH=0x00;
  219. CCAPM1=0x42;  //0X42=01000010B 允許比較器功能位P1.4腳輸出PWM脈寬信號(hào)
  220. PCA_PWM1=0x00;//EPC1L和EPC1H在PWM模式下的值是0X00.
  221. CR=1; //啟動(dòng)計(jì)數(shù)器
  222. //====================================外部中斷0設(shè)置
  223. EX0=1;   //允許外部中斷0
  224. IT0=1;   //下降沿觸發(fā)
  225. //====================================AD
  226. EADC_SPI=1; //允許ADC中斷標(biāo)志位
  227. AUXR|=0x10; //允許ADC中斷
  228. P1M0=0x20;
  229. P1M1=0x00; //設(shè)置P1.2為AD輸入
  230. ADC_CONTR=0xe2;
  231. _nop_();
  232. _nop_();
  233. _nop_();
  234. _nop_();
  235. //-----------------------------------------------------------------------//
  236. EA=1; //開總中斷
  237. }
  238. //===============================lcall_AD====================================//
  239. void lcall_AD(void)
  240. {
  241. ADC_CONTR=0xea; //啟動(dòng)AD轉(zhuǎn)換
  242. }
  243. //---------------------------------------------------------------------------//
  244. /*名稱:紅外線解碼數(shù)據(jù)計(jì)算處理
  245.   功能:開/并功能,鍵值檔位計(jì)算,EEROM存儲(chǔ)功能,給CCAP0H和CCAP0L送值
  246. */
  247. void IR_jiema_data(void)
  248. {
  249. if(qinlong==0x00)   //0檔位
  250.    {//向CCAP0H,CCAP0L輸入比較器的初值,以和CL CH計(jì)數(shù)器的值進(jìn)行比較實(shí)現(xiàn)PWM調(diào)寬
  251.     I2C_init();
  252.     delay1(250);
  253.     write_add(23,256-250);//寫入EEROM地址23H,存儲(chǔ)數(shù)據(jù)256-250
  254.     CCAP0H=(256-250);
  255.     CCAP0L=(256-250);   //給PWM0傳送脈寬值
  256.     qinlong=0xff;
  257.    }
  258.     else if(qinlong==0x01)  //1檔位
  259.    {
  260.     I2C_init();
  261.     delay1(250);
  262.     write_add(23,256-240);
  263.     CCAP0H=(256-240);
  264.     CCAP0L=(256-240);
  265.     qinlong=0xff;
  266.    }
  267.    else if(qinlong==0x02)  //2檔位
  268.    {
  269.     I2C_init();
  270.     delay1(250);
  271.     write_add(23,256-220);
  272.     CCAP0H=(256-220);
  273.     CCAP0L=(256-220);
  274.     qinlong=0xff;
  275.    }
  276.    else if(qinlong==0x03)  //3檔位
  277.    {
  278.     I2C_init();
  279.     delay1(250);
  280.     write_add(23,256-200);
  281.     CCAP0H=(256-200);
  282.     CCAP0L=(256-200);
  283.     qinlong=0xff;
  284.    }
  285.    else if(qinlong==0x04) //4檔位
  286.    {
  287.     I2C_init();
  288.     delay1(250);
  289.     write_add(23,256-180);
  290.     CCAP0H=(256-180);
  291.     CCAP0L=(256-180);
  292.     qinlong=0xff;
  293.    }
  294.    else if(qinlong==0x05) //5檔位
  295.    {
  296.     I2C_init();
  297.     delay1(250);
  298.     write_add(23,256-160);
  299.     CCAP0H=(256-160);
  300.     CCAP0L=(256-160);
  301.     qinlong=0xff;
  302.    }
  303.    else if(qinlong==0x06) //6檔位
  304.    {
  305.     I2C_init();
  306.     delay1(250);
  307.     write_add(23,256-150);
  308.     CCAP0H=(256-150);
  309.     CCAP0L=(256-150);
  310.     qinlong=0xff;
  311.    }
  312.    else if(qinlong==0x07)  //7檔位
  313.    {
  314.     I2C_init();
  315.     delay1(250);
  316.     write_add(23,256-100);
  317.     CCAP0H=(256-100);
  318.     CCAP0L=(256-100);
  319.     qinlong=0xff;
  320.    }
  321.    else if(qinlong==0x08)  //8檔位
  322.    {
  323.     I2C_init();
  324.     delay1(250);
  325.     write_add(23,256-50);
  326.     CCAP0H=(256-50);
  327.     CCAP0L=(256-50);
  328.     qinlong=0xff;
  329.    }
  330.    else if(qinlong==0x09)  //9檔位
  331.    {
  332.     I2C_init();
  333.     delay1(250);
  334.     write_add(23,256-10);
  335.     CCAP0H=(256-10);
  336.     CCAP0L=(256-10);
  337.     qinlong=0xff;
  338.    }
  339. }
  340. //---------------------------------------------------------------------------//
  341. /*名稱:AD數(shù)碼轉(zhuǎn)換
  342.   功能:將電位器信號(hào)轉(zhuǎn)換成8位數(shù)據(jù),并用于EEROM存儲(chǔ)和送入CCAP0H和CCAP0L中,從而
  343.   調(diào)節(jié)PWM0的輸出
  344. */
  345. //---------------------------------------------------------------------------//
  346. void AD_jiema_data(void)
  347. {         //AD轉(zhuǎn)換后的數(shù)據(jù)處理
  348. if((AD_dat_over0<(AD_dat_over1+5))&&(AD_dat_over0>(AD_dat_over1-5)))  
  349. {  //如果在范圍內(nèi)(+5/-5)說明沒調(diào)電位器,應(yīng)使用存儲(chǔ)值
  350.     //給出+-5的范圍是防止輸入電壓稍有變動(dòng),引起的判斷錯(cuò)誤
  351.   I2C_init();
  352.   delay1(250);
  353.   CCAP0H=read_add(23);
  354. }
  355. else
  356. {
  357.   CCAP0H=(256-AD_dat_over0); //有調(diào)動(dòng)電位器,應(yīng)使用電位器AD值
  358.   I2C_init();
  359.   delay1(250);
  360.   write_add(23,AD_dat_over0);  //刷新EEROM中的值
  361. }
  362. }
  363. //**********************************************************************************//
  364. /*名稱:主函數(shù)
  365.   功能:完成系統(tǒng)的初始化和紅外解碼數(shù)據(jù)處理;AD轉(zhuǎn)換數(shù)據(jù)處理;最終達(dá)到存儲(chǔ)數(shù)據(jù)和調(diào)節(jié)PWM0.
  366. */
  367. //******************************主函數(shù)**********************************************//
  368. void main()
  369. {
  370. uchar a;
  371. lcall_sezhi(); //調(diào)用系統(tǒng)設(shè)置
  372. int_cushi();   //初始化系統(tǒng)檢查
  373. lcall_AD();    //啟動(dòng)AD
  374. a=I2C_data();  //讀I2C的數(shù)據(jù)
  375. while(1)
  376. {
  377.   CCAP0H=(256-a);
  378.   IR_jiema_data(); //紅外解碼數(shù)據(jù)處理
  379.   AD_jiema_data(); //AD數(shù)據(jù)處理
  380. }     
  381. }
  382. //***************************************************************************//
  383. /*名稱:紅外解碼_外部中斷0
  384.   功能:完成紅外線的數(shù)據(jù)解碼功能,解碼后的數(shù)據(jù)處理由主程序中的子程序處理.
  385. */
  386. //---------------------------------------------------------------------------//
  387. void int0_hongwai() interrupt 0  using 0
  388. {
  389. uchar i,j,k,n;
  390. EX0=0;
  391. for(n=0;n<10;n++)
  392. {
  393.   delay882();
  394.   if(IR_RE==1)break;
  395. }
  396. while(IR_RE==0){};
  397. //------------------------
  398. //當(dāng)遙控器持續(xù)按下則接收到一個(gè)9ms的低電平引導(dǎo)脈沖
  399. //以及一個(gè)2.2ms的高電平脈沖,和一個(gè)0.7ms的低電平脈沖,和一個(gè)96ms的高電平脈沖
  400. //以下是連續(xù)碼的檢測判斷程序和4.5ms高電平判斷
  401. //------------------------
  402. for(j=0;j<2;j++)
  403. {
  404.   delay2400();
  405.   if(IR_RE==0)break;
  406. }
  407. //-------------------------讀取數(shù)字信號(hào)----------
  408. for(i=0;i<4;i++)
  409.   {
  410.   for(k=0;k<8;k++)
  411.   {
  412.    while(IR_RE==0){};
  413.    delay882();
  414.    if(IR_RE==0)
  415.    {
  416.           date[i]>>=1;
  417.           date[i]=date[i]|0x00;
  418.    }
  419.    else if(IR_RE==1)
  420.    {
  421.     delay1000();
  422.        date[i]>>=1;
  423.              date[i]=date[i]|0x80;//0x80=10000000b
  424.    }
  425.   }
  426.   }
  427. //-----------------------------------------------
  428. if(date[0]=~date[1])       //用戶碼和數(shù)據(jù)碼判斷
  429. {
  430.   if(date[2]=~date[3])
  431.   qinlong=date[2];
  432. }
  433.   EX0=1;
  434. }
  435. //**********************************************************//
  436. /*名稱:AD轉(zhuǎn)換_AD中斷程序
  437.   功能:完成AD轉(zhuǎn)換數(shù)據(jù)傳輸,并同時(shí)清零AD中斷標(biāo)志位
  438. */
  439. //==========================================================//
  440. void AD_DAT12() interrupt 5  using 1
  441. {
  442. EADC_SPI=0;     //允許ADC中斷標(biāo)志位
  443. j++;
  444. if(j==1)AD_dat_over0=ADC_DATA;   //讀數(shù)據(jù)
  445. else if(j==2)
  446. {
  447.   AD_dat_over1=ADC_DATA;  //
  448.   j=0;      //計(jì)數(shù)器歸零
  449. }
  450. ADC_CONTR=0xea;    //AD中斷標(biāo)志清零
  451. EADC_SPI=1;   
  452. }
  453. //-----------------------END File---------------------------//
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:142383 發(fā)表于 2016-12-15 17:14 | 只看該作者
有仿制成功的嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久影音先锋 | 波多野结衣一区二区三区在线观看 | 国产福利精品一区 | 国产99久久 | 精品国产欧美日韩不卡在线观看 | 国产在线精品一区二区三区 | 亚洲精品在线观看视频 | 免费h视频 | 嫩草研究影院 | 盗摄精品av一区二区三区 | 中文av在线播放 | 久久天天躁狠狠躁夜夜躁2014 | 欧美激情第一区 | 精品视频国产 | 欧美性视频在线播放 | 国产91久久精品一区二区 | 日本成人区 | 欧美在线观看一区 | 欧美亚洲综合久久 | 精品久久一区二区 | 免费黄色的视频 | 久久精品国产亚洲 | 在线免费观看一区二区 | 国产伦一区二区三区 | 精品久久久久久亚洲综合网站 | 91视视频在线观看入口直接观看 | 女同久久 | 日韩在线不卡 | 色综合一区二区 | 国产福利资源在线 | 欧美高清一区 | 国产日韩一区二区三免费高清 | 亚洲欧洲精品在线 | 日韩国产精品一区二区三区 | 国产精品一区二区欧美黑人喷潮水 | 久精品视频 | 免费一级网站 | 亚洲成人日韩 | wwww.8888久久爱站网 | 欧美一级欧美一级在线播放 | 狠狠狠|