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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于MS83F0802A單片機(jī)的頭燈制作原理圖和源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76293 發(fā)表于 2018-8-24 09:11 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
雖然是個簡單的東西但是花了好長時間,寫程序期間遇到了好多問題,然后慢慢的修改,直到完成,能夠做出來感覺很欣慰,特此上傳來共同學(xué)習(xí)進(jìn)步。

頭燈功能說明書原理圖
1.按鍵按第一下LED1和LED3亮,再按亮LED2,再按全滅。如此循環(huán)。
2.關(guān)燈狀態(tài)下,長按2秒以上進(jìn)入電量指示,電池3.9V以上LED123全部微亮表示滿電。
3.電池電壓3.6-3.9V,LED2,LED3微亮,電池3.6V以下,LED3微亮。
4.另外,LED2點亮狀態(tài)下,單片機(jī)檢測電池電壓,電壓低于3.2V時,LED2亮5s,關(guān)0.5s,重復(fù)。



電路原理圖如下:


程序截圖:


單片機(jī)源程序如下:
  1. #include "syscfg.h"
  2. #include "MS83Fxx02.h"
  3. #define _XTAL_FREQ                 4000000 //4T,此定義詳解請看MS_Q&A_Sheet.pdf文檔
  4. #define LED1 RC2
  5. #define LED2 RC4
  6. #define LED3 RA1
  7. #define KEY  RA6
  8. //#define LED4 RC3//ad轉(zhuǎn)換結(jié)果測試
  9. unsigned char keycount=0,LEDCOUNT=0,t=0;
  10. unsigned int flagecount=0,LED1COUNT=0,count=0,count1=0;
  11. unsigned long advalue=0;
  12. bit flage=0,flageled2=0,flageled=0,flage3=0;
  13. float adcvalue=0;
  14. void ENABLE_INTERRUPT(void);
  15. void interrupt ISR(void);
  16. void DEVICE_INIT(void);
  17. void Keycan(void);
  18. void ADC_INIT(void);
  19. void Led1_lighter(void);
  20. void Led2_lighter(void);
  21. void Led3_lighter(void);
  22. void Float_adcvalue(void);
  23. void Keycan(void);
  24. void TIMER1_INIT(void);

  25. /*====================================================
  26. *函數(shù)名:main
  27. *功能:主函數(shù)
  28. *輸入?yún)?shù):無
  29. *返回參數(shù):無
  30. ====================================================*/
  31. void main(void)
  32. {
  33.         DEVICE_INIT();     //器件初始化
  34.     ADC_INIT();        //adc初始化
  35.     TIMER1_INIT();     //定時器1初始化
  36.     keycount=0;
  37.     LED1=0;
  38.     LED2=0;
  39.     LED3=0;
  40.     ENABLE_INTERRUPT();//進(jìn)入定時器中斷
  41.         while(1)
  42.         { CLRWDT();
  43.       if(!flage) Keycan();
  44.       if(flage||flageled)  Float_adcvalue();
  45.     }
  46. }
  47. /*====================================================
  48. *函數(shù)名:interrupt ISR
  49. *功能:中斷服務(wù)函數(shù)
  50. *輸入?yún)?shù):無
  51. *返回參數(shù):無
  52. ====================================================*/
  53. void interrupt ISR(void)
  54. {
  55.         if(T0IE&&T0IF&&!flage3)
  56.         {
  57.                 T0IF = 0;
  58.                 TMR0 = 6;//(256-6)*4=1000us=1ms
  59.        if(flageled2)   LEDCOUNT++;
  60.    
  61.        if(LEDCOUNT==100)
  62.                 {
  63.          LEDCOUNT=0;
  64.             count++;
  65.             if(count==50)
  66.               { count=0;
  67.                 LED2=0;
  68.                 //__delay_ms(500);
  69.                 TMR1ON=1;flage3=1;

  70.               }
  71.          
  72.         }
  73.         

  74.         
  75.         
  76.      }
  77.     if(TMR1IE&&TMR1IF)
  78.         {
  79.                 TMR1IF = 0;
  80.                 TMR1H = 0xFC;
  81.                   TMR1L = 0x17;//重裝初值定時時間1ms
  82.           if(flage3){count1++;}
  83.           else LED1COUNT++;
  84.           if(count1==500){LED2=1;count1=0;flage3=0;}
  85.           if(LED1COUNT==3000)  {TMR1ON=0;flage=0;LED1COUNT=0;}
  86.         }
  87. }
  88. /*====================================================
  89. *函數(shù)名:DEVICE_INIT
  90. *功能:上電器件初始化
  91. *輸入?yún)?shù):無
  92. *返回參數(shù):無
  93. ====================================================*/
  94. void DEVICE_INIT(void)
  95. {
  96.         OSCCON = 0B01010001; //Bit7   >>> LFMOD=0       >>> WDT振蕩器頻率=32KHz
  97.                          //Bit6:4 >>> IRCF[2:0]=101 >>> 內(nèi)部RC頻率=4MHz
  98.                          //Bit0   >>> SCS=1         >>> 系統(tǒng)時鐘選擇為內(nèi)部振蕩器
  99.         MSCKCON = 0B00000000;//Bit6   >>>  VREG_OE=0    >>> 禁止穩(wěn)壓輸出
  100.                          //Bit5  >>> T2CKSRC=0  >>> Timer2時鐘源為系統(tǒng)時鐘
  101.                          //Bit4  >>> SLVREN=0   >>> 關(guān)閉LVR
  102.         INTCON = 0B00000000; //暫禁止所有中斷
  103.         CMCON0 = 0B00000111; //關(guān)閉比較器,CxIN為數(shù)字IO口
  104.         ANSEL = 0B10000000;  //所有IO口都為數(shù)字IO
  105.         PORTA = 0B00000000;
  106.         TRISA = 0B01000000;  //RA0,RA6為輸入,其他為輸出
  107.         WPUA = 0B01000000;   //關(guān)閉PORTA口的內(nèi)部上拉除RA6
  108.         PORTC = 0B00000000;
  109.         TRISC = 0B00000000;  //設(shè)置所有PORTC口為輸出
  110.         WPUC = 0B00000000;   //關(guān)閉啟PORTC口所有上拉
  111.         OPTION = 0B00000000; //bit7=0,開啟PORTA內(nèi)部上拉總閘
  112.    
  113.    

  114. }



  115. /*====================================================
  116. *函數(shù)名:ENABLE_INTERRUPT
  117. *功能:開啟所需中斷
  118. *輸入?yún)?shù):無
  119. *返回參數(shù):無
  120. ====================================================*/
  121. void ENABLE_INTERRUPT(void)
  122. {
  123.         T0IF = 0;                         //清TIMER0中斷標(biāo)志位
  124.         T0IE = 1;                         //使能TIMER0中斷
  125.     TMR1IF = 0;                       //清TIMER1中斷標(biāo)志位
  126.         TMR1IE = 1;                       //使能TIMER1中斷               
  127.     PEIE = 1;                         //開啟外設(shè)總閘 timer1屬于外設(shè)
  128.          GIE = 1;                         //開啟總中斷
  129. }
  130. /*====================================================
  131. *函數(shù)名:TIMER1_INIT
  132. *功能:Tiemr1初始化
  133. *輸入?yún)?shù):無
  134. *返回參數(shù):無
  135. ====================================================*/
  136. void TIMER1_INIT(void)
  137. {
  138.         TMR1H = 0xFC;
  139.     TMR1L = 0x17;                  //Timer1初值為0xFC17=64535
  140.         T1CON = 0B00000000;            //預(yù)分頻值5,4位 11=1:8
  141.                                    //             10=1:4
  142.                                    //             01=1:2
  143.                                    //             00=1:1
  144.                                  
  145. }

  146. /*====================================================
  147. *函數(shù)名:Keycan
  148. *功能:按鍵函數(shù)
  149. *輸入?yún)?shù):無
  150. *返回參數(shù):無
  151. ====================================================*/

  152. void Keycan(void)
  153. {if(KEY==0)
  154. __delay_ms(20);
  155. if(KEY==0)
  156. {


  157. while(!KEY)
  158.    {__delay_ms(10);
  159.    flagecount++;
  160.    if((LED1==0)&&(LED2==0)&&(LED3==0)&&(flageled==0)&&(flagecount>299))//這里加flageled=0是為了處在LED2亮燈狀態(tài)時長按出現(xiàn)電量提示
  161.       break;
  162.    }
  163.    
  164. if(flagecount>299)

  165.    {if((LED1==0)&&(LED2==0)&&(LED3==0)&&(flageled==0))//這里加flageled=0是為了處在LED2亮燈狀態(tài)時長按出現(xiàn)電量提示
  166.       {flage=1;
  167.        flagecount=0;
  168.       }
  169.    else goto begin;
  170.    }

  171. else
  172. {
  173.   {if(flage==0)
  174.      {  begin:keycount++;
  175.         flagecount=0;flage=0;
  176.        switch(keycount)
  177.              {case 1:LED1=1;LED2=0;LED3=1;flageled=0;flageled2=0;break;
  178.               case 2:LED1=0;LED2=1;LED3=0;flageled=1;flageled2=0;break;
  179.               case 3:LED1=0;LED2=0;LED3=0;keycount=0;flageled=0;flageled2=0;break;
  180.              default: break;
  181.              }
  182.      }   
  183.   }
  184. }
  185. }
  186. }

  187. /*====================================================
  188. *函數(shù)名:ADC_INIT
  189. *功能:比較器初始化
  190. *輸入?yún)?shù):無
  191. *返回參數(shù):無
  192. ====================================================*/
  193. void ADC_INIT(void)
  194. {
  195.         ANSEL = 0B10000000;    //設(shè)置RA0為模擬輸入口
  196.         ADCON1 = 0B01100000;   //DIVS=0,時鐘選FOSC
  197.                                //ADCS[2:0]=110,分頻FOSC/64
  198.         ADCON0 = 0B10111100;       //B7,ADFM=1,結(jié)果右對齊
  199.                                //B6:5,VCFG=00,參考電壓VDD
  200.                                //B6:5,VCFG=01,參考電壓內(nèi)部2V
  201.                                //B6:5,VCFG=10,參考電壓內(nèi)部3V
  202.                                //B6:5,VCFG=11,參考電壓Vref
  203.                                //B4:2,CHS=000,選擇AN7通道
  204.                                //B1,GO,AD轉(zhuǎn)換狀態(tài)位
  205.                                //B0,ADON=1,ADC使能

  206. }
  207. /*====================================================
  208. *函數(shù)名:GET_ADC_VALUE
  209. *功能:開啟AD轉(zhuǎn)換,參考電壓為VDD
  210. *輸入?yún)?shù):ADC通道數(shù)
  211. *返回參數(shù):采樣到的AD值
  212. ====================================================*/
  213. unsigned int GET_ADC_VALUE()
  214. {
  215.         unsigned int TempADCBuffer=0;

  216.         ADCON0 |= 0b10000001;     //開啟ADC電路
  217.         __delay_us(10);           //等待采集到電壓
  218.         GO_DONE = 1;              //開啟轉(zhuǎn)換
  219.         while(GO_DONE==1) CLRWDT();//等待轉(zhuǎn)換完成
  220.         TempADCBuffer = ADRESH;
  221.         TempADCBuffer = (TempADCBuffer<<8)|ADRESL;
  222.         ADON = 0;
  223.         return(TempADCBuffer);

  224. }
  225. /*====================================================
  226. *函數(shù)名:u16_adcvalue
  227. *功能:開啟AD轉(zhuǎn)換,參考電壓為VDD
  228. *輸入?yún)?shù):ADC通道數(shù)
  229. *返回參數(shù):采樣到的AD值
  230. ====================================================*/
  231. void Float_adcvalue(void)
  232. { unsigned char i;
  233.   for(i=0;i<20;i++)
  234.   { advalue+=GET_ADC_VALUE();}
  235.   advalue=advalue/20;
  236.   adcvalue=advalue;
  237.   adcvalue=adcvalue/1023*2.0000;
  238.    //if(adcvalue>2) Led1_lighter();
  239.    if(flageled)
  240.    {if(adcvalue<0.80) flageled2=1;
  241.    else {flageled2=0;LED1=0;LED2=1;LED3=0;}
  242.    }
  243.    
  244.    
  245.    else
  246.    { flageled=0;flageled2=0;
  247.      if(adcvalue>=1.07)
  248.        { Led1_lighter();}
  249.      if(adcvalue<1.07,adcvalue>=0.98)
  250.        { Led2_lighter();}
  251.      if(adcvalue<0.98)
  252.        {Led3_lighter();}
  253.       TMR1ON=1;
  254.       
  255.    }


  256. }
  257. /*====================================================
  258. *函數(shù)名:Led1_lighter()
  259. *功能:微亮3個燈
  260. *輸入?yún)?shù):
  261. *返回參數(shù):
  262. ====================================================*/
  263. void Led1_lighter(void)//微亮3個燈
  264. {LED1=1;LED2=1;LED3=1;
  265. __delay_us(500);
  266. LED1=0;LED2=0;LED3=0;
  267. //__delay_us(1);
  268. }

  269. /*====================================================
  270. *函數(shù)名:Led2_lighter()
  271. *功能:微亮2個燈
  272. *輸入?yún)?shù):
  273. *返回參數(shù):
  274. ====================================================*/
  275. void Led2_lighter(void)//微亮2個燈
  276. {LED1=0;LED2=1;LED3=1;
  277. __delay_us(500);
  278. ……………………

  279. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼




全部資料51hei下載地址:
頭燈制作.zip (201.87 KB, 下載次數(shù): 90)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2018-8-24 16:31 | 只看該作者
程序是反匯編得到的嗎?
回復(fù)

使用道具 舉報

板凳
ID:1 發(fā)表于 2018-8-24 16:33 | 只看該作者
看到了 有c語言的版本,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

地板
ID:391730 發(fā)表于 2018-8-30 19:31 | 只看該作者
adcvalue=adcvalue/1023*2.0000  明明參考電壓取得是VDD,為何乘的是2?
回復(fù)

使用道具 舉報

5#
ID:76293 發(fā)表于 2018-8-30 21:33 | 只看該作者
liuguonianhua 發(fā)表于 2018-8-30 19:31
adcvalue=adcvalue/1023*2.0000  明明參考電壓取得是VDD,為何乘的是2?

內(nèi)部2v
回復(fù)

使用道具 舉報

6#
ID:395609 發(fā)表于 2018-9-9 13:59 | 只看該作者
你好,請問下有沒有MS83F0802相關(guān)的資料或者數(shù)據(jù)手冊?請不吝賜教。網(wǎng)上沒找到相關(guān)的資料  謝謝
回復(fù)

使用道具 舉報

7#
ID:436758 發(fā)表于 2018-11-30 20:00 | 只看該作者
看樣子用這芯片的人好少, 用這東東做下遙控接收還是很好的 便宜實惠
回復(fù)

使用道具 舉報

8#
ID:391730 發(fā)表于 2019-2-14 20:06 | 只看該作者
樓主完全沒有實現(xiàn)上述功能,程序全是錯的!DEVICE_INIT(void)這個初始化引腳函數(shù)中,將PA6配置成了輸入TRISA = 0B01000000; ,實際這個輸入指的是模擬信號輸入,如果接的是開關(guān)信號應(yīng)該將應(yīng)該將PA6配置為輸出才對!輸入在這款單片機(jī)中是為了ADC采集模擬信號!這是第一處錯誤,第二處錯誤,樓主將ADC_INIT()中,將采集通道設(shè)置成了1/4 VDD,而在Float_adcvalue(void)中用的是adcvalue=adcvalue/1023*2.0000;這個值根本就不是VDD的值,而是1/4 vdd的值!本來想?yún)⒖紭侵鞔a的,但是看到這么多漫不經(jīng)心的錯誤,完全是誤人子弟!
回復(fù)

使用道具 舉報

9#
ID:76293 發(fā)表于 2019-3-1 14:39 | 只看該作者
liuguonianhua 發(fā)表于 2019-2-14 20:06
樓主完全沒有實現(xiàn)上述功能,程序全是錯的!DEVICE_INIT(void)這個初始化引腳函數(shù)中,將PA6配置成了輸入TRIS ...

你厲害
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区三区久久久蜜月 | 久久y| 国产成人综合在线 | 欧美一级免费看 | 九九亚洲| 日韩黄 | 欧美激情久久久 | 国产精品视频不卡 | 亚洲美乳中文字幕 | 狠狠干2020 | 99精品一级欧美片免费播放 | 日日日操| 超碰免费在线观看 | 国产在线精品一区 | 欧美一级片a | 日韩欧美黄色 | a黄视频 | 日韩精品一区二区三区高清免费 | 国产精品视频偷伦精品视频 | 在线亚洲人成电影网站色www | 国产美女一区二区 | 精品日韩电影 | 日韩一级 | 国产1区| 日日骚视频| 亚洲成人av在线播放 | 午夜在线视频一区二区三区 | 色综合久久天天综合网 | 在线免费观看a级片 | 国产视频精品免费 | 中文字幕日韩欧美一区二区三区 | 久久久久国产一区二区三区四区 | 国产黄色小视频在线观看 | 一区二区三区四区在线 | 北条麻妃国产九九九精品小说 | 久久大全 | 精品一区二区三区在线观看 | 成人免费视频网 | 欧洲成人午夜免费大片 | 国产免费一区二区三区 | 欧美日韩一卡 |