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

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于PIC16f1828單片機(jī)分立功能的程序整合在一起的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
新手求助,剛開(kāi)始接觸單片機(jī),需要用pic16f1828實(shí)現(xiàn)PWM呼吸燈的功能,并可以通過(guò)一個(gè)按鍵以及一個(gè)光敏電阻來(lái)控制呼吸燈的亮滅;當(dāng)光敏電阻感應(yīng)到光照時(shí)燈帶熄滅,同時(shí)可用按鍵點(diǎn)亮。我寫(xiě)了按鍵和光敏電阻的使用程序,分開(kāi)來(lái)可以實(shí)現(xiàn)功能,但是不懂的該怎么把分立功能的程序整合在一起,請(qǐng)大神幫幫忙,謝謝

電路原理圖如下:


單片機(jī)源程序:
  1. #include <pic16f1828.h>
  2. #define ADC_NUM 8//轉(zhuǎn)換次數(shù)
  3. #define LED LATC0
  4. void init_GPIO(void)
  5. {
  6. TRISC=0x04;
  7. ANSELC=0x04;
  8. PORTC=0x00;
  9. LATC=0x00;
  10. }
  11. void init_fosc(void)
  12. {
  13. OSCCON=0xF0;
  14. }
  15. void init_AD(void)
  16. {
  17. ADCON1=0XA0;//右對(duì)齊,32時(shí)鐘,參考電源電壓
  18. ADCON0=0x18;//AN6通道
  19. ADCON0bits.ADON=1;
  20. }
  21. unsigned int ADC_BAT_ONE(void)
  22. {
  23. unsigned int value;
  24. value=0;
  25. ADCON0bits.CHS=6;
  26. ADCON0bits.ADGO=1;
  27. while(ADCON0bits.GO==1);
  28. value=(unsigned int)ADRESH;
  29. value=value<<8;
  30. value+=ADRESL;
  31. return value;
  32. }
  33. unsigned int ADC_BAT_contiue(void)
  34. {
  35. unsigned int ADV_MCU[ADC_NUM],ADV_CNT,ADV_ALL;
  36. ADV_ALL=0;
  37. for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
  38. {
  39.   ADV_MCU[ADV_CNT]=ADC_BAT_ONE();
  40. }
  41. for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
  42. {
  43.   ADV_ALL+=ADV_MCU[ADV_CNT];
  44. }
  45. ADV_ALL=ADV_ALL/ADC_NUM;
  46. return ADV_ALL;
  47. }
  48. void main()
  49. {
  50.   init_fosc();
  51.    init_GPIO();
  52.    init_AD();
  53.    while(1)
  54.    {
  55.     if(ADC_BAT_contiue()>400)//1.2V
  56.     {
  57.      LED=1;
  58.     }
  59.     else
  60.     {
  61.      LED=0;
  62.     }
  63.    }
  64.    }

  65. #include<pic16f1828.h>
  66. void IO_init()
  67. {
  68. ANSELC=0;
  69. PORTCbits.RC0=1;
  70. TRISCbits.TRISC0=0;
  71. TRISCbits.TRISC3=1;
  72. WPUCbits.WPUC3=1;
  73. }
  74. void delay(unsigned int x)
  75. {
  76. unsigned int y,z;
  77. for(y=x;y>0;y--)
  78.     for(z=25;z>0;z--);
  79. }

  80. void main(void)
  81. {
  82. static bit temp=0;
  83.   IO_init();
  84.   delay(1000);
  85.   while(RC3);
  86.   while(1)

  87.     if(RC3==1)
  88.     {
  89.       while(RC3);
  90.       {
  91.        temp=~temp;
  92.        PORTCbits.RC0=temp;
  93.       }
  94.     }
  95.   }

復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:381818 發(fā)表于 2018-8-6 12:27 | 只看該作者
用中斷或者if查詢(xún),程序都寫(xiě)好了,直接調(diào)用相應(yīng)函數(shù)就行了
回復(fù)

使用道具 舉報(bào)

