?? mega128_232.c
字號(hào):
/*******************************************/
/* 項(xiàng)目試驗(yàn)AD轉(zhuǎn)換電阻_電壓調(diào)整等程序 */
/* 2007年7月6日 */
/* 目標(biāo)MCU:MEGA128/64 晶振:外部 11.0592/(8MHZ) */
/*******************************************/
#include <iom64v.h>
//#include <iom128v.h>
#include <macros.h>
#define Vref 1000 //參考電壓值
void xianshi(void);
extern unsigned int wen_ding[32]={0,0,0,0,0,0,0,0,0,0};
extern unsigned int ADC_jieguo[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
extern unsigned char led_buff[4]={0,0,0,0}; ////
extern unsigned char lleedd_buff[4]={0,0,0,0};
extern unsigned char dianya_hui[10]={0,0,0,0,0,0,0,0,0,0};
extern unsigned char dianya_mingling[7]={0x05,0x00,0x52,0xb6,0x03,0xe2,0x03};
extern const unsigned char BCD[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};////0123456789A
extern void delay_ms(unsigned int time);
extern void delay_us(unsigned char time);
extern void display(void);
extern void tongxun_dianya(void);
extern void tongxun_diannao(void);
extern void tongxun_diannao2(void);
unsigned int bao_cun; //電阻初測(cè)保存2倍值
//unsigned int adc_rel ;//AD轉(zhuǎn)換結(jié)果
//unsigned char adc_mux;//AD通道
//ADC初始化
void adc_init(void)
{
DDRF=0x00;
PORTF=0x00;
ADCSRA=0x00;
ADMUX =0x00;////外部1v基準(zhǔn),通道0//
ACSR =(1<<ACD);//關(guān)閉模擬比較器
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分頻并啟動(dòng)一次轉(zhuǎn)換
}
void delay_us(unsigned char time) //*微秒級(jí)延時(shí)程序*//
{ do
{ time--; }
while (time>1);
}
void delay_ms(unsigned int time) //*毫秒級(jí)延時(shí)程序*//
{ while(time!=0)
{ delay_us(0xff);
xianshi();
time--; }
}
////顯示程序//////////
void xianshi(void)
{ ///////初測(cè)保存顯示//////
PORTA=BCD[led_buff[0]];
PORTC=0xef; ///千位數(shù) ///BIT/5
delay_us(0xa0);
PORTA=BCD[led_buff[1]];
PORTC=0xdf; ///百位數(shù) ///BIT/6
delay_us(0xa0);
PORTA=BCD[led_buff[2]];
PORTC=0xbf; ///十位數(shù) ///BIT/7
delay_us(0xa0);
PORTA=BCD[led_buff[3]];
PORTC=0x7f; ///個(gè)位數(shù) ///BIT/8
delay_us(0xa0);
PORTA=0x7f; /////BIT/x點(diǎn)小數(shù)點(diǎn)
PORTC=0xbf; /////BIT/6點(diǎn)小數(shù)點(diǎn)
delay_us(0xa0);
/////2倍顯示////////
PORTA=BCD[lleedd_buff[0]];
PORTC=0xfe; ///千位數(shù) ///BIT/1
delay_us(0xa0);
PORTA=BCD[lleedd_buff[1]];
PORTC=0xfd; ///百位數(shù) ///BIT/2
delay_us(0xa0);
PORTA=BCD[lleedd_buff[2]];
PORTC=0xfb; ///十位數(shù) ///BIT/3
delay_us(0xa0);
PORTA=BCD[lleedd_buff[3]];
PORTC=0xf7; ///個(gè)位數(shù) ///BIT/4
delay_us(0xa0);
PORTA=0x7f; /////BIT/x點(diǎn)小數(shù)點(diǎn)
PORTC=0xfb; /////BIT/1點(diǎn)小數(shù)點(diǎn)
delay_us(0xa0);
}
///////AD數(shù)據(jù)處理程序///////
void shuju_chuli(void)
{ unsigned char m,n;
for(n=0;n<32;n++)
{ for(m=0;m<32;m++)
{ while(ADIF==0) //等待中斷標(biāo)志
{ NOP(); }
ADC_jieguo[m]=ADC&0x3ff; //讀結(jié)果
ADCSRA|=(1<<ADIF); //清中斷
ADCSRA|=(1<<ADSC); //啟動(dòng)AD轉(zhuǎn)換
}
xianshi(); //刷新顯示
for(m=0;m<31;m++)
{ ADC_jieguo[0]=ADC_jieguo[0]+ADC_jieguo[m+1];}
wen_ding[n]=ADC_jieguo[0]>>5;
}
for(n=0;n<31;n++)
{wen_ding[0]=wen_ding[0]+wen_ding[n+1];}
wen_ding[0]=wen_ding[0]>>5;
}
////////十進(jìn)制數(shù)據(jù)處理程序///數(shù)組數(shù)據(jù)作指針指向十進(jìn)制字符數(shù)組////
void shijinzhi_chuli(void)
{ unsigned int v;
unsigned char m;
v=wen_ding[0]; //取數(shù)據(jù)進(jìn)行十進(jìn)制轉(zhuǎn)換
for(m=4;m>0;m--)
{ lleedd_buff[m-1]=v%0x0a; ///十進(jìn)制數(shù)首先送進(jìn)2倍數(shù)組
v=wen_ding[0];
v=v/0x0a;
wen_ding[0]=v;
}
}
//////*電阻測(cè)量保存程序**********////////
void dian_zu(void)
{
//unsigned int v;
unsigned char i;
PORTE&=~(1<<PORTE7); ///關(guān)指示燈
ADMUX =0;///////外部1v基準(zhǔn),通道0//
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分頻
PORTB=0xff; //關(guān)閉輸出
while(PIND&(1<<PD6)) ////在測(cè)量保存電阻狀態(tài)下等待啟動(dòng)
{xianshi();} //刷新顯示
delay_ms(0x1ff); ///等待電路穩(wěn)定
PORTB&=~(1<<PORTB0); ////KM1轉(zhuǎn)換成測(cè)電阻回路
delay_ms(0x3ff); ///等待電路穩(wěn)定
PORTB&=~(1<<PORTB1); ////輸出10mA電流
delay_ms(0x3ff); ///等待電路穩(wěn)定
for(i=0x10;i>0;i--)
{
shuju_chuli(); ////數(shù)據(jù)處理程序,里面包涵刷新顯示程序
bao_cun=wen_ding[0]; //電阻初測(cè)保存值
bao_cun=bao_cun<<1; //電阻初測(cè)保存值的2倍
shijinzhi_chuli(); //十進(jìn)制數(shù)據(jù)處理程序
}
for(i=0;i<4;i++)
{
led_buff[i]=lleedd_buff[i]; ////再?gòu)亩稊?shù)組取出數(shù)據(jù)送入常溫電阻
}
xianshi(); //刷新顯示
PORTB=0xff; //關(guān)一次B口
PORTE|=(1<<PORTE7); ////峰鳴聲音提示
}
//////*恢復(fù)時(shí)間和電阻比較程序**********////////
void dianzu_bijiao(void)
{
unsigned int k;
unsigned char i;
PORTE&=~(1<<PORTE7); ///關(guān)指示燈
delay_ms(0x0f); ///延時(shí)等待電路穩(wěn)定 里面包涵刷新顯示程序
ADMUX =0; ///////外部1v基準(zhǔn),通道0//
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分頻
PORTB=0xff; //關(guān)一次B口
delay_ms(0x20);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數(shù)據(jù)
while((k>282)|(k<278)) ////從280V開(kāi)始
{
if(k<270) ////和270.0V比較
{
PORTB|=(1<<PORTB3); ////正轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x50); ///轉(zhuǎn)動(dòng)時(shí)間 修改成5V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x50); ///轉(zhuǎn)動(dòng)間隔 修改成5V每秒
}
if(k<278) ///小于278V
{
PORTB|=(1<<PORTB3); ////正轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x30); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x60); ///轉(zhuǎn)動(dòng)間隔 修改成1V每秒
}
if(k>288) ///比288.0V高
{
PORTB&=~(1<<PORTB3); ////反轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x50); ///向下微調(diào)
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉(zhuǎn)動(dòng)間隔 修改成5V每秒
}
if(k>282) ///比282.V高
{
PORTB&=~(1<<PORTB3); ////反轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x30); ///向下微調(diào)
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x50); ///轉(zhuǎn)動(dòng)間隔 修改成1V每秒
}
delay_ms(0xff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數(shù)據(jù)
}
delay_ms(0x4ff);
if(PING==0x19)
{PORTB&=~(1<<PORTB2);
PORTB&=~(1<<PORTB5);
} ////KM2接通主電流回路并啟動(dòng)10分鐘計(jì)時(shí)
delay_ms(0x6ff);
while(PIND&(1<<PIND4)) ////等待10分鐘滿(mǎn)
{
if(k<278) ///小于278V
{
PORTB|=(1<<PORTB3); ////正轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓
delay_ms(0x20); ///修改成1V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x80); ///轉(zhuǎn)動(dòng)間隔 修改成1V每秒
}
else if(k>282) ///比282.V高
{
PORTB&=~(1<<PORTB3); ////反轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///降壓
delay_ms(0x20); ///向下微調(diào)
PORTB|=(1<<PORTB4); ///降壓停止
delay_ms(0x80); ///轉(zhuǎn)動(dòng)間隔 修改成1V每秒
}
delay_ms(0xfff);
tongxun_dianya(); ////通訊讀電壓值并處理顯示
k=wen_ding[0]; //取數(shù)據(jù)
}
PORTB|=(1<<PORTB2); ////KM2斷開(kāi)主電流回路
if(PING==0x19)
{PORTB&=~(1<<PORTB6);} ////啟動(dòng)3分鐘計(jì)時(shí)
delay_ms(0x1fff); ///長(zhǎng)延時(shí)等待電路穩(wěn)定1fff大約7秒
if(PING==0x19)
{
PORTB&=~(1<<PORTB0); ////KM1轉(zhuǎn)換成測(cè)電阻回路PORTB&=~(1<<PORTB0); ////KM1轉(zhuǎn)換成測(cè)電阻回路
}
if(PING==0x19)
{
delay_ms(0xaff); ///等待電路穩(wěn)定
PORTB&=~(1<<PORTB1); ////輸出10mA電流
delay_ms(0x5ff); ///等待電路穩(wěn)定
}
if(PING==0x19)
{
shuju_chuli(); ////AD數(shù)據(jù)處理程序,里面包涵刷新顯示程序
shijinzhi_chuli(); ////十進(jìn)制處理
shuju_chuli(); ////在轉(zhuǎn)換一次AD,取出比較用的電阻值wen_ding[0]
}
while(wen_ding[0]>bao_cun) //和保存的二倍值比較
{
shuju_chuli(); ////AD數(shù)據(jù)處理程序,里面包涵刷新顯示程序
shijinzhi_chuli(); ////十進(jìn)制處理
shuju_chuli(); ////在轉(zhuǎn)換一次AD,取出比較用的電阻值wen_ding[0]
if(PING!=0x19)
break;
}
xianshi(); //刷新顯示
PORTB&=~(1<<PORTB7); //小于保存的二倍值暫停恢復(fù)計(jì)時(shí)
shijinzhi_chuli(); //十進(jìn)制數(shù)據(jù)處理程序
for(i=0;i<3;i++)
{ PORTE&=~(1<<PORTE7); ////峰鳴聲音提示
delay_ms(0xaf); ////峰鳴聲音延時(shí)
PORTE|=(1<<PORTE7);
delay_ms(0xaf); ////峰鳴聲音延時(shí)
}
}
/////////通訊電壓測(cè)量讀取顯示//////9600,n,8,1/////////
void tongxun_dianya(void)
{
unsigned int k;
unsigned char i;
UBRR0H=0;
UBRR0L=71; /// UBRR(波特率9600)
UCSR0C=0x06; //無(wú)校驗(yàn)1位停止位8數(shù)據(jù)位
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //允許發(fā)送和接收
xianshi(); //刷新顯示
PORTE|=(1<<PORTE2); ////使能485發(fā)送DE置位發(fā)送使能
for(i=0;i<7;i++)
{ while(!(UCSR0A&(1<<UDRE0))) //置usart數(shù)據(jù)寄存器空,系統(tǒng)復(fù)位時(shí),udre位置1,表示數(shù)據(jù)發(fā)送已準(zhǔn)備好
{NOP();}
UDR0=dianya_mingling[i];//數(shù)據(jù)寄存器 循環(huán)發(fā)送數(shù)據(jù)讀電壓值命令
NOP();
while(!(UCSR0A&(1<<TXC0)))
{NOP();}
UCSR0A|=(1<<TXC0);
}
PORTE&=~(1<<PORTE2); ////使能485接收RE置位接收使能
NOP();
TCCR0=0x07;
TCNT0=0xaa;
for(i=0;i<10;i++)
{
while(!(UCSR0A&(1<<RXC0)));//將第七位RXC置1,表示USART接受完成
{
if(TOV0==1)
{break;}
NOP();
}
dianya_hui[i]=UDR0;//數(shù)據(jù)寄存器udr0循環(huán)接收數(shù)據(jù)(讀電壓值)
NOP();
}
TCCR0=0x00;
TIFR|=(1<<TOV0);
PORTE|=(1<<PORTE2); ////使能485發(fā)送DE置位發(fā)送使能
delay_ms(0x0f);
if(dianya_hui[9]==0x03)
{
dianya_hui[7]&=0x7f; //屏蔽符號(hào)位變成正數(shù)
if(dianya_hui[7]>0x40)
{dianya_hui[7]-=0x40;}
else{dianya_hui[7]=0;}
k=(dianya_hui[6]<<8)|dianya_hui[5];
k=k>>(16-dianya_hui[7]); ///移位取整數(shù)
wen_ding[0]=(k<<3)+(k<<1); ///乘10讓開(kāi)小數(shù)點(diǎn)
shijinzhi_chuli(); ////十進(jìn)制顯示處理
wen_ding[0]=k; ////恢復(fù)wen_ding[0]的值以便調(diào)用它的程序使用
}
}
///////////耗散功率下限調(diào)壓后28零0V穩(wěn)壓//
void xiaxian_tiaoya(void)
{
unsigned int k;
//unsigned char i;
PORTB=0xff;//關(guān)一次B口
PORTE&=~(1<<PORTE7); ///關(guān)指示燈
delay_ms(0x10); ///等待電路穩(wěn)定內(nèi)含刷新顯示
while(PIND&(1<<PIND0)) ////等待調(diào)壓器下限復(fù)位
{
PORTB&=~(1<<PORTB3); ////KM5切換到反轉(zhuǎn)
PORTB&=~(1<<PORTB4); ////此時(shí)反旋轉(zhuǎn)輸出
xianshi(); //刷新顯示
}
delay_ms(0xff);
PORTB|=(1<<PORTB4); ////停止轉(zhuǎn)動(dòng)
PORTB&=~(1<<PORTB2); ////KM2接通主電流回路
PORTB&=~(1<<PORTB5); ////啟動(dòng)10分鐘計(jì)時(shí)
xianshi(); //刷新顯示
while(PIND&(1<<PIND4)) ////等待10分鐘計(jì)時(shí)滿(mǎn)
{
if(k<268) ////和275.0V比較
{
PORTB|=(1<<PORTB3); ////正轉(zhuǎn)控制
delay_ms(0x20);
PORTB&=~(1<<PORTB4); ///升壓 此時(shí)正旋轉(zhuǎn)輸出
delay_ms(0x2d); ///轉(zhuǎn)動(dòng)時(shí)間 修改成5V每秒
PORTB|=(1<<PORTB4); ///升壓停止
delay_ms(0x80); ///轉(zhuǎn)動(dòng)間隔 修改成5V每秒
}
if(k<278) ///大于275.0V小于279.0V
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -