單片機(jī)開(kāi)發(fā)工程案例分析與解析報(bào)告



《單片機(jī)開(kāi)發(fā)工程案例分析與解析報(bào)告》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《單片機(jī)開(kāi)發(fā)工程案例分析與解析報(bào)告(41頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、3 單片機(jī)開(kāi)發(fā)工程案例分析與解析 3.1 定時(shí)報(bào)警器 設(shè)計(jì)一個(gè)單片機(jī)控制的簡(jiǎn)易定時(shí)報(bào)警器。要求根據(jù)設(shè)定的初始值(1-59秒)進(jìn)行倒計(jì)時(shí),當(dāng)計(jì)時(shí)到0時(shí)數(shù)碼管閃爍“00”(以1Hz閃爍),按鍵功能如下: (1)設(shè)定鍵:在倒計(jì)時(shí)模式時(shí),按下此鍵后停止倒計(jì)時(shí),進(jìn)入設(shè)置狀態(tài);如果已經(jīng)處于設(shè)置狀態(tài)則此鍵無(wú)效。 (2)增一鍵:在設(shè)置狀態(tài)時(shí),每按一次遞增鍵,初始值的數(shù)字增1。 (3)遞一鍵:在設(shè)置狀態(tài)時(shí),每按一次遞減鍵,初始值的數(shù)字減1。 (4)確認(rèn)鍵:在設(shè)置狀態(tài)時(shí),按下此鍵后,單片機(jī)按照新的初始值進(jìn)行倒計(jì)時(shí)及顯示倒計(jì)時(shí)的數(shù)字。如果已經(jīng)處于計(jì)時(shí)狀態(tài)則此鍵無(wú)效。 3.1.2 模塊1:系統(tǒng)設(shè)計(jì) (
2、1)任務(wù)分析與整體設(shè)計(jì)思路 根據(jù)題目的要求,需要實(shí)現(xiàn)如下幾個(gè)方面的功能。 計(jì)時(shí)功能:要實(shí)現(xiàn)計(jì)時(shí)功能則需要使用定時(shí)器來(lái)計(jì)時(shí),通過(guò)設(shè)置定時(shí)器的初始值來(lái)控制溢出中斷的時(shí)間間隔,再利用一個(gè)變量記錄定時(shí)器溢出的次數(shù),達(dá)到定時(shí)1秒中的功能。然后,當(dāng)計(jì)時(shí)每到1秒鐘后,倒計(jì)時(shí)的計(jì)數(shù)器減1。當(dāng)?shù)褂?jì)時(shí)計(jì)數(shù)器到0時(shí),觸發(fā)另一個(gè)標(biāo)志變量,進(jìn)入閃爍狀態(tài)。 顯示功能:顯示倒計(jì)時(shí)的數(shù)字要采用動(dòng)態(tài)掃描的方式將數(shù)字拆成“十位”和“個(gè)位”動(dòng)態(tài)掃描顯示。如果處于閃爍狀態(tài),則可以不需要?jiǎng)討B(tài)掃描顯示,只需要控制共陰極數(shù)碼管的位控線(xiàn),實(shí)現(xiàn)數(shù)碼管的滅和亮。 鍵盤(pán)掃描和運(yùn)行模式的切換:主程序在初始化一些變量和寄存器之后,需要不斷循環(huán)
3、地讀取鍵盤(pán)的狀態(tài)和動(dòng)態(tài)掃描數(shù)碼管顯示相應(yīng)的數(shù)字。根據(jù)鍵盤(pán)的按鍵值實(shí)現(xiàn)設(shè)置狀態(tài)、計(jì)時(shí)狀態(tài)的切換。 (2)單片機(jī)型號(hào)及所需外圍器件型號(hào),單片機(jī)硬件電路原理圖 選用MCS-51系列AT89S51單片機(jī)作為微控制器,選擇兩個(gè)四聯(lián)的共陰極數(shù)碼管組成8位顯示模塊,由于AT89S51單片機(jī)驅(qū)動(dòng)能力有限,采用兩片74HC244實(shí)現(xiàn)總線(xiàn)的驅(qū)動(dòng),一個(gè)74HC244完成位控線(xiàn)的控制和驅(qū)動(dòng),另一個(gè)74HC244完成數(shù)碼管的7段碼輸出,在輸出口上各串聯(lián)一個(gè)100歐姆的電阻對(duì)7段數(shù)碼管限流。 由于鍵盤(pán)數(shù)量不多,選擇獨(dú)立式按鍵與P1口連接作為四個(gè)按鍵輸入。沒(méi)有鍵按下時(shí)P1.0-P1.3為高電平,當(dāng)有鍵按下時(shí),P
4、1.0-P1.3相應(yīng)管腳為低電平。電路原理圖如圖3-1所示。 圖3-1 定時(shí)報(bào)警器電路原理圖 (3)程序設(shè)計(jì)思路,單片機(jī)資源分配以及程序流程 ①單片機(jī)資源分配 采用單片機(jī)的P3口作為按鍵的輸入,使用獨(dú)立式按鍵與P3.0-P3.3連接,構(gòu)成四個(gè)功能按鍵。 在計(jì)時(shí)功能中,需要三個(gè)變量分別暫存定時(shí)器溢出的次數(shù)(T1_cnt)、倒計(jì)時(shí)的初始值(init_val)以及當(dāng)前倒計(jì)時(shí)的秒數(shù)(cnt_val)。 按鍵掃描功能中,需要兩個(gè)變量,一個(gè)變量(key_val_new)用來(lái)存儲(chǔ)當(dāng)前掃描的鍵值(
5、若無(wú)按鍵按下則為255),另一個(gè)變量(key_val_old)用來(lái)存儲(chǔ)上一次掃描的鍵值。只有這兩個(gè)變量值不一樣時(shí),才能說(shuō)明是一次新的按鍵按下或彈起了,同時(shí)將新的鍵值賦給key_val_old變量。 在顯示功能中,需要定義一組數(shù)組(code類(lèi)型),值為0-9數(shù)字對(duì)應(yīng)的數(shù)碼管7段碼。還需要定義一個(gè)變量(show_val)暫存要顯示的數(shù)據(jù),用于動(dòng)態(tài)掃描顯示中。 在整個(gè)程序中,定義了一個(gè)狀態(tài)變量(state_val)用來(lái)存儲(chǔ)當(dāng)前單片機(jī)工作在哪種狀態(tài)。 ②程序設(shè)計(jì)思路 鑒于題目要求,存在三種工作模式:初始值設(shè)置模式、倒計(jì)時(shí)模式、計(jì)時(shí)到0時(shí)的閃爍模式。變量state_val為0時(shí),處于倒計(jì)時(shí)模式。
6、變量state_val為1時(shí),處于初始值設(shè)置模式。變量state_val為2時(shí),處于閃爍模式。這些狀態(tài)的切換取決于按下哪一個(gè)鍵以及是否計(jì)時(shí)到0。狀態(tài)的切換圖如圖3-2 圖3-2 狀態(tài)的切換 單片機(jī)復(fù)位之后,默認(rèn)處于倒計(jì)時(shí)模式,啟動(dòng)定時(shí)器,定時(shí)器每隔250us溢出一次,根據(jù)定時(shí)器溢出次數(shù)來(lái)計(jì)時(shí),到1秒時(shí)將時(shí)間的計(jì)數(shù)器減1。當(dāng)“設(shè)置鍵”按下時(shí),變量state_val由0變?yōu)?,切換到設(shè)置模式??梢允褂谩斑f增鍵”“遞減鍵”對(duì)計(jì)時(shí)初始值進(jìn)行修改。按下“確認(rèn)鍵”時(shí),回到計(jì)時(shí)模式開(kāi)始以新的初始值進(jìn)行倒
7、計(jì)時(shí)。當(dāng)?shù)褂?jì)時(shí)到0時(shí),變量state_val由1變?yōu)?,處于閃爍狀態(tài),在這種狀態(tài)下,根據(jù)按鍵的情況分別又切換到計(jì)時(shí)和設(shè)置狀態(tài)。 ③程序流程 主程序首先需要初始化定時(shí)器的參數(shù)和一些變量,然后進(jìn)入一個(gè)循環(huán)結(jié)構(gòu),在循環(huán)中始終只做兩件事,一是鍵盤(pán)的掃描,二是數(shù)碼管的動(dòng)態(tài)掃描。 在掃描鍵盤(pán)后,根據(jù)前一次按鍵的結(jié)果是否與本次鍵值相同。如果不同,表示有鍵按下或彈起,同時(shí)用本次按鍵值更新上一次的按鍵值。這樣設(shè)計(jì)旨在避免一個(gè)按鍵長(zhǎng)時(shí)間按下時(shí)被重復(fù)判為有新鍵按下,使得當(dāng)前按下的鍵只有松開(kāi)后,下一次按下時(shí)才算為一次新的按鍵。 根據(jù)按鍵的值分別改變變量(state_val)的值或者在設(shè)置狀態(tài)時(shí)的倒計(jì)時(shí)初始值。
8、完整的主程序圖如圖3-3所示。 圖3-3 主程序的流程圖 在定時(shí)器的參數(shù)中,選擇定時(shí)器T1的8位自動(dòng)裝載模式,每250us產(chǎn)生一次溢出中斷,中斷服務(wù)程序如圖3-4所示。 圖3-4中斷服務(wù)程序流程圖 (4)軟硬件調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在
9、“文件\新建文件”中,新建C語(yǔ)言源程序文件,編寫(xiě)相應(yīng)的程序。在“文件\新建項(xiàng)目”的菜單中,新建項(xiàng)目并將C語(yǔ)言源程序文件包括在項(xiàng)目文件中。 在 “項(xiàng)目\編譯”菜單中將C源文件編譯,檢查語(yǔ)法錯(cuò)誤及邏輯錯(cuò)誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。 硬件調(diào)試方案:在設(shè)計(jì)平臺(tái)中,將單片機(jī)的P3.0-P3.3分別與獨(dú)立式鍵盤(pán)的相應(yīng)位通過(guò)插線(xiàn)連接起來(lái)。 在偉福中將程序文件編譯成目標(biāo)文件后,運(yùn)行MCU下載程序,選擇相應(yīng)的flash 數(shù)據(jù)文件,點(diǎn)擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。 然后,上電重新啟動(dòng)單片機(jī),檢查所編寫(xiě)的程序是否達(dá)到題目的要求,是否全面
10、完整地完成試題的內(nèi)容。 3.1.3 程序設(shè)計(jì)(僅供參考的C語(yǔ)言源程序) //晶振:11.0592M T1-250微秒 按鍵P10 P11 P12 P13 /*變量的定義: show_val: 顯示的值0-59 init_val: 初始值 state_val: 狀態(tài)值 0-計(jì)數(shù)狀態(tài);1-設(shè)置狀態(tài);2-閃爍狀態(tài) shan_val: key_val1: 四個(gè)按鍵的值 255-無(wú)鍵;1-設(shè)置鍵 2-增一鍵 3-減一鍵 4-確定鍵 T1_cnt: 定時(shí)器計(jì)數(shù)溢出數(shù) cnt_val: 倒計(jì)時(shí)的數(shù)
11、值 led_seg_code:數(shù)碼管7段碼 */ #include "reg51.h" //包含文件 sbit P1_0=P1^0; //設(shè)置鍵 sbit P1_1=P1^1; //增一鍵 sbit P1_2=P1^2; //減一鍵 sbit P1_3=P1^3; //確定鍵 unsigned char data shan_val; //閃爍時(shí)LED的開(kāi)/關(guān)狀態(tài) unsigned char data cnt_val; //保存倒計(jì)數(shù)的當(dāng)前值 unsigned int data T1_cnt;
12、//保存定時(shí)器溢出次數(shù) unsigned char data key_val_new,key_val_old;//存放當(dāng)前掃描的鍵和前一次按下的鍵值 unsigned char data state_val; //狀態(tài)值 unsigned char data show_val; //存放需要在數(shù)碼管顯示的數(shù)字 unsigned char data init_val; //暫存倒計(jì)數(shù)的初始值 char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //----------延
13、時(shí)-------------- void delay(unsigned int i) //大約延時(shí)i*2個(gè)微秒 { while(--i);} //-----------按鍵掃描------------- unsigned char scan_key() { unsigned char i; i=P1&0x0f; delay(100); //延時(shí),去抖動(dòng) if (i==(P1&0x0f)) { if (P1_0==0) { i=1; } else { if (P1_1==0)
14、 { i=2;} else { if (P1_2==0) { i=3;} else { if (P1_3==0) { i=4;} } } } } else { i=255; } return i; } //---------數(shù)碼管顯示--------------- void led_show(unsigned int v) { unsigned char i; if (state_val!=2)
15、 //動(dòng)態(tài)掃描 {i=v%10; //取要顯示的數(shù)的個(gè)位 P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼 P2=0xfe; //顯示個(gè)位 delay(15); //延時(shí) i=v%100/10; //取十位 P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼 P2=0xfd; //顯示十位 delay(5); //延時(shí) } else { P0=led_seg_code[0]; //處于閃
16、爍狀態(tài) if (shan_val) { P2=0xff; } //將數(shù)碼管的關(guān)閉 else { P2=0xfc; } //將數(shù)碼管的打開(kāi) } } //----------定時(shí)器T1中斷服務(wù)程序--------------- void timer1() interrupt 3 //T1中斷,250us中斷一次 { T1_cnt++; switch (state_val) { case 0: if(T1_cnt>3999) //如果計(jì)數(shù)>3999, 計(jì)時(shí)1s
17、 { T1_cnt=0; if(cnt_val!=0) { cnt_val--;} else {state_val=2;} //定時(shí)計(jì)數(shù)到0時(shí),切換狀態(tài) show_val=cnt_val; } break; case 2: if(T1_cnt>1999) //如果計(jì)數(shù)>1999, 計(jì)時(shí)0.5s { T1_cnt=0; shan_val=!
18、shan_val; } //閃爍狀態(tài) break; } } //---------主程序---------------- main() {init_val=59; //初始化各變量 cnt_val=init_val; show_val=cnt_val; state_val=0; key_val_old=255; T1_cnt=0; shan_val=0; //初始化51的寄存器 TMOD=0x20; //用T1計(jì)時(shí) 8位自動(dòng)裝載定時(shí)模式 TH1=0x19; //250微秒溢出一次; 250=(256
19、-x)*12/11.0592 -> x= 230.4 TL1=0x19; EA=1; //打開(kāi)總中斷允許 ET1=1; //開(kāi)中斷允許 TR1=1; //開(kāi)定時(shí)器T1 while(1) { key_val_new=scan_key(); // 255表示無(wú)鍵按下 if (key_val_new!=key_val_old) { // 只有當(dāng)前掃描的鍵值與上次掃描的不同,才判斷是有鍵按下 key_val_old=key_val_new; switch (key_val_new) {
20、case 1: //設(shè)置鍵 state_val=1; //處于設(shè)置狀態(tài) TR1=1; //停止計(jì)時(shí) show_val=init_val; //顯示原來(lái)的倒計(jì)數(shù)初始值 break; case 2: if(state_val==1) //只有在設(shè)置狀態(tài),增1鍵才有用 { if (init_val>0) //更改原來(lái)的倒計(jì)數(shù)初始值 {ini
21、t_val--; } else {init_val=59;} show_val=init_val;//顯示更改后的倒計(jì)數(shù)初始值 } break; case 3: if(state_val==1) //只有在設(shè)置狀態(tài),減1鍵才有用 { if (init_val<59) //更改原來(lái)的倒計(jì)數(shù)初始值 {init_val++; }
22、 else {init_val=0;} show_val=init_val; //顯示更改后的計(jì)數(shù)初始值 } break; case 4: if(state_val!=0) //如果已處于計(jì)數(shù)模式,確認(rèn)鍵不起作用 { cnt_val=init_val; //將初始值賦給計(jì)數(shù)變量 show_val=cnt_val; //將計(jì)數(shù)變量的數(shù)字顯示
23、 TR1=1; //啟動(dòng)定時(shí)器T1 state_val=0; //將狀態(tài)切換為計(jì)數(shù)模式 } break; } } led_show(show_val); //動(dòng)態(tài)掃描 } } 3.2 交通燈 設(shè)計(jì)一個(gè)基于單片機(jī)的交通燈信號(hào)控制器。已知東、西、南、北四個(gè)方向各有紅黃綠色三個(gè)燈,在東西方向有兩個(gè)數(shù)碼
24、管,在南北方向也有兩個(gè)數(shù)碼管。要求交通燈按照表1進(jìn)行顯示和定時(shí)切換,并要求在數(shù)碼管上分別倒計(jì)時(shí)顯示東西、南北方向各狀態(tài)的剩余時(shí)間。 表1 交通燈的狀態(tài)切換表 南北方向 東西方向 序號(hào) 狀態(tài) 序號(hào) 狀態(tài) 1 綠燈亮25秒,紅、黃燈滅 1 紅燈亮30秒,綠、黃燈滅 2 黃燈亮5秒,紅、綠燈滅 3 紅燈亮30秒,綠、黃燈滅 2 綠燈亮25秒,紅、黃燈滅 3 黃燈亮25秒,紅、綠燈滅 回到狀態(tài)1 回到狀態(tài)1 3.2.1模塊1:系統(tǒng)設(shè)計(jì) (1)任務(wù)分析與整體設(shè)計(jì)思路 試題要求實(shí)現(xiàn)的功能主要包括計(jì)時(shí)功能、動(dòng)態(tài)掃描以及狀態(tài)的切換等幾部分。 計(jì)時(shí)功能:要實(shí)現(xiàn)計(jì)
25、時(shí)功能則需要使用定時(shí)器來(lái)計(jì)時(shí),通過(guò)設(shè)置定時(shí)器的初始值來(lái)控制溢出中斷的時(shí)間間隔,再利用一個(gè)變量記錄定時(shí)器溢出的次數(shù),達(dá)到定時(shí)1秒中的功能。當(dāng)計(jì)時(shí)每到1秒鐘后,東西、南北信號(hào)燈各狀態(tài)的暫存剩余時(shí)間的變量減1。當(dāng)暫存剩余時(shí)間的變量減到0時(shí),切換到下一個(gè)狀態(tài),同時(shí)將下一個(gè)狀態(tài)的初始的倒計(jì)時(shí)值裝載到計(jì)時(shí)變量中。開(kāi)始下一個(gè)狀態(tài),如此循環(huán)重復(fù)執(zhí)行。 動(dòng)態(tài)掃描:需要使用4個(gè)數(shù)碼管分別顯示東西、南北的倒計(jì)時(shí)數(shù)字,將暫存各狀態(tài)剩余時(shí)間的數(shù)字從變量中提取出“十位”和“個(gè)位”,用動(dòng)態(tài)掃描的方式在數(shù)碼管中顯示。 整個(gè)程序依據(jù)定時(shí)器的溢出數(shù)來(lái)計(jì)時(shí),每計(jì)時(shí)1S則相應(yīng)狀態(tài)的剩余時(shí)間減1,一直減到0時(shí)觸發(fā)下一個(gè)狀態(tài)的開(kāi)始。
26、 (2)單片機(jī)型號(hào)及所需外圍器件型號(hào),單片機(jī)硬件電路原理圖 圖3-5 交通燈硬件電路原理圖 選用MCS51系列AT89S51單片機(jī)作為微控制器,選擇兩個(gè)四聯(lián)的共陰極數(shù)碼管組成8位顯示模塊,由于AT89S51單片機(jī)驅(qū)動(dòng)能力有限,采用兩片74HC244實(shí)現(xiàn)總線(xiàn)的驅(qū)動(dòng),一個(gè)74HC244完成共陰極數(shù)碼管位控線(xiàn)的控制和驅(qū)動(dòng),另一個(gè)74HC244完成數(shù)碼管的7段碼輸出,在7段碼輸出口上各串聯(lián)一個(gè)100歐姆的電阻對(duì)7段數(shù)碼管限流。用P3口的P3.0-P3.5完成發(fā)光二極管的
27、控制,實(shí)現(xiàn)交通燈信號(hào)的顯示,每個(gè)發(fā)光二極管串聯(lián)500歐姆電阻起限流作用。硬件電路原理圖如圖3-5所示。 (3)程序設(shè)計(jì)思路,單片機(jī)資源分配以及程序流程 ①單片機(jī)資源分配 單片機(jī)P3口的P3.0-P3.1引腳用作輸出,控制發(fā)光二極管的顯示。在計(jì)時(shí)模塊中,需要定義兩個(gè)數(shù)組變量(init_sn[3],init_ew[3])來(lái)存儲(chǔ)東西、南北兩個(gè)方向在不同狀態(tài)中倒計(jì)時(shí)的初始值,題目中每個(gè)方向的交通燈共有3種顯示狀態(tài),因此數(shù)組元素個(gè)數(shù)為3。還需要定義兩個(gè)變量( cnt_ sn, cnt_ ew)暫存東西、南北兩個(gè)方向的倒計(jì)時(shí)剩余時(shí)間。 在狀態(tài)的切換中,為了明確當(dāng)前處于哪種狀態(tài),東西、南北方
28、向各設(shè)置一個(gè)狀態(tài)變量(state_val_sn, state_val_ew),當(dāng)?shù)褂?jì)時(shí)的剩余時(shí)間到零時(shí),狀態(tài)變量增1,表示啟動(dòng)下一個(gè)狀態(tài),當(dāng)該變量增到3時(shí)變?yōu)?,回到序號(hào)為1的狀態(tài)。 ②程序設(shè)計(jì)思路 在設(shè)計(jì)中,由于沒(méi)有鍵盤(pán)功能,因此只涉及定時(shí)計(jì)數(shù)和動(dòng)態(tài)掃描功能。主程序?qū)⒆兞砍跏蓟? 后,設(shè)置單片機(jī)定時(shí)器和中斷特殊功能寄存器的初始值,將定時(shí)器T1的工作方式設(shè)置為8位自動(dòng) 裝載模式,定時(shí)器每隔250us產(chǎn)生一次溢出。 在初始化變量與寄存器后,主程序進(jìn)入一個(gè)循環(huán)結(jié)構(gòu),在循環(huán)中只做動(dòng)態(tài)掃描的工作,根據(jù)東西、南北兩向的剩余時(shí)時(shí)間進(jìn)行動(dòng)態(tài)掃描顯示。 計(jì)時(shí)以及狀態(tài)的切換通過(guò)定時(shí)器的中斷
29、服務(wù)程序來(lái)實(shí)現(xiàn),在中斷服務(wù)程序中,每計(jì)時(shí)到一秒時(shí),則各方向當(dāng)前狀態(tài)的剩余時(shí)間減1,一直減到0時(shí)觸發(fā)下一個(gè)狀態(tài)的開(kāi)始,改變交通燈的指示。 ③程序流程 圖3-7 交通燈主程序流程圖 圖3-8 中斷服務(wù)程序流程圖 (4)軟硬件調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在“文件\新建文件”中,新建C語(yǔ)言源程序文件,編寫(xiě)相應(yīng)的程序。在“文件\新建項(xiàng)目”的菜單中,新建項(xiàng)目并將C語(yǔ)言源程序文件包括在項(xiàng)目文件中。 在 “項(xiàng)
30、目\編譯”菜單中將C源文件編譯,檢查語(yǔ)法錯(cuò)誤及邏輯錯(cuò)誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。 硬件調(diào)試方案:在設(shè)計(jì)平臺(tái)中,將單片機(jī)的P3.0-P3.5分別與獨(dú)立式鍵盤(pán)的相應(yīng)位通過(guò)插線(xiàn)連接起來(lái)。 在偉福中將程序文件編譯成目標(biāo)文件后,運(yùn)行“MCU下載程序”,選擇相應(yīng)的flash 數(shù)據(jù)文件,點(diǎn)擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。 然后,上電重新啟動(dòng)單片機(jī),檢查所編寫(xiě)的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。 3.2.2 程序設(shè)計(jì)(僅供參考的C語(yǔ)言源程序) //晶振:11.0592M T1-250微秒溢出一次 /*變
31、量的定義: show_val_sn,show_val_ew: 顯示的值0-59 state_val_sn,state_val_ew: 狀態(tài)值 南北方向0-綠燈亮;1-黃燈亮;2-紅燈亮 T1_cnt: 定時(shí)器計(jì)數(shù)溢出數(shù) cnt_sn,cnt_ew: 倒計(jì)時(shí)的數(shù)值 init_sn[3],init_ew[3] 倒計(jì)時(shí) led_seg_code:數(shù)碼管7段碼 */ #include "reg51.h" sbit SN_green=P3^2 ;//南北方向綠燈 sbit SN_yellow=P3^1 ;//南北方向黃燈 sbit SN_red=
32、P3^0 ;//南北方向紅燈 sbit EW_green=P3^5 ;//東西方向綠燈 sbit EW_yellow=P3^4 ;//東西方向黃燈 sbit EW_red=P3^3 ;//東西方向紅燈 unsigned char data cnt_sn,cnt_ew; unsigned int data T1_cnt; unsigned char data state_val_sn,state_val_ew; char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; ch
33、ar code init_sn[3]={24,4,29}; char code init_ew[3]={29,24,4}; //------------------------ void delay(unsigned int i)//延時(shí) { while(--i); } //------------------------ void led_show(unsigned int u,unsigned int v) { unsigned char i; i=u%10; //暫存?zhèn)€位 P0=led_seg_code[i]; P2=0xbf; de
34、lay(100); //延時(shí) i=u%100/10; //暫存十位 P0=led_seg_code[i]; P2=0x7f; delay(100); //延時(shí) i=v%10; //暫存?zhèn)€位 P0=led_seg_code[i]; P2=0xfe; delay(100); //延時(shí) i=v%100/10; //暫存十位 P0=led_seg_code[i]; P2=0xfd; delay(100); //延時(shí) } //------------------------- void timer
35、1() interrupt 3 //T1中斷 { T1_cnt++; if(T1_cnt>3999) //如果計(jì)數(shù)>3999, 計(jì)時(shí)1s { T1_cnt=0; if (cnt_sn!=0) //南北方向計(jì)時(shí) { cnt_sn--; } else { state_val_sn++; if (state_val_sn>2) state_val_sn=0; cnt_sn=init_sn[state_val_sn]; switch (state_val_sn) //根
36、據(jù)狀態(tài)值,刷新各信號(hào)燈的狀態(tài) { case 0: SN_green=0 ;//南北方向綠燈 SN_yellow=1 ;//南北方向黃燈 SN_red=1 ;//南北方向紅燈 break; case 1: SN_green=1 ;//南北方向綠燈 SN_yellow=0 ;//南北方向黃燈 SN_red=1 ;//南北方向紅燈 brea
37、k; case 2:SN_green=1 ;//南北方向綠燈 SN_yellow=1 ;//南北方向黃燈 SN_red=0 ;//南北方向紅燈 break; } } if (cnt_ew!=0) //東西方向計(jì)時(shí) { cnt_ew--; } else { state_val_ew++; if (state_val_ew>2) state_val_ew=0;
38、 cnt_ew=init_ew[state_val_ew]; switch (state_val_ew) //根據(jù)狀態(tài)值,刷新各信號(hào)燈的狀態(tài) { case 0: EW_green=1 ;//東西方向綠燈 EW_yellow=1;//東西方向黃燈 EW_red=0 ;//東西方向紅燈 break; case 1: EW_green=0 ;//東西方向綠燈 EW_yellow=1 ;//東西方向黃
39、燈 EW_red=1 ;//東西方向紅燈 break; case 2: EW_green=1 ;//東西方向綠燈 EW_yellow=0 ;//東西方向黃燈 EW_red=1 ;//東西方向紅燈 break; } } } } //------------------------- main() {//初始化各變量 cnt_sn=init_sn[0];
40、 cnt_ew=init_ew[0]; T1_cnt=0; state_val_sn=0; //啟動(dòng)后,默認(rèn)工作在序號(hào)為1的狀態(tài) state_val_ew=0; //初始化各燈的狀態(tài) SN_green=0 ;//南北方向綠燈亮 SN_yellow=1 ;//南北方向黃燈滅 SN_red=1 ;//南北方向紅燈滅 EW_green=1 ;//東西方向綠燈滅 EW_yellow=1;//東西方向黃燈滅 EW_red=0 ;//東西方向紅燈亮 //初始化51的寄存器 TMOD=0x20;//用T1計(jì)時(shí) 8位自動(dòng)裝載定時(shí)模式 TH1=0x19;//0
41、x4b; //500微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4 TL1=0x19; EA=1; //開(kāi)中斷 ET1=1; TR1=1; //開(kāi)定時(shí)器T1 while(1) { led_show(cnt_sn,cnt_ew);}} //主程序結(jié)束 3.3.3 密碼鎖 單片機(jī)控制的密碼鎖設(shè)計(jì)。AT89S52單片機(jī)P1引腳外接獨(dú)立式按鍵S1-S8,分別代表數(shù)字鍵0-5、確定鍵、取消鍵。單片機(jī)從P3.0-P3.3輸出4個(gè)信號(hào),分別為1個(gè)電磁開(kāi)鎖驅(qū)動(dòng)信號(hào)和密碼錯(cuò)誤指示、報(bào)警輸出、已開(kāi)鎖指示信號(hào),分別用發(fā)光二極管L1-
42、L4指示。P3.4接一有源蜂鳴器,用于實(shí)現(xiàn)提示音。 基本要求: (1)初始密碼為123450,輸完后按確定鍵開(kāi)鎖,取消鍵清除所有輸入,每次按鍵有短“滴”聲按鍵提示音。 (2)密碼輸入正確后,輸出一個(gè)電磁鎖開(kāi)鎖信號(hào)與已開(kāi)鎖信號(hào),并發(fā)出兩聲短“滴”聲提示。4秒后開(kāi)鎖信號(hào)與已開(kāi)鎖指示清零。 (3)密碼輸入錯(cuò)誤時(shí),發(fā)出一聲長(zhǎng)“滴”聲錯(cuò)誤指示提示音,并密碼錯(cuò)誤指示燈亮,三次密碼錯(cuò)誤時(shí),發(fā)出長(zhǎng)鳴聲報(bào)警,并密碼錯(cuò)誤指示燈亮,報(bào)警指示燈亮,此后15秒內(nèi)無(wú)法再次輸入密碼,15秒過(guò)后,清除所有報(bào)警和指示。 (4)5秒內(nèi)無(wú)任何操作后,清除所有輸入內(nèi)容,等待下次輸入。 3.3.1模塊1 系統(tǒng)設(shè)計(jì) (
43、1)分析任務(wù)要求。寫(xiě)出系統(tǒng)整體設(shè)計(jì)思路 根據(jù)題目的要求,需要考慮如下幾個(gè)任務(wù):按鍵的輸入,密碼的判斷,密碼輸入正確或錯(cuò)誤的計(jì)時(shí)、輸出信號(hào)的控制等。 鍵盤(pán)的輸入:由于需要輸入6個(gè)數(shù)字作為密碼,先要判斷按鍵時(shí)數(shù)字鍵還是功能鍵,若判斷為數(shù)字鍵按下,則需要將每次鍵盤(pán)的輸入內(nèi)容依次暫存在一個(gè)數(shù)組中。在每次按鍵輸入時(shí),需要啟動(dòng)定時(shí)器實(shí)現(xiàn)待機(jī)計(jì)時(shí)(5秒)。若5秒內(nèi)沒(méi)有輸入內(nèi)容則清除已輸入的內(nèi)容。 密碼的判斷和計(jì)時(shí):在按下確認(rèn)鍵之后,要將輸入的內(nèi)容與初始密碼核對(duì),如果密碼正確,輸出相應(yīng)的指示,同時(shí)還要啟動(dòng)定時(shí)器實(shí)現(xiàn)4s的計(jì)時(shí)。如果密碼錯(cuò)誤,錯(cuò)誤計(jì)數(shù)變量增1,同時(shí)輸出密碼指示信號(hào),若錯(cuò)誤次數(shù)超過(guò)3s,則
44、輸出報(bào)警等信號(hào),同時(shí)啟動(dòng)定時(shí)器實(shí)現(xiàn)15秒的計(jì)時(shí)。 輸出信號(hào)的控制主要根據(jù)按鍵輸入與密碼的核對(duì)情況來(lái)決定。 整體程序設(shè)計(jì)思想: 程序分為主程序和中斷服務(wù)程序兩個(gè)主要部分,主程序完成變量和單片機(jī)特殊功能寄存器的初始化后,進(jìn)入一個(gè)循環(huán)結(jié)構(gòu)。在循環(huán)中,首先判斷有無(wú)按鍵按下,若有按鍵則判斷是否數(shù)字鍵還是功能鍵,根據(jù)按鍵的情況執(zhí)行相應(yīng)的功能。然后根據(jù)密碼是否正確的判斷情況,執(zhí)行相應(yīng)的操作。循環(huán)中最后將需要顯示的內(nèi)容通過(guò)動(dòng)態(tài)掃描在數(shù)碼管上顯示。 中斷服務(wù)程序只要實(shí)現(xiàn)三個(gè)狀態(tài)的計(jì)時(shí),待機(jī)時(shí)需要計(jì)時(shí)5秒,密碼正確需要計(jì)時(shí)5s,密碼3次輸入錯(cuò)誤需要計(jì)時(shí)15秒。當(dāng)前處于何種計(jì)時(shí),由主程序根據(jù)密碼判斷
45、結(jié)果來(lái)決定。 (2)選擇單片機(jī)型號(hào)和所需外圍器件型號(hào),設(shè)計(jì)單片機(jī)硬件電路原理圖 采用MCS51系列單片機(jī)At89S51作為主控制器,外圍電路器件包括數(shù)碼管驅(qū)動(dòng)、蜂鳴器的輸出驅(qū)動(dòng)、獨(dú)立式鍵盤(pán)以及發(fā)光二極管的輸出等。 數(shù)碼管驅(qū)動(dòng)采用2個(gè)四聯(lián)共陰極數(shù)碼管顯示,由于單片機(jī)驅(qū)動(dòng)能力有限,采用74HC244作為數(shù)碼管的驅(qū)動(dòng)。在74HC244的7段碼輸出線(xiàn)上串聯(lián)100歐姆電阻起限流作用。 蜂鳴器的驅(qū)動(dòng)采用PNP三極管8550來(lái)驅(qū)動(dòng),低電平有效。 獨(dú)立式按鍵使用上提拉電路連接,在沒(méi)有鍵按下時(shí),輸出高電平。發(fā)光二極管串聯(lián)500歐姆電阻再接到電源上,當(dāng)輸入為低電平時(shí),發(fā)光二極管導(dǎo)通發(fā)光。 硬件電路原
46、理圖如圖3-9所示。 圖3-9 密碼鎖電路原理圖 (3)分析軟件任務(wù)要求,寫(xiě)出程序設(shè)計(jì)思路,分配單片機(jī)內(nèi)部資源,畫(huà)出程序流程圖 軟件任務(wù)要求主要包括按鍵掃描、密碼判斷、動(dòng)態(tài)掃描輸入的內(nèi)容、計(jì)時(shí)、指示信號(hào)輸出以及蜂鳴器提示音的輸出等。主程序主要完成變量與寄存器的初始化、按鍵的掃描與判斷、密碼的判斷以及數(shù)碼管動(dòng)態(tài)掃描顯示等。主程序流程圖如圖3-10所示。
47、 圖3-10 密碼鎖的主程序流程圖 中斷服務(wù)程序主要完成三種定時(shí)的計(jì)時(shí)工作,包括①按鍵之后啟動(dòng)的待機(jī)計(jì)時(shí),當(dāng)待機(jī)超過(guò)5s則清除已輸入的內(nèi)容。②密碼輸入正確之后的計(jì)時(shí),4s之后清除開(kāi)鎖驅(qū)動(dòng)信號(hào)與已開(kāi)鎖指示信號(hào)。 ③密碼輸入錯(cuò)誤3次的計(jì)時(shí),計(jì)時(shí)15s,在則15s內(nèi)無(wú)法再次輸入密碼,15秒過(guò)后清除所有報(bào)警與指示。中斷服務(wù)程序流程圖如圖3-11所示。 圖3-11 密碼鎖中斷服務(wù)程序流程圖 單片機(jī)資源的分配與變量的定義: 密碼的輸入與判斷需要定義4個(gè)變
48、量。原始密碼存儲(chǔ)在數(shù)組init_val[6]中。鍵盤(pán)輸入的密碼存儲(chǔ)在數(shù)據(jù)show_val[6]中,變量 key_index的值表示當(dāng)前按鍵是六位密碼中的哪一位,每輸入一個(gè)密碼數(shù)字該變量增一。密碼輸入錯(cuò)誤的次數(shù)暫存在變量error_num中。 計(jì)時(shí)功能需要5個(gè)變量。模式變量cnt_state存儲(chǔ)計(jì)時(shí)屬于什么狀態(tài),0表示待機(jī)計(jì)時(shí),1表示密碼正確的計(jì)時(shí),2表示密碼錯(cuò)誤3次的計(jì)時(shí)。三個(gè)變量(cnt_val_15s,cnt_val_5s, cnt_val_4s)分別實(shí)現(xiàn)待機(jī)、密碼正確和密碼錯(cuò)誤3次后的計(jì)時(shí)工作。定時(shí)器T1每250ms產(chǎn)生一次中斷,變量T1_cnt記錄定時(shí)器溢出中斷的次數(shù),當(dāng)記錄到40
49、00時(shí)表示計(jì)時(shí)1秒。 (4)設(shè)計(jì)系統(tǒng)軟件調(diào)試方案、硬件調(diào)試方案及軟硬件聯(lián)合調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在“文件\新建文件”中,新建C語(yǔ)言源程序文件,編寫(xiě)相應(yīng)的程序。在“文件\新建項(xiàng)目”的菜單中,新建項(xiàng)目并將C語(yǔ)言源程序文件包括在項(xiàng)目文件中。 在 “項(xiàng)目\編譯”菜單中將C源文件編譯,檢查語(yǔ)法錯(cuò)誤及邏輯錯(cuò)誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。 硬件調(diào)試方案:在設(shè)計(jì)平臺(tái)中,將單片機(jī)的P1.0-P1.7分別與8個(gè)獨(dú)立式鍵盤(pán)通過(guò)插線(xiàn)連接起來(lái),將P3.0-P3.3分別與4個(gè)發(fā)光二極管連接起來(lái),P3.4與蜂鳴器的輸入連接起來(lái)。 在偉福中將程序
50、文件編譯成目標(biāo)文件后,將下載線(xiàn)安裝在實(shí)驗(yàn)平臺(tái)的下載線(xiàn)接口上,運(yùn)行“MCU下載程序”,選擇相應(yīng)的flash 數(shù)據(jù)文件,點(diǎn)擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。 然后,上電重新啟動(dòng)單片機(jī),檢查所編寫(xiě)的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。 3.3.2 程序設(shè)計(jì) //晶振11.0592MHz,T1每250微秒中斷,按鍵P1.0-P1.7,發(fā)光二極管接P3.0-P3.3,p3.4 /*變量的定義: show_val[6]: 顯示的值 init_val[6]: 密碼初始值 key_val: 返回按鍵的值 255-表示無(wú)按鍵按下
51、 key_index: 當(dāng)前按鍵是哪一位密碼 T1_cnt: 定時(shí)器計(jì)數(shù)溢出數(shù) cnt_val_15s: 報(bào)警計(jì)時(shí)的數(shù)值 cnt_val_5s: 待機(jī)時(shí)間計(jì)時(shí) cnt_val_4s: 輸入正確,等待4秒清除開(kāi)鎖信號(hào) cnt_state: 計(jì)時(shí)狀態(tài) error_num: 錯(cuò)誤次數(shù) led_seg_code:數(shù)碼管7段碼 */ #include "reg51.h" /*說(shuō)明key0=P1^0; key1=P1^1;key2=P1^2; key3=P1^3;key4=P1^4;key5=P1^5;enter=P1
52、^6;esc=P1^7;*/ sbit relay_open=P3^0; //電磁鎖開(kāi)鎖驅(qū)動(dòng) sbit pw_error=P3^1; //密碼錯(cuò)誤信號(hào) sbit alarm_out=P3^2; //報(bào)警輸出 sbit open_lock=P3^3; //已開(kāi)鎖指示信號(hào) sbit audio_out=P3^4; //有源蜂鳴器 unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state; unsigned int data T1_cnt; unsigne
53、d char data key_val,key_index,key_val_old; unsigned char data state_val,error_num; unsigned char data show_val[6]; char code init_val[6]={1,2,3,4,5,0}; char code led_seg_code[11]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //led_seg_code[0-9]代表0-9 led_seg_code[10]=0x00數(shù)碼管不顯示任何內(nèi)容
54、 //--------延時(shí)程序---------------- void delay(unsigned int i)//延時(shí) { while(--i); } //--------清除輸入內(nèi)容---------- void init_variant() {unsigned char i; for(i=0;i<6;i++) show_val[i]=10; //led_seg_code[10]=0x00表示數(shù)碼管不顯示任何內(nèi)容 key_index=0; //沒(méi)有任何輸入或清除所有輸入時(shí),保存當(dāng)前鍵的位置 } //---------按鍵掃描---------
55、------ unsigned char scan_key() { unsigned char i,k; i=P1; if (i==0xff && cnt_state!=2) { k=255; } //無(wú)鍵按下 else //有鍵按下 { delay(500); //延時(shí)去抖動(dòng) if(i!=P1) {k=255;} else { TR1=1; //有鍵按下則開(kāi)定時(shí)器,啟動(dòng)待機(jī)計(jì)時(shí) cnt_val_5s=0; switch (i)
56、 { case 0xfe: k=0; break; case 0xfd: k=1; break; case 0xfb: k=2; break; case 0xf7: k=3; break; case 0xef: k=4; break; case 0xdf: k=5; break; case 0xbf: k=6; break; case 0x7f: k=7; break; } } } return k; }
57、 //---------數(shù)碼管顯示--------------- void led_show() {P0=led_seg_code[show_val[0]]; P2=0xdf; delay(500); P0=led_seg_code[show_val[1]]; P2=0xef; delay(500); P0=led_seg_code[show_val[2]]; P2=0xf7; delay(500); P0=led_seg_code[show_val[3]]; P2=0xfb; delay(500); P0=led_seg_code[sho
58、w_val[4]]; P2=0xfd; delay(500); P0=led_seg_code[show_val[5]]; P2=0xfe; delay(500); } //--------定時(shí)器T1中斷服務(wù)程序----------------- void timer1() interrupt 3 //T1中斷 { T1_cnt++; if(T1_cnt>3999) //如果計(jì)數(shù)>3999, 計(jì)時(shí)1s { T1_cnt=0; switch (cnt_state) { case 0: //待機(jī),需要計(jì)時(shí)5s
59、 if(cnt_val_5s<5) { cnt_val_5s++;} else { cnt_val_5s=0; init_variant();//待機(jī)計(jì)時(shí)到5秒時(shí),清除輸入的內(nèi)容 TR1=0; //停止計(jì)時(shí) } break; case 1://密碼輸入正確,需要計(jì)時(shí)4s if(cnt_val_4s<4)
60、 { cnt_val_4s++;} else { cnt_val_4s=0; init_variant();//密碼輸入正確,計(jì)時(shí)到4秒時(shí),清除輸入的內(nèi)容 open_lock=1; //已開(kāi)鎖信號(hào)清零 relay_open=1; //開(kāi)鎖信號(hào)清零 cnt_state=0; TR1=0; //停止計(jì)時(shí)
61、 } break; case 2: //密碼輸入錯(cuò)誤3次,計(jì)時(shí)15s if(cnt_val_15s<15) { cnt_val_15s++;} else { cnt_val_15s=0; init_variant();//三次密碼錯(cuò)誤時(shí),計(jì)時(shí)15秒,清除輸入的內(nèi)容 open_lock=1; // 清除所有指示和報(bào)警 relay_open=1;
62、 alarm_out=1; pw_error=1; cnt_state=0; TR1=0; //停止計(jì)時(shí) } break; } } } //--------判斷鍵盤(pán)輸入內(nèi)容與密碼是否一致------ unsigned char check_input_pw() { unsigned char i,k; k=1; for(i=0;i<6;i++)
63、 { k=k && (show_val[i]==init_val[i]); } return k; } //---------主程序---------------- main() { //初始化各變量 audio_out=1; P3=0xff; cnt_val_15s=0; cnt_val_5s=0; cnt_val_4s=0; cnt_state=0; //0-待機(jī)計(jì)時(shí)5s狀態(tài);1-密碼正確,計(jì)時(shí)4s狀態(tài) ;2-三次密碼錯(cuò)誤,處于計(jì)時(shí)15秒狀態(tài)。 T1_cnt=0; error_num=0; key_val_old=255; in
64、it_variant(); //初始化51的寄存器 TMOD=0x20; //用T1計(jì)時(shí) 8位自動(dòng)裝載定時(shí)模式 TH1=0x19; //500微秒溢出一次; 250=(256-x)*12/11.0592 -> x=19 TL1=0x19; EA=1; //開(kāi)中斷 ET1=1; TR1=0; //開(kāi)定時(shí)器T1 while(1) { key_val=scan_key(); //按鍵輸入,有鍵按下key_val為0-7,無(wú)鍵按下key_val為255。 if (key_val!=key_val_old) { key_
65、val_old=key_val; if (key_val!=255&& cnt_state!=2) { audio_out=0; delay(100); //延時(shí)去抖動(dòng) audio_out=1; switch (key_val) { case 0: case 1: case 2: case 3: case 4: case 5: if(key_index<6) //密碼為6
66、位,超過(guò)6位視為輸入無(wú)效 { show_val[key_index]=key_val; key_index++; } break; case 6: //確認(rèn)鍵 if(check_input_pw()) {//密碼正確 error_num=0; //密碼輸入錯(cuò)誤次數(shù)清零 //--------- pw_error=1; //密碼錯(cuò)誤指示燈滅 relay_open=0; //開(kāi)鎖驅(qū)動(dòng)信號(hào)燈亮 open_lock=0; //已開(kāi)鎖信號(hào)燈亮 //--------- delay(50000); //兩聲短“滴”聲 audio_out=0;
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)題黨課講稿:以高質(zhì)量黨建保障國(guó)有企業(yè)高質(zhì)量發(fā)展
- 廉政黨課講稿材料:堅(jiān)決打好反腐敗斗爭(zhēng)攻堅(jiān)戰(zhàn)持久戰(zhàn)總體戰(zhàn)涵養(yǎng)風(fēng)清氣正的政治生態(tài)
- 在新錄用選調(diào)生公務(wù)員座談會(huì)上和基層單位調(diào)研座談會(huì)上的發(fā)言材料
- 總工會(huì)關(guān)于2025年維護(hù)勞動(dòng)領(lǐng)域政治安全的工作匯報(bào)材料
- 基層黨建工作交流研討會(huì)上的講話(huà)發(fā)言材料
- 糧食和物資儲(chǔ)備學(xué)習(xí)教育工作部署會(huì)上的講話(huà)發(fā)言材料
- 市工業(yè)園區(qū)、市直機(jī)關(guān)單位、市紀(jì)委監(jiān)委2025年工作計(jì)劃
- 檢察院政治部關(guān)于2025年工作計(jì)劃
- 辦公室主任2025年現(xiàn)實(shí)表現(xiàn)材料
- 2025年~村農(nóng)村保潔員規(guī)范管理工作方案
- 在深入貫徹中央8項(xiàng)規(guī)定精神學(xué)習(xí)教育工作部署會(huì)議上的講話(huà)發(fā)言材料4篇
- 開(kāi)展深入貫徹規(guī)定精神學(xué)習(xí)教育動(dòng)員部署會(huì)上的講話(huà)發(fā)言材料3篇
- 在司法黨組中心學(xué)習(xí)組學(xué)習(xí)會(huì)上的發(fā)言材料
- 國(guó)企黨委關(guān)于推動(dòng)基層黨建與生產(chǎn)經(jīng)營(yíng)深度融合工作情況的報(bào)告材料
- 副書(shū)記在2025年工作務(wù)虛會(huì)上的發(fā)言材料2篇
相關(guān)資源
更多