找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3651|回复: 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 单片机教程网

快速回复 返回顶部 返回列表