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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4860|回復: 1
打印 上一主題 下一主題
收起左側

262電源的mega48單片機源代碼帶Protues仿真

[復制鏈接]
跳轉到指定樓層
樓主
分享一個電源的mega48程序帶Protues仿真和源代碼

下面是262電源的仿真原理圖:


部分單片機源碼預覽:
  1. //ICC-AVR application builder : 2016/12/5 8:30:38
  2. // Target : m48p
  3. // Crystal: 1.0000Mhz
  4. #include <avr/io.h>
  5. #include <avr/interrupt.h>
  6. #include <util/delay.h>
  7. #include <math.h>
  8. //void _delay_us (double __us);  //微秒級
  9. //void _delay_ms (double __ms); //毫秒級

  10. /*******************指示燈宏定義*******************/
  11. #define   z_LED_ON()   (PORTB|=0x08)        //主電燈亮        PB3
  12. #define   z_LED_OFF()   (PORTB&=0xE7)        //主電燈滅

  13. #define   b_LED_ON()   (PORTB|=0x20)        //備電燈亮        PB5
  14. #define   b_LED_OFF()   (PORTB&=0xDF)        //備電燈滅

  15. #define   r_LED_ON()   (PORTD|=0x01)        //弱電燈亮        PD0
  16. #define   r_LED_OFF()   (PORTD&=0xFE)        //弱電燈滅

  17. #define   o_LED_ON()   (PORTD|=0x02)        //輸出燈亮        PD1
  18. #define   o_LED_OFF()   (PORTD&=0xfD)        //輸出燈滅

  19. #define   c_LED_ON()   (PORTD|=0x08)        //充電燈亮        PD3
  20. #define   c_LED_OFF()   (PORTD&=0xf7)        //充電燈滅

  21. #define   c_LED_STATE()   (PORTD^=(1<<PD3))        //充電燈滅

  22. #define M10_OFF()   (PORTD&=0xBF)        //PD6置0         M10
  23. #define M10_ON()   (PORTD|=0x40)        //PD6置1        M10


  24. #define M32_OFF()   (PORTD&=0xFB)        //PD2置0         M32
  25. #define M32_ON()   (PORTD|=0x04)        //PD2置1        M32

  26. /*******************電壓采集通道宏定義*******************/
  27. #define         Spare_ele_via           0x40                //ADC0-PC1備電
  28. #define         Main_ele_via         0x41                //ADC1-PC0主電


  29. #define  uchar unsigned char
  30. #define  uint unsigned int


  31. /*******************************************
  32. 函數名稱: IO口初始化程序
  33. 功    能: 實現IO初始化
  34. 參    數: 無
  35. 返 回 值: 無
  36. ********************************************/
  37. void port_init(void)
  38. {
  39. PORTC = 0x00;//上拉電阻不使能
  40. DDRC  = 0x00;  //PC0作為AD的輸入
  41. PORTB = 0x00;//輸出置0
  42. DDRB  = 0xFF;//輸出
  43. DDRD  = 0xFF;//AIN1設置為輸入
  44. PORTD = 0x01;//上拉電阻不使能
  45. }
  46. /*****************************************************
  47. 函數名稱: 定時器1初始化函數
  48. 功    能: 分頻數1024,定時1秒,誤差為0.0%,TOP=0xFFFF
  49. 參    數: 無
  50. 返 回 值: 無
  51. ****************************************************/
  52. void timer1_init(void)
  53. {
  54. TCCR1B = 0x00; //stop
  55. TCNT1H = 0xF0; //setup
  56. TCNT1L = 0xBE;
  57. OCR1AH = 0x0F;
  58. OCR1AL = 0x42;
  59. OCR1BH = 0x0F;
  60. OCR1BL = 0x42;
  61. ICR1H  = 0x0F;
  62. ICR1L  = 0x42;
  63. TCCR1A = 0x00;
  64. }
  65. /*******************************************
  66. 函數名稱: 定時器1中斷處理函數
  67. 功    能: flag標志位來指示狀態
  68. 參    數: 無
  69. 返 回 值: 無
  70. ********************************************/
  71. ISR(TIMER1_OVF_vect)
  72. {
  73. static unsigned int m;
  74. TCNT1H = 0xF0; //setup
  75. TCNT1L = 0xBE;
  76.         ++m;
  77. if(m==1||m==2||m==3)
  78. {
  79.         c_LED_ON();
  80. }
  81. else
  82. {
  83.         m=0;
  84.         c_LED_OFF();
  85. }
  86. //c_LED_STATE();
  87. }
  88. /*******************************************
  89. 函數名稱: 設備初始化函數
  90. 功    能: 對AVR單片機進行初始化
  91. 參    數: 無
  92. 返 回 值: 無
  93. ********************************************/
  94. void init_devices(void)
  95. {
  96. cli(); //disable all interrupts
  97. port_init();
  98. timer1_init();
  99. MCUCR = 0x00;//允許引腳電阻上拉
  100. EICRA = 0x00; //外部中斷
  101. EIMSK = 0x00;//外部中斷失能

  102. TIMSK0 = 0x00; //timer 0 interrupt sources
  103. TIMSK1 = 0x01; //T/C1 溢出中斷使能
  104. TIMSK2 = 0x00; //timer 2 interrupt sources

  105. PCMSK0 = 0x00; //pin change mask 0 引腳電平變化中斷禁用
  106. PCMSK1 = 0x00; //pin change mask 1
  107. PCMSK2 = 0x00; //pin change mask 2
  108. PCICR = 0x00; //pin change enable 引腳電平變化中斷控制寄存器禁用
  109. SMCR = 0x00; //power controller
  110. sei(); //開總中斷
  111. }
  112. /*************************************************************
  113. 函數名稱: AD采樣函數。
  114. 功    能: 實現電壓的AD采樣。
  115. 參    數: 無
  116. 返 回 值: temp--AD采樣的值。
  117. ************************************************************/
  118. unsigned int mega48_ad(unsigned char channel)
  119. {
  120. volatile static unsigned int ad_value[64];   //AD轉換緩沖
  121. volatile static unsigned char ch=0x40;
  122. unsigned int  temp;
  123. unsigned char i;
  124. static unsigned int max_value;
  125.    
  126.   ADMUX = channel; //5V電壓 AVCC
  127.   ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);      //開啟AD轉換功能單次模式,32分頻
  128.   if(ch==channel)
  129. {
  130.    ADCSRA |= (1<<ADSC);       //啟動轉換
  131.    while(ADCSRA&_BV(ADSC));       //查詢是否轉換結束
  132.   temp = ADCL;
  133.   temp|= (unsigned int)(ADCH<<8);
  134.   temp=temp&0x3FF;
  135.   return temp;
  136. }else
  137. {
  138. for(i=0;i<64;i++)
  139. {
  140.   ADCSRA |= (1<<ADSC);       //啟動轉換

  141.   while(ADCSRA&_BV(ADSC))       //查詢是否轉換結束
  142.   {
  143.    _delay_us(500);
  144.   }
  145.   temp = ADCL;
  146.   temp|= (unsigned int)(ADCH<<8);
  147.   ad_value[i] = temp&0x3FF;
  148. }

  149. max_value = ad_value[0];
  150. for(i=1;i<64;i++)
  151. {
  152.   if(ad_value[i]>max_value)
  153.   {
  154.    max_value =ad_value[i];
  155.   }
  156. }
  157. max_value =(long int)(max_value/M_SQRT2);
  158. return max_value;
  159. }
  160. //ADCSRA &= 0x7F;
  161. }
  162. /********************************************
  163. 函數名稱: 主函數
  164. 功    能:
  165. 參    數: 無
  166. 返 回 值: 無
  167. ********************************************/
  168. int main(void)
  169. {   uint ad[2];
  170.   volatile static unsigned int cutflag;
  171.    float z_voltage, b_voltage;

  172.    init_devices();

  173.    while(1)
  174.    {
  175.    ad[0]=mega48_ad(Main_ele_via);  //讀出AD的采樣值
  176.    z_voltage=(ad[0]*5.0)/1024.0;
  177.    ad[1]=mega48_ad(Spare_ele_via);
  178.    b_voltage=(ad[1]*5.0)/1024.0;

  179. if((cutflag==0) && z_voltage>=1.05 && b_voltage>=2)//主電正常,備電正常
  180.         {                       
  181.                         o_LED_OFF();//主電輸出
  182.                         b_LED_ON();//備電燈亮
  183.                         z_LED_ON();//主電燈亮       
  184.         if(b_voltage<=2.8)//主電正常,備電正常,脈沖充電
  185.                 {
  186.                         M32_OFF();
  187.                         cutflag=0;
  188.                         TCCR1B = 0x05; //start Timer
  189.                 }else
  190.                 {               
  191.                      c_LED_OFF();//充電燈滅
  192.                    TCCR1B = 0x00; //stop
  193.                 }

  194.         }
  195.         else if(z_voltage>=1.05&&b_voltage<=2)//主電正常,備電不正常
  196.         {
  197.                         TCCR1B = 0x00; //stop
  198.                         r_LED_ON();//
  199.                         o_LED_OFF();//主電輸出
  200.                         b_LED_OFF();//備電燈滅
  201.                         c_LED_OFF();//充電燈滅
  202.                         z_LED_ON();//主電燈亮

  203.         }
  204.         else if(z_voltage<1.05&&b_voltage>=2)//主電不正常,備電正常
  205.                 {

  206.                                 TCCR1B = 0x00; //stop
  207.                                 z_LED_OFF();
  208.                                 o_LED_ON();//輸出
  209.                                 cutflag=1;
  210.                                 b_LED_ON();//備電燈亮
  211.                                 c_LED_OFF();//充電燈滅       
  212.                                 r_LED_ON();//弱電燈亮
  213.                                 _delay_ms(1);
  214.                                 M32_ON();
  215.                 }
  216.         else if(z_voltage<1.05&&b_voltage<1.8)//主電不正常,備電電池耗盡
  217.         {


  218.                                  TCCR1B = 0x00; //stop
  219.                                 z_LED_OFF();//主電燈滅
  220.                                 b_LED_OFF();//備電燈滅
  221.                                 c_LED_OFF();//充電燈滅
  222.                                 r_LED_OFF();//弱電燈滅
  223.                                 o_LED_OFF();//不輸出


  224.         }
  225.         else//備電電壓1.8<備電<2 and  主電不正常
  226.         {
  227.                  TCCR1B = 0x00; //stop
  228.                 c_LED_OFF();//充電燈滅
  229.                 b_LED_ON();//備電燈亮
  230.                 z_LED_OFF();//主電燈滅
  231.                 o_LED_ON();//備電輸出
  232.         }


  233. if((cutflag==1) && z_voltage>=1.3 && b_voltage>=2)
  234.         {
  235.         _delay_us(1);
  236.         if((cutflag==1) && z_voltage>=1.3 && b_voltage>=2)
  237.                 {
  238.                         cutflag=0;

  239.                 }
  240.        
  241.         }
  242.    }
  243. }
