📄 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 + -