左瓶程序参考模板_第1页
左瓶程序参考模板_第2页
左瓶程序参考模板_第3页
左瓶程序参考模板_第4页
左瓶程序参考模板_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*/* Name: 电子设计电源题 功能:稳压,电路保护功能 */ /* Designed by : 胡车,蒋睿,张佩小组 Date:2013/9/5 21:09 */* 开发环境: ICCAVR */* PD0确定键,PD1增加键,PD2菜单键,PD7减小键,PD5输出PWM波,PD6接继电器 */* PA0PA2液晶控制,PB口液晶数据口,PA5采样电压输入,PA6采样电流输入 */*/#include <iom16v.h>#include <macros.h>#include "1602.h"#define uchar unsigned ch

2、ar#define uint unsigned int#define Get_Bit(val, bitn) (val &(1<<(bitn) ) uint addata;uint rec=1;uchar flag=1;/进入按键中断标志uchar key_flag=0;/按键标志位uchar num_flag=0;/数字改变标志uchar err_flag=0;/出错类型标志uchar delay_flag=0;/适应电压标志uint vol_exp=368;/360理想输出电压 uint num1=1,num2=5;uint k1,k2;uchar cont1="

3、;Limited Current:"uchar cont2=" . A " uchar temp1="Voltage: . V ",temp2="Current: . A ",temp3="DUTY CYCLE: %"float temp1float=0,temp2float=0;uint temp1int=0,temp2int=0; void port_init(void) PORTA = 0xf8;/f8 DDRA = 0x07; PORTB = 0x00; DDRB = 0xFF; PORTC =

4、0xFF; /m103 output only DDRC = 0x00; PORTD = 0x8F; DDRD = 0x70;/TIMER1 initialize - prescale:1/ WGM: 5) PWM 8bit fast, TOP=0x00FF/ desired value: 31.25KHz/ actual value: 31.250KHz (0.0%)void timer1_init(void) TCCR1B = 0x00; /stop TCNT1H = 0xFF; /setup TCNT1L = 0x01; OCR1AH = 0x00; OCR1AL = 0x30;/改变A

5、占空比 OCR1BH = 0x00; OCR1BL = 0x5E;/改变B占空比 ICR1H = 0x00; ICR1L = 0xFF; TCCR1A = 0xF1; TCCR1B = 0x09; /start Timer1 / 7/*延时函数*/void delay_ms(unsigned int xms) int i,j; for(i=0;i<xms;i+) for(j=0;j<1140;j+); void delay(uint x) int i,j; for(i=0;i<x;i+) for(j=0;j<200;j+); /按下按键后待处理的程序void key_s

