第9講-單片機系統(tǒng)軟件設計_第1頁
第9講-單片機系統(tǒng)軟件設計_第2頁
第9講-單片機系統(tǒng)軟件設計_第3頁
第9講-單片機系統(tǒng)軟件設計_第4頁
第9講-單片機系統(tǒng)軟件設計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

劉鎮(zhèn)章zhenzhang.liu@第9講《單片機技術與C語言程序設計技術》22三月2024單片機監(jiān)控系統(tǒng)軟件設計主要內容

一、單片機軟件系統(tǒng)設計方法 二、過程控制(PID)

三、單片機監(jiān)控系統(tǒng)軟件設計22三月2024

一、單片機軟件系統(tǒng)設計方法22三月2024一、單片機軟件系統(tǒng)設計方法

單片機軟件系統(tǒng)設計方法:

1、主控程序;

2、初始化;

3、中斷處理;

4、定時控制;

5、各模塊程序的調用和參數(shù)傳遞。22三月2024一、單片機軟件系統(tǒng)設計方法1、主控程序voidmain(void){

… while(1) {

…. }

…}22三月20241、主控程序:例voidmain(void){ … while(1)

{if(u_second250>40) //10ms進入1次

{u_second250=0;

m_second10++;

if(m_second10%50==0) //0.5s進入1次

display_flash=(display_flash)?0:1;//閃標志

display_num(num); //顯示

key=read_key();//讀鍵

if(key==KEY_FUN) //鍵處理

{…}

elseif(key==KEY_UP&&sys_state==STOP) { …}

elseif(key==KEY_DOWN&&sys_state==STOP) { …} }

}}22三月2024一、單片機軟件系統(tǒng)設計方法2、初始化

初始化程序一般處理內容:

1、I/O口

2、定時器

3、A/D 4、外部中斷

5、看門狗

6、從EEPROM讀設置參數(shù)

7、設置開機參數(shù)22三月20242、初始化:例voidsystem_init(void){ PORTB=0x07; //B口設置 DDRB=0xFF; PORTC=0x38; //C口設置

DDRC=0xC0; PORTD=0x04; //D口設置

DDRD=0xFB;

OCR1A=31; //初始化定時器1

TIMSK1|=(1<<OCIE1A);

TCCR1A=0x00;

TCCR1B=(1<<WGM12)|(1<<CS11);

EICRA=0x03; //初始化外部中斷0

EIMSK=0x01;//

SREG|=0x80; //開全局中斷

ADMUX=0x60; //設置AD

ADCSRA=0xB3; //

ADCSRA|=(1<<ADSC); //啟動AD

EEPROM_READ(EEPROM_ADDR,run_all_time); //讀EEPROM if(run_all_time==0||run_all_time>99)

{run_all_time=RUN_ALLTIME; //設置運行時間初始值

EEPROM_WRITE(EEPROM_ADDR,run_all_time);

} }22三月20242、初始化:例voidmain(void){ system_init(); //初始化

… while(1) {

…. }

…}22三月2024一、單片機軟件系統(tǒng)設計方法3、中斷處理

中斷處理內容:

1、模塊中斷設置

2、全局中斷設置

3、中斷處理函數(shù)22三月20243、中斷處理:例:中斷設置voidsystem_init(void){ PORTB=0x07; //B口設置 DDRB=0xFF; PORTC=0x38; //C口設置

DDRC=0xC0; PORTD=0x04; //D口設置

DDRD=0xFB;

OCR1A=31; //初始化定時器1

TIMSK1|=(1<<OCIE1A);

TCCR1A=0x00;

TCCR1B=(1<<WGM12)|(1<<CS11);

EICRA=0x03; //初始化外部中斷0

EIMSK=0x01;

SREG|=0x80; //開全局中斷

ADMUX=0x60; //設置AD

ADCSRA=0xB3;

ADCSRA|=(1<<ADSC); //啟動AD

EEPROM_READ(EEPROM_ADDR,run_all_time); //讀EEPROM if(run_all_time==0||run_all_time>99)

{run_all_time=RUN_ALLTIME; //設置運行時間初始值

EEPROM_WRITE(EEPROM_ADDR,run_all_time);

}

}22三月20243、中斷處理:例:中斷處理函數(shù)#pragmainterrupt_handlertimer1:13voidtimer1(void) //0.25ms{ u_second250++;

…}#pragmainterrupt_handlerint0:2 voidint0(){ voltage_0=1;}

22三月20243、中斷處理:例:中斷處理函數(shù)unsignedintu_second250=0;unsignedcharvoltage_0=0;voidmain(){ system_init();

while(1)

{ if(u_second250>40) //10ms進入一次

{ …} }}#pragmainterrupt_handlertimer1:13voidtimer1(void) //0.25ms{ u_second250++;

…}#pragmainterrupt_handlerint0:2 voidint0(){ voltage_0=1;}

22三月2024一、單片機軟件系統(tǒng)設計方法4、定時控制

定時控制內容:

1、初始化

2、中斷處理函數(shù)

3、定時使用22三月20244、定時控制:例:定時器設置voidsystem_init(void){ PORTB=0x07; //B口設置 DDRB=0xFF; PORTC=0x38; //C口設置

DDRC=0xC0; PORTD=0x04; //D口設置

DDRD=0xFB;

OCR1A=31; //初始化定時器1

TIMSK1|=(1<<OCIE1A);

TCCR1A=0x00;

TCCR1B=(1<<WGM12)|(1<<CS11);

EICRA=0x03; //初始化外部中斷0

EIMSK=0x01;

SREG|=0x80; //開全局中斷

ADMUX=0x60; //設置AD

ADCSRA=0xB3;

ADCSRA|=(1<<ADSC); //啟動AD

EEPROM_READ(EEPROM_ADDR,run_all_time); //讀EEPROM if(run_all_time==0||run_all_time>99)

{run_all_time=RUN_ALLTIME; //設置運行時間初始值

EEPROM_WRITE(EEPROM_ADDR,run_all_time);

}

}22三月20243、中斷處理:例:定時器處理unsignedintu_second250=0;unsignedcharvoltage_0=0;voidmain(){ system_init();

while(1)

{ if(u_second250>40) //10ms進入一次

{ …} }}#pragmainterrupt_handlertimer1:13voidtimer1(void) //0.25ms{ u_second250++;

…}22三月2024一、單片機軟件系統(tǒng)設計方法5、各模塊程序的調用和參數(shù)傳遞。

函數(shù)調用和參數(shù)傳遞:

A、1個參數(shù)的傳遞

B、N個參數(shù)調用傳送

C、多個參數(shù)返回傳送

D、N個參數(shù)返回傳送

E、全局變量

F、靜態(tài)變量就是函數(shù)調用22三月2024A、1個參數(shù)的傳遞例:調用voiddisplay_num(unsignedcharnum){ …}voidmain(void){ unsignedcharnum;

… while(1)

{if(u_second250>40) //10ms進入1次

{u_second250=0;

m_second10++;

if(m_second10%50==0) //0.5s進入1次

display_flash=(display_flash)?0:1;//閃標志

display_num(num); //顯示

… } }}22三月2024一、單片機軟件系統(tǒng)設計方法A、1個參數(shù)的傳遞例:返回unsignedcharread_key(){ staticunsignedcharkey_time=0;

staticunsignedcharkey_num=0;

unsignedcharkey_n,return_val=0;

key_n=~(PINC|ALL_KEY);

if(key_n==key_num)

{if(key_time<10)

key_time++;

elseif(key_time==10)

{key_time++;

return_val=key_num;

}

}

else{key_time=0; }

key_num=key_n;

returnreturn_val;}

voidmain(void){ … while(1){if(u_second250>40) {u_second250=0;

key=read_key(); if(key==KEY_FUN)//鍵處理

{…}

elseif(key==KEY_UP) { …}

elseif(key==KEY_DOWN) {…} } }

…}

22三月2024一、單片機軟件系統(tǒng)設計方法B、N個參數(shù)調用傳送例:數(shù)組(指針)unsignedintget_average(unsignedcharn, unsignedintad_value[]){ unsignedintsum,max,min,i; sum=0; max=0; min=0xffff; for(i=0;i<n;i++) { if(ad_value[i]>max) max=ad_value[i]; if(ad_value[i]<min) min=ad_value[i]; sum=sum+ad_value[i]; } sum=(sum–max–min)/(n-2); returnsum;} voidmain(void){ unsignedintad_val[20]; io_init(); while(1) { … get_ad() ad_value(20,ad_val);

}}22三月2024C、多個參數(shù)返回傳送例:按引用方式swap(int&p1,int&p2){ inttemp;temp=p1;p1=p2;p2=temp;}voidmain(){ … inta=5,b=6; if(a<b)swap(a,b);

…}22三月2024voideprom_read(unsignedintaddr, unsignedcharnumber,

unsignedchar*p_buff){ while(EECR&(1<<EEWE)); while(number--) { EEAR=addr++; EECR|=(1<<EERE); *p_buff++=EEDR; }}