板凳
ID:381818 發(fā)表于 2018-8-6 12:28 | 只看該作者
你的.docx文件打開(kāi)是亂碼
回復(fù)

使用道具 舉報(bào)

地板
ID:383379 發(fā)表于 2018-8-6 13:36 | 只看該作者
達(dá)達(dá)達(dá) 發(fā)表于 2018-8-6 12:28
你的.docx文件打開(kāi)是亂碼

抱歉,可能是因?yàn)榧用艿脑,我是第一次接觸單片機(jī),基礎(chǔ)很差,單獨(dú)的兩個(gè)程序就是不懂的該怎么整合在一起,就是不懂該怎么入手?梢詭臀铱纯磫?謝謝
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2018-8-6 18:39 | 只看該作者
給你改了一下試試。

  1. #include <pic16f1828.h>
  2. #define ADC_NUM 8//轉(zhuǎn)換次數(shù)
  3. #define LED LATC0
  4. //#include<pic16f1828.h>
  5. void IO_init()
  6. {
  7.         ANSELC=0;
  8.         PORTCbits.RC0=1;
  9.         TRISCbits.TRISC0=0;
  10.         TRISCbits.TRISC3=1;
  11.         WPUCbits.WPUC3=1;
  12. }
  13. void delay(unsigned int x)
  14. {
  15.         unsigned int y,z;
  16.        
  17.         for(y=x; y>0; y--)
  18.                 for(z=25; z>0; z--);
  19. }

  20. void init_GPIO(void)
  21. {
  22.         TRISC=0x04;
  23.         ANSELC=0x04;
  24.         PORTC=0x00;
  25.         LATC=0x00;
  26. }
  27. void init_fosc(void)
  28. {
  29.         OSCCON=0xF0;
  30. }
  31. void init_AD(void)
  32. {
  33.         ADCON1=0XA0;//右對(duì)齊,32時(shí)鐘,參考電源電壓
  34.         ADCON0=0x18;//AN6通道
  35.         ADCON0bits.ADON=1;
  36. }
  37. unsigned int ADC_BAT_ONE(void)
  38. {
  39.         unsigned int value;
  40.        
  41.         value=0;
  42.         ADCON0bits.CHS=6;
  43.         ADCON0bits.ADGO=1;
  44.         while(ADCON0bits.GO==1);
  45.         value=(unsigned int)ADRESH;
  46.         value=value<<8;
  47.         value+=ADRESL;
  48.         return value;
  49. }
  50. unsigned int ADC_BAT_contiue(void)
  51. {
  52.         unsigned int ADV_MCU[ADC_NUM], ADV_CNT, ADV_ALL;
  53.        
  54.         ADV_ALL=0;
  55.         for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
  56.         {
  57.                 ADV_MCU[ADV_CNT]=ADC_BAT_ONE();
  58.         }
  59.         for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
  60.         {
  61.                 ADV_ALL+=ADV_MCU[ADV_CNT];
  62.         }
  63.         ADV_ALL=ADV_ALL/ADC_NUM;
  64.         return ADV_ALL;
  65. }
  66. void main()
  67. {
  68.         static bit temp=0;
  69.        
  70.         IO_init();
  71.         delay(1000);
  72.         while(RC3);

  73.         init_fosc();
  74.         init_GPIO();
  75.         init_AD();
  76.         while(1)
  77.         {
  78.                 if(ADC_BAT_contiue()>400)//1.2V
  79.                 {
  80.                         LED=1;
  81.                 }
  82.                 else
  83.                 {
  84.                         LED=0;
  85.                 }
  86.                 if(RC3==1)
  87.                 {
  88.                         while(RC3);
  89.                         {
  90.                                 temp=~temp;
  91.                                 PORTCbits.RC0=temp;
  92.                         }
  93.                 }
  94.                
  95.         }
  96.         //while(1)
  97. }

  98. /*
  99. void main(void)
  100. {
  101. }

  102. */

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:383379 發(fā)表于 2018-8-7 08:40 | 只看該作者
angmall 發(fā)表于 2018-8-6 18:39
給你改了一下試試。

好的,我試試,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表