6、ol(void)/液晶界面 flag=0; key_flag=1; LcdInit(); WriteChar(1,0,16,cont1); WriteChar(2,0,16,cont2); WriteNum(2,0,ASCIInum1); WriteNum(2,2,ASCIInum2); writecom(0x0f);/开光标显示 writecom(0xc0); while(key_flag!=0) /*确定按键*/ if(Get_Bit(PIND,PD0)=0) delay_ms(20);key_flag=key_flag+1;while(!(Get_Bit(PIND,PD0);/等待按键松

7、开delay_ms(20); switch(key_flag) case 1:/调节电流NUM1 /*增加按键*/ if(Get_Bit(PIND,PD1)=0) num_flag=1; delay_ms(10);num1+;if(num1=10) num1=9;WriteNum(2,0,ASCIInum1);writecom(0xc0); while(!(Get_Bit(PIND,PD1);/等待按键松开delay_ms(10); /*减少按键*/if(Get_Bit(PIND,7)=0) num_flag=1; delay_ms(10);num1-;if(num1=0) num1=1;Wr

8、iteNum(2,0,ASCIInum1);writecom(0xc0); while(!(Get_Bit(PIND,PD7);/等待按键松开delay_ms(10); break; case 2:/调节电流NUM2 writecom(0xc2); /*增加按键*/ if(Get_Bit(PIND,PD1)=0) num_flag=1; delay_ms(10);num2+;if(num2=10) num2=9;WriteNum(2,2,ASCIInum2);writecom(0xc2); while(!(Get_Bit(PIND,PD1);/等待按键松开delay_ms(10); /*减少按

9、键*/if(Get_Bit(PIND,7)=0) num_flag=1; delay_ms(10);num2-;if(num2=0) num2=1;WriteNum(2,2,ASCIInum2);writecom(0xc2); while(!(Get_Bit(PIND,PD7);/等待按键松开delay_ms(10); break; case 3: key_flag=0; break; default: key_flag=0; #pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) delay_ms(10); key_sol(

10、); /while(!(Get_Bit(PIND,PD2);/等待按键松开 delay_ms(10); key_flag=0; flag=1; LcdInit();void init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); timer1_init(); MCUCR = 0x02; GICR = 0x40; TIMSK = 0x00; /timer interrupt sources SEI(); /re-enable interrupts /al

11、l peripherals are now initializeduint AD_GetData(uint ad_input) ADMUX|=0x40; /ADC参考电压AVcc ADCSRA|=0x87; /使能ADC,128分频 ADMUX=ad_input; /选择AD转换通道 ADCSRA|=(1<<ADSC);/开始AD转换 delay(1); while(!(ADCSRA&(1<<ADIF); /等待转换结束 ADCSRA|=(1<<ADIF); /关闭AD转换 ADCSRA&=0x0f; return ADC;/*系统修正*/v

12、oid sys_comp() while(1) switch (delay_flag) case 0: case 1: if(temp1int<vol_exp) OCR1AL=OCR1AL+3; delay_flag=0; if(temp1int>vol_exp) OCR1AL=OCR1AL-3; delay_flag+; break; default: if(temp1int<vol_exp) OCR1AL=OCR1AL+1; if(temp1int>vol_exp) OCR1AL=OCR1AL-1; delay_ms(1); ad_get(); if(OCR1AL&

13、lt;2) OCR1AL=2; delay_ms(20); if(temp1int>vol_exp) delay_ms(30);if(temp1int>vol_exp) err_flag=0; err_sol(); PORTD&=0xbf;/打开继电器 if(temp2int>(num1*100+num2*10)&&(OCR1AL>150) err_flag=1; err_sol(); void err_sol() uchar cont3="Safe Mode " uchar cont4="Caution: &quo

14、t; uchar cont5="Voltage >36V " switch (err_flag) case 0: PORTD|=(1<<PD6);/关闭继电器 LcdInit(); WriteChar(1,0,14,cont4); WriteChar(2,0,14,cont5); OCR1AL =2;/初始化A占空比80% delay_flag=0; flag=0; while(!flag);/等待菜单按键按下 delay_ms(50); break; case 1: PORTD|=(1<<PD6);/关闭继电器 LcdInit(); Writ

15、eChar(1,0,14,cont3); / OCR1AL = 0x51;/初始化A占空比80% delay_flag=0; flag=0; while(!flag);/等待菜单按键按下 delay_ms(50); break; default: break; /*ad读取*/void ad_get() /uchar ASCII="0123456789" uchar i; uchar t; uchar r; addata=AD_GetData(0x45); /获得通道5数字量 for(i=0;i<9;i+) addata=addata+AD_GetData(0x45)

16、; temp1float=addata*0.0048828125; temp1float=temp1float/9.08; temp1int=(uint)(temp1float*100)+1); temp18=ASCIItemp1int/100; temp19=ASCII(temp1int%100)/10; temp111=ASCIItemp1int%10; while(!flag); WriteChar(1,0,17,temp1); addata=AD_GetData(0x46); /获得通道6的数字量 for(i=0;i<9;i+) addata=addata+AD_GetData(

17、0x46); temp2float=addata*0.0048828125; temp2float=temp2float/21.0; temp2int=(uint)(temp2float*100); temp28=ASCIItemp2int/100; temp210=ASCII(temp2int%100)/10; temp211=ASCIItemp2int%10; while(!flag); WriteChar(2,0,17,temp2); r+; if(r=30) /LcdInit(); /* addata=AD_GetData(0x47); /获得通道7的数字量 for(i=0;i<9;i+) addata=addata+AD_GetData(0x47); temp3float=addata*0.0048828125; temp3float=temp3float/21.0; temp3int=(uint)(temp3float*100

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论