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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12363|回復: 8
收起左側

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

[復制鏈接]
ID:76293 發表于 2018-8-24 09:11 | 顯示全部樓層 |閱讀模式
雖然是個簡單的東西但是花了好長時間,寫程序期間遇到了好多問題,然后慢慢的修改,直到完成,能夠做出來感覺很欣慰,特此上傳來共同學習進步。

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

說明書截圖

說明書截圖


電路原理圖如下:

原理圖截圖

原理圖截圖


程序截圖:

程序截圖

程序截圖


單片機源程序如下:
  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轉換結果測試
  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. *函數名:main
  27. *功能:主函數
  28. *輸入參數:無
  29. *返回參數:無
  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();//進入定時器中斷
  41.         while(1)
  42.         { CLRWDT();
  43.       if(!flage) Keycan();
  44.       if(flage||flageled)  Float_adcvalue();
  45.     }
  46. }
  47. /*====================================================
  48. *函數名:interrupt ISR
  49. *功能:中斷服務函數
  50. *輸入參數:無
  51. *返回參數:無
  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. *函數名:DEVICE_INIT
  90. *功能:上電器件初始化
  91. *輸入參數:無
  92. *返回參數:無
  93. ====================================================*/
  94. void DEVICE_INIT(void)
  95. {
  96.         OSCCON = 0B01010001; //Bit7   >>> LFMOD=0       >>> WDT振蕩器頻率=32KHz
  97.                          //Bit6:4 >>> IRCF[2:0]=101 >>> 內部RC頻率=4MHz
  98.                          //Bit0   >>> SCS=1         >>> 系統時鐘選擇為內部振蕩器
  99.         MSCKCON = 0B00000000;//Bit6   >>>  VREG_OE=0    >>> 禁止穩壓輸出
  100.                          //Bit5  >>> T2CKSRC=0  >>> Timer2時鐘源為系統時鐘
  101.                          //Bit4  >>> SLVREN=0   >>> 關閉LVR
  102.         INTCON = 0B00000000; //暫禁止所有中斷
  103.         CMCON0 = 0B00000111; //關閉比較器,CxIN為數字IO口
  104.         ANSEL = 0B10000000;  //所有IO口都為數字IO
  105.         PORTA = 0B00000000;
  106.         TRISA = 0B01000000;  //RA0,RA6為輸入,其他為輸出
  107.         WPUA = 0B01000000;   //關閉PORTA口的內部上拉除RA6
  108.         PORTC = 0B00000000;
  109.         TRISC = 0B00000000;  //設置所有PORTC口為輸出
  110.         WPUC = 0B00000000;   //關閉啟PORTC口所有上拉
  111.         OPTION = 0B00000000; //bit7=0,開啟PORTA內部上拉總閘
  112.    
  113.    

  114. }



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

  146. /*====================================================
  147. *函數名:Keycan
  148. *功能:按鍵函數
  149. *輸入參數:無
  150. *返回參數:無
  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亮燈狀態時長按出現電量提示
  161.       break;
  162.    }
  163.    
  164. if(flagecount>299)

  165.    {if((LED1==0)&&(LED2==0)&&(LED3==0)&&(flageled==0))//這里加flageled=0是為了處在LED2亮燈狀態時長按出現電量提示
  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. *函數名:ADC_INIT
  189. *功能:比較器初始化
  190. *輸入參數:無
  191. *返回參數:無
  192. ====================================================*/
  193. void ADC_INIT(void)
  194. {
  195.         ANSEL = 0B10000000;    //設置RA0為模擬輸入口
  196.         ADCON1 = 0B01100000;   //DIVS=0,時鐘選FOSC
  197.                                //ADCS[2:0]=110,分頻FOSC/64
  198.         ADCON0 = 0B10111100;       //B7,ADFM=1,結果右對齊
  199.                                //B6:5,VCFG=00,參考電壓VDD
  200.                                //B6:5,VCFG=01,參考電壓內部2V
  201.                                //B6:5,VCFG=10,參考電壓內部3V
  202.                                //B6:5,VCFG=11,參考電壓Vref
  203.                                //B4:2,CHS=000,選擇AN7通道
  204.                                //B1,GO,AD轉換狀態位
  205.                                //B0,ADON=1,ADC使能

  206. }
  207. /*====================================================
  208. *函數名:GET_ADC_VALUE
  209. *功能:開啟AD轉換,參考電壓為VDD
  210. *輸入參數:ADC通道數
  211. *返回參數:采樣到的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;              //開啟轉換
  219.         while(GO_DONE==1) CLRWDT();//等待轉換完成
  220.         TempADCBuffer = ADRESH;
  221.         TempADCBuffer = (TempADCBuffer<<8)|ADRESL;
  222.         ADON = 0;
  223.         return(TempADCBuffer);

  224. }
  225. /*====================================================
  226. *函數名:u16_adcvalue
  227. *功能:開啟AD轉換,參考電壓為VDD
  228. *輸入參數:ADC通道數
  229. *返回參數:采樣到的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. *函數名:Led1_lighter()
  259. *功能:微亮3個燈
  260. *輸入參數:
  261. *返回參數:
  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. *函數名:Led2_lighter()
  271. *功能:微亮2個燈
  272. *輸入參數:
  273. *返回參數:
  274. ====================================================*/
  275. void Led2_lighter(void)//微亮2個燈
  276. {LED1=0;LED2=1;LED3=1;
  277. __delay_us(500);
  278. ……………………

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


0.png

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2018-8-24 16:31 | 顯示全部樓層
程序是反匯編得到的嗎?
回復

使用道具 舉報

ID:1 發表于 2018-8-24 16:33 | 顯示全部樓層
看到了 有c語言的版本,好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:391730 發表于 2018-8-30 19:31 | 顯示全部樓層
adcvalue=adcvalue/1023*2.0000  明明參考電壓取得是VDD,為何乘的是2?
回復

使用道具 舉報

ID:76293 發表于 2018-8-30 21:33 | 顯示全部樓層
liuguonianhua 發表于 2018-8-30 19:31
adcvalue=adcvalue/1023*2.0000  明明參考電壓取得是VDD,為何乘的是2?

內部2v
回復

使用道具 舉報

ID:395609 發表于 2018-9-9 13:59 | 顯示全部樓層
你好,請問下有沒有MS83F0802相關的資料或者數據手冊?請不吝賜教。網上沒找到相關的資料  謝謝
回復

使用道具 舉報

ID:436758 發表于 2018-11-30 20:00 | 顯示全部樓層
看樣子用這芯片的人好少, 用這東東做下遙控接收還是很好的 便宜實惠
回復

使用道具 舉報

ID:391730 發表于 2019-2-14 20:06 | 顯示全部樓層
樓主完全沒有實現上述功能,程序全是錯的!DEVICE_INIT(void)這個初始化引腳函數中,將PA6配置成了輸入TRISA = 0B01000000; ,實際這個輸入指的是模擬信號輸入,如果接的是開關信號應該將應該將PA6配置為輸出才對!輸入在這款單片機中是為了ADC采集模擬信號!這是第一處錯誤,第二處錯誤,樓主將ADC_INIT()中,將采集通道設置成了1/4 VDD,而在Float_adcvalue(void)中用的是adcvalue=adcvalue/1023*2.0000;這個值根本就不是VDD的值,而是1/4 vdd的值!本來想參考樓主代碼的,但是看到這么多漫不經心的錯誤,完全是誤人子弟!
回復

使用道具 舉報

ID:76293 發表于 2019-3-1 14:39 | 顯示全部樓層
liuguonianhua 發表于 2019-2-14 20:06
樓主完全沒有實現上述功能,程序全是錯的!DEVICE_INIT(void)這個初始化引腳函數中,將PA6配置成了輸入TRIS ...

你厲害
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re国产精品| 欧美日韩在线播放 | 久久久人成影片免费观看 | 在线不卡视频 | 国产精品区二区三区日本 | 国产成人在线播放 | 黄色一级大片在线免费看产 | 国产一区二区在线免费 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲毛片在线 | 日韩网站在线观看 | 国产免费一区 | 欧美精品一区二区三区在线 | 日韩精品成人免费观看视频 | 免费精品 | 亚洲一区视频在线 | 999免费观看视频 | 亚洲精品电影在线观看 | 岛国av在线免费观看 | 瑟瑟视频在线看 | 伊人网站在线 | 亚欧洲精品在线视频免费观看 | 亚洲国产精品99久久久久久久久 | 欧美综合国产精品久久丁香 | 一区二区三区中文字幕 | 欧美日本韩国一区二区 | 国产专区在线 | 久久在看| 成人亚洲精品久久久久软件 | 精品国产欧美 | 日本网站免费在线观看 | 亚洲国产精品区 | 欧洲尺码日本国产精品 | 伊人超碰| 日韩视频在线一区 | 一区视频在线播放 | 成人伊人网 | 欧美日韩一卡 | 91精品国产91久久久 | 日本成人中文字幕在线观看 | 99热电影|