復制代碼



所有資料下載(包含仿真工程文件和源程序):
262電源程序MEGA48.rar (406.74 KB, 下載次數: 18)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:201474 發表于 2017-5-17 18:51 | 只看該作者
現在正在用這個開發,感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美精品一区二区 | 天天干天天爱天天 | 91资源在线 | 国产一区二区在线免费观看 | 精品久久久久久中文字幕 | 久久久成人精品 | 中文字幕一区二区三区精彩视频 | 一区二区精品视频 | 亚洲精品白浆高清久久久久久 | 欧美v在线| 亚洲人久久| 国产成人精品一区二区三区网站观看 | 在线观看中文字幕亚洲 | 婷婷久久久久 | 桃花av在线 | 日韩欧美国产精品 | 欧美一区二区三区在线 | 国产小视频在线看 | 人人做人人澡人人爽欧美 | 这里精品 | 欧美一区二区黄 | 少妇性l交大片免费一 | 欧美白人做受xxxx视频 | 搞黄视频免费看 | 亚洲精品一级 | 伊人影院99 | 国产一级视频在线 | 伊人免费视频二 | 久久亚洲国产精品 | 一二三四在线视频观看社区 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲日本国产 | 91成人影院 | 无人区国产成人久久三区 | 国产一区不卡 | 国产精品精品视频一区二区三区 | 国产成人免费视频网站视频社区 | 免费同性女女aaa免费网站 | 国产亚洲精品精品国产亚洲综合 | 日韩欧美在线不卡 | 亚洲在线 |