voidmain(void){ unsignedchartemp[10]; io_init();

eprom_read(0x10,10,temp);

}一、單片機軟件系統(tǒng)設計方法D、N個參數(shù)返回傳送例:指針(數(shù)組)22三月2024一、單片機軟件系統(tǒng)設計方法E、全局變量例unsignedintu_second250=0;unsignedcharvoltage_0=0;voidmain(){ system_init();

while(1)

{ if(u_second250>40) //10ms進入一次

{ …} }}#pragmainterrupt_handlertimer1:13voidtimer1(void) //0.25ms{ u_second250++;

…}22三月2024一、單片機軟件系統(tǒng)設計方法F、靜態(tài)變量例:按鍵防抖動unsignedcharread_key(){ staticunsignedcharkey_time=0;

staticunsignedcharkey_num=0; unsignedcharkey_n; key_n=~(PINC|ALL_KEY);

if(key_n==key_num)

{if(key_time<10) key_time++; elseif(key_time==10) {key_time++;

returnkey_num; } } else{key_time=0;}

key_num=key_n;

return0;}22三月2024

二、過程控制(PID)22三月2024二、過程控制(PID)例:直熱式電熱水器控制(PID)Setpoint:設置溫度Output:出水溫度Process:加熱電阻原理圖:22三月202422三月2024二、過程控制(PID)

溫度控制方法: 熱水器總功率為:6000KW,分成3段:

RE1控制2000W(繼電器),

RE2控制2000W(繼電器),

PWM控制2000W(可控硅)。 通過PWM控制,可以實現(xiàn)溫度在0~2000W內連續(xù)控制; 當功率在2000W以上時,接通RE1,可以在2000W~

4000W內連續(xù)調節(jié)功率,當功率在4000W以上時,再接通RE2,可以在4000W~

6000W內連續(xù)調節(jié)功率。 通過以上控制,可以實現(xiàn)熱水器輸出功率分級連續(xù)可調,實現(xiàn)熱水器水溫自動控制。

22三月2024二、過程控制(PID)

程序舉例:

22三月2024

三、單片機監(jiān)控系統(tǒng)軟件設計22三月2024三、單片機監(jiān)控系統(tǒng)軟件設計

單片機監(jiān)控系統(tǒng)軟件設計:

1、采用模塊化設計方法;

2、首先單獨調試好輸入/輸出模塊;

3、構建基本程序框架;

4、逐個添加功能模塊;

5、完成總體控制;

6、測試系統(tǒng)。22三月2024三、單片機監(jiān)控系統(tǒng)軟件設計

2、首先單獨調試好輸入/輸出模塊例:室內空調控制系統(tǒng)。

22三月2024一、監(jiān)控系統(tǒng)功能

例:室內空調控制系統(tǒng)。1、從非技術角度考慮系統(tǒng)功能;2、確定系統(tǒng)的輸入檢測功能;3、確定系統(tǒng)的輸出控制功能;4、確定系統(tǒng)的控制方式;1、遙控2、自動溫控3、模式:制冷、制熱、抽濕、自動4、風向22三月2024一、監(jiān)控系統(tǒng)功能

例:室內空調控制系統(tǒng)。1、從非技術角度考慮系統(tǒng)功能;2、確定系統(tǒng)的輸入檢測功能;3、確定系統(tǒng)的輸出控制功能;4、確定系統(tǒng)的控制方式;1、遙控2、溫度3、按鍵22三月2024一、監(jiān)控系統(tǒng)功能

例:室內空調控制系統(tǒng)。1、從非技術角度考慮系統(tǒng)功能;2、確定系統(tǒng)的輸入檢測功能;3、確定系統(tǒng)的輸出控制功能;4、確定系統(tǒng)的控制方式;1、壓縮機2、吹風電機:4級3、風向電機4、抽濕加熱器22三月2024一、監(jiān)控系統(tǒng)功能

例:室內空調控制系統(tǒng)。1、從非技術角度考慮系統(tǒng)功能;2、確定系統(tǒng)的輸入檢測功能;3、確定系統(tǒng)的輸出控制功能;4、確定系統(tǒng)的控制方式;1、PID溫度控制2、自動模式算法22三月2024輸入/輸出電路:1、遙控電路2、溫度電路3、按鍵電路4、壓縮機控制電路5、吹風控制電路6、風向控制電路7、加熱控制電路讀紅外模塊紅外編碼識別模塊讀溫度模塊讀按鍵模塊壓縮機控制(PID)模塊吹風電機控制模塊風向電機控制模塊加熱控制模塊基本模塊:初始化模塊定時器模塊顯示模塊三、單片機監(jiān)控系統(tǒng)軟件設計22三月2024三、單片機監(jiān)控系統(tǒng)軟件設計

3、構建基本程序框架例:室內空調控制系統(tǒng)。

unsignedintu_second250=0;voidmain(){ system_init();

while(1)

{ if(u_second250>40) //10ms進入一次

{ …} }}#pragmainterrupt_handlertimer1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論