?? mega128_232.c
字號:
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x20); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x80); ///轉動間隔 修改成1V每秒
}
if(k>288) ///比285.0V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x50); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x60); ///轉動間隔 修改成5V每秒
}
if(k>282) ///比281.0V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x20); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉動間隔 修改成1V每秒
}
if((k<=282)&(k>=278))
{break; }
delay_ms(0x8f);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
while(PIND&(1<<PIND4)) ////等待10分鐘計時滿
{
if(k<278) ///大于275.0V小于279.0V
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x20); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x80); ///轉動間隔 修改成1V每秒
}
if(k>282) ///比281.0V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x20); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉動間隔 修改成1V每秒
}
delay_ms(0xfff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
PORTB|=(1<<PORTB3); ////正轉控制關閉正反轉輸出(釋放)
PORTB|=(1<<PORTB4); ///關閉調壓輸出(釋放)
PORTE|=(1<<PORTE7); ////峰鳴聲音提示
delay_ms(0x50); ////峰鳴聲音鳴響時間
while(PIND&(1<<PIND7)) ///等待測功率鈕按下
{ xianshi(); } //刷新顯示
while(!(PIND&(1<<PIND7))) ///等待測功率鈕釋放
{ xianshi(); } //刷新顯示
delay_ms(0xff);
PORTB=0xff;//關一次B口
}
///////////200V調壓后450V穩壓//3分鐘短時過電壓
void erbai_tiaoya(void)
{
unsigned int k;
PORTB=0xff;//關一次B口
PORTE&=~(1<<PORTE7); ///關指示燈
delay_ms(0x50); ///等待電路穩定
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
while((k>203)|(k<197))
{
if(k<190) ////和195.0V比較
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x50); ///轉動時間 修改成5V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x50); ///轉動間隔 修改成5V每秒
}
if(k<197) ///小于198.1V
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x30); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x60); ///轉動間隔 修改成1V每秒
}
if(k>205) ///比204.0V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x50); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉動間隔 修改成5V每秒
}
if(k>203) ///比201.9V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x30); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉動間隔 修改成1V每秒
}
delay_ms(0xff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
delay_ms(0xff);
PORTB&=~(1<<PORTB2); ////KM2接通主電流回路
PORTB|=(1<<PORTB3); ////KM5切換到正轉
PORTB&=~(1<<PORTB6); ////KM2接通主電流回路并啟動3分鐘計時
while(k<410) ////小于400V 則快速升壓
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x120); ///轉動時間 連續快速
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x60); ///轉動間隔
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
//delay_ms(0x0f);
//PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x5f);
while(1) ////判琴鍵并等待3分鐘計時滿同時穩壓
{
if(k<447) ///小于448.0V
{
PORTB|=(1<<PORTB3); ////正轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x40); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x50); ///轉動間隔 修改成1V每秒
}
if(k>452) ///比452.0V高
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x50); ///向下微調
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x70); ///轉動間隔 修改成1V每秒
}
delay_ms(0x2ff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
delay_ms(0x0f);
if((k>=447)&(k<=452))
{ break;}
if(!(PIND&(1<<PIND1)))
{ break;}
}
delay_ms(0xff);
while(PIND&(1<<PIND5)) ////判琴鍵并等待3分鐘計時滿同時穩壓
{ xianshi(); } //刷新顯示
PORTB=0xff;//關一次B口
PORTE|=(1<<PORTE7); ////峰鳴聲音提示
delay_ms(0xa0); ////峰鳴聲音延時
while(k>280) ///比280.0V高 電壓回調280V
{
PORTB&=~(1<<PORTB3); ////反轉控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x4ff); ///向下調 較快
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x90); ///轉動間隔
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
delay_ms(0x7ff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數據
}
//////MAIN主程序/////
void main(void)
{
unsigned char n;
PORTB=0xff; //B口設置為高
DDRB=0xff; //B口設置為輸出
PORTD=0xff; //D口設置為高
DDRD=0x00; //D口設置為輸入
DDRE=0xff; //E口設置為輸出
PORTE=0xff; //E口設置為高
DDRG=0x00; //G口設置為輸入
PORTG=0xff; //G口設置為高
EIMSK|=(1<<INT0);
EICRA&=~(1<<ISC01);
EICRA&=~(1<<ISC00);
PORTA=0xff; //A口設置為高
DDRA=0xff; //A口設置為輸出
PORTA=0xff; //A口設置為高
PORTC=0xff; //C口設置為高
DDRC=0xff; //C口設置為輸出
PORTC=0xff; //C口設置為高
PORTE=0xff; //A口設置為高
DDRE=0xff; //A口設置為輸出
CLI(); //CPU禁止中斷
adc_init(); //AD初始化并啟動一次轉換
while(ADIF==0)
{NOP();}
bao_cun=0; //電阻初測保存值清0
ADCSRA|=(1<<ADIF);//清中斷
delay_ms(0x2);
PORTA=0xc0;///////數碼管顯示0
PORTC=0x0f;//////4位數碼管顯示0
PORTE&=~(1<<PORTE7); ///// 先關一次E口的指示燈輸出
while(1) /////循環
{ while(PIND&(1<<PIND6)) ////等待啟動
{ xianshi(); } //刷新顯示
PORTB=0xff; ///// 先關一次B口的輸出
PORTE&=~(1<<PORTE7); ///// 先關一次E口的指示燈輸出
switch(PING)
{
case 0x1a: ///(11010)電阻測量程序
dian_zu();
break;
case 0x19: //11001
dianzu_bijiao(); ////(11001)電阻比較程序 //恢復時間
break;
case 0x13: ////10011功率0V調壓280穩壓
xiaxian_tiaoya();
break;
case 0x0b: ////01011過壓200V快速調壓450穩壓
erbai_tiaoya();
break;
case 0x03: ///00011
tongxun_dianya(); ////讀功率表電壓值
break;
default:
{PORTB=0xff; ///// 先關一次B口的輸出
//PORTE=0xff; ///// 先關一次E口的輸出
PORTA=0x7f; /////BIT/x點小數點
PORTC=0xbf; /////BITx點小數點
PORTC=0xfb; /////BITx點小數點
delay_ms(0xa0);
}
break;
}
}
}
/* case 0x01: ///00001
tongxun_diannao2(); ////電腦通訊
break;*/
/* void tongxun_diannao2(void)
{
unsigned char i;
PORTA=BCD[10]; ///個位數"A"
PORTC=0xef; ///BIT/x
PORTA=BCD[10]; ///十位數"A"
PORTC=0xcf; ///BIT/x兩位
DDRD=0xff;
PORTD=0xff;
UBRR1H=0;
UBRR1L=71; /// 波特率設置
UCSR1C=0x06;
UCSR1B=(1<<RXEN0)|(1<<TXEN0);//允許發送和接收
PORTC=0xef; ///BIT/x
PORTA=BCD[9]; ///十位數"9"
PORTC=0xcf; ///BIT/x兩位
for(i=0;i<7;i++)
{ while(!(UCSR1A& (1<<UDRE1))); //置usart數據寄存器空,系統復位時,udre位置1,表示數據發送已準備好
UDR1=dianya_mingling[i];//數據寄存器
}
for(i=0;i<2;i++)
{ PORTA=0xa4; ///顯示“2”
PORTC=0x00; ///千位數 ///BIT/5
delay_ms(0x01);
}
for(i=0;i<10;i++)
{
while(!(UCSR1A& (1<<RXC1)));//將第七位RXC置1,表示USART接受完成
dianya_hui[i]=UDR1;
}
} */
/* void tongxun_diannao(void)
{
unsigned char i;
PORTA=BCD[10]; ///個位數"A"
PORTC=0xef; ///BIT/x
PORTA=BCD[10]; ///十位數"A"
PORTC=0xcf; ///BIT/x兩位
DDRE=0xff;
PORTE=0xff;
UBRR0H=0;
UBRR0L=51; /// 波特率設置
UCSR0C=0x06;
UCSR0B=(1<<RXEN0)|(1<<TXEN0);//允許發送和接收
for(i=0;i<10;i++)
{
while(!(UCSR0A& (1<<RXC0)));//將第七位RXC置1,表示USART接受完成
dianya_hui[i]=UDR0;
}
PORTC=0xef; ///BIT/x
PORTA=BCD[9]; ///十位數"9"
PORTC=0xcf; ///BIT/x兩位
for(i=0;i<7;i++)
{ while(!(UCSR0A& (1<<UDRE0))); //置usart數據寄存器空,系統復位時,udre位置1,表示數據發送已準備好
UDR0=dianya_mingling[i];//數據寄存器
}
delay_ms(0x05);
} */
// while(!(UCSR0A& (1<<UDRE0))); //置usart數據寄存器空,系統復位時,udre位置1,表示數據發送已準備好
// UDR0=0x49;//數據寄存器
//}
//RXB0=0xfa;
//}
/* 網上下載資料
// #define LED_SET PORTD |= (1 << PD5) //位置高
//#define LED_CLR PORTD &= ~(1 << PD5) //位置低
//#define LED_COM PORTD ^= (1 << PD5) //位取反
//#define LED_R PIND & (1 << PD5) //位讀取
//通過上面的定義就可以在程序中直接操作I/O了。 */
//按鍵INT0中斷//啟動AD轉換
///*#pragma interrupt_handler int0_isr:2
//void int0_isr(void)
//{
// ADMUX=(1<<REFS0)|(adc_mux&0x0f)|(1<<REFS1);//選擇內部AVCC為基準
// ADMUX =0xc0;
// ADCSRA|=(1<<ADSC);//啟動AD轉換
//}*/
//ADC完成中斷 // ADC結果轉換成電壓值4位十進制數存入數組
/*#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{ unsigned char f,m=3;
unsigned long v;
v=ADC&0x3ff;
v=v*Vref/0x3ff;
for(f=4;f>0;f--)
{ led_buff[m]=v%0x0a;
m--;
v=v/0x0a; }
ADMUX=(1<<REFS0)|(adc_mux&0x0f)|(1<<REFS1);// //內部2.643基準,//選擇內部AVCC為基準
ADCSRA|=(1<<ADSC);//啟動AD轉換
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -