




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于單片機課程設計報告2(完整資料)(可以直接使用,可編輯優秀版資料,歡迎下載)
基于單片機課程設計報告2(完整資料)(可以直接使用,可編輯優秀版資料,歡迎下載)單片機課程設計單片機課程設計課題:基于51單片機的交通燈設計專業:?機械設計制造及其自動化學號:?指導教師:? 邵添設計日期: ?2017/12/18成績:重慶大學城市科技學院電氣學院基于51單片機數字溫度計設計報告一、設計目的作用本設計是一款簡單實用的小型數字溫度計,所采用的主要元件有傳感器DS18B20,單片機AT89C52,,四位共陰極數碼管一個,電容電阻若干.DS18B20支持“一線總線”接口,測量溫度范圍—55°C~+125°C。在—10~+85°C范圍內,精度為±0。5°C。18B20的精度較差,為±2°C本次數字溫度計的設計共分為五部分,主控制器,LED顯示部分,傳感器部分,復位部分,按鍵設置部分,時鐘電路。主控制器即單片機部分,用于存儲程序和控制電路;LED顯示部分是指四位共陰極數碼管,用來顯示溫度;傳感器部分,即溫度傳感器,用來采集溫度,進行溫度轉換;復位部分,即復位電路,按鍵部分用來設置上下限報警溫度.測量的總過程是,傳感器采集到外部環境的溫度,并進行轉換后傳到單片機,經過單片機處理判斷后將溫度傳遞到數碼管顯示。二、設計要求(1)。利用DS18B20傳感器實時檢測溫度并顯示。(2).利用數碼管實時顯示溫度.(3).當溫度超過或者低于設定值時蜂鳴器報警,LED閃爍指示.(4).能夠手動設置上限和下限報警溫度。三、設計的具體實現1、系統概述方案一:由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數據的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩.方案設計框圖如下:數碼管顯示電路數碼管顯示電路熱敏電阻組成的感溫電路AD轉換方案二:考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求.從以上兩種方案,很容易看出,采用方案二,電路比較簡單,軟件設計也比較簡單,故采用了方案二。2、
單元電路設計與分析1、硬件設計按照系統設計功能的要求,確定系統由3個模塊組成:主控制器、測溫電路和顯示電路。數字溫度計總體電路結構框圖所示:蜂鳴器報警模塊AT89C51單片機DB18B20溫度傳感器按鍵設置模塊電源數碼管顯示LED閃爍報警模塊蜂鳴器報警模塊AT89C51單片機DB18B20溫度傳感器按鍵設置模塊電源數碼管顯示LED閃爍報警模塊單片機的選擇單片機AT89S52具有低電壓供電和體積小等特點,四個端口只需要兩個口就能滿足電路系統的設計需要,很適合便攜手持式產品的設計使用系統可用二節電池供電。由于器件問題,我們使用了通用的手機5V充電器接口。復位電路模塊單片機系統的復位電路在這里使用的是上電+按鈕的復位電路模式,其中電阻R采用的是10KΩ的阻值,電容采用電容值為10uF的電解電容,電路圖如下:溫度顯示模塊四位共陰極數碼管,能夠顯示小數.列掃描用P2.4~P2。7口來實現,列驅動直接51接單片機驅動。電路圖如下:????? ??????? ? ??? ? 溫度傳感器模塊DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。電路圖如下: ? ?? ???? ? ? ? ? ? ? 按鍵模塊按鍵是用來設置報警的上下限溫。K1是用來進入上下限調節模式的,當按一下K1進入上限調節模式,再按一下進入下限調節模式。在正常模式下,按一下K2進入查看上限溫度模式,顯示1s左右自動退出;按一下K3進入查看下限溫度模式,顯示1s左右自動退出;按一下K4消除按鍵音,再按一下啟動按鍵音.在調節上下限溫度模式下,K2是實現加1功能,K1是實現減1功能,K3是用來設定上下限溫度正負的。? 2、軟件設計主要包括主程序、讀出溫度子程序、溫度轉換命令子程序、計算溫度子程序和現實數據刷新子程序等。主程序主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量溫度值。溫度測量每1S進行一次.主流程圖如下:讀出溫度子程序讀出溫度子程序的主要功能是讀出RAM中的9字節。在讀出時須進行CRC校驗,校驗有錯時不進行溫度數據的改寫。流程圖如下:溫度轉換命令子程序溫度轉換命令子程序主要是發溫度轉換開始命令。當采用12位分辨率時,轉換時間約為750ms。在本程序設計中,采用1s顯示程序延時法等待轉換的完成.流程圖如下:顯示數據刷新子程序顯示數據刷新子程序主要是對顯示緩沖器中的顯示數據進行刷新操作,當最高數據顯示位為0時,將符號顯示位移入下一位。系統的調試及性能分析:硬件調試,首先檢查電感的焊接是否正確,然后可用萬用表測試或通電檢測。軟件調試可以先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、讀出溫度子程序、溫度轉換命令子程序、計算溫度子程序和現實數據刷新子程序等的編程及調試由于DS18B20與單片機采用串行數據傳送,因此,對DS18B20進行讀/寫編程時必須嚴格地保證讀/寫時序;否則將無法讀取測量結果.本程序采用單片機匯編或C語言編寫用KeilC51編譯器編程調試。軟件調試到能顯示溫度值,并且在有溫度變化時顯示溫度能改變,就基本完成。性能測試可用制作的溫度計和已有的成品溫度計同時進行測量比較。由于DS18B20的精度很高,所以誤差指標可以限制在0.5℃以內。另外,-55~+125 ???? ? ? ?四、總結本次的課程設計使我們進一步鞏固了書本上的知識,做到了學以致用.這是我們第二次自己動手設計的電路,通過系統仿真軟件Proteus和編譯軟件Keil,使我們進一步了解了單片機的設計制作過程,其中最為困難的是軟件部分,即編程部分,我們上網找了好多資料,雖然經過自己的修改,但還是有很多功能不能實現,如溫度上下限設置。由于Proteus并不是很熟練,在使用的過程中有很多原件的名稱不知道,從而花費了大量的時間在網上查找,今后應該在這方面多多努力。最后一步的焊接硬件也遇到了不少麻煩。總結經驗的時候我們得出這樣的結論,學習應該學以致用,有目的的去學習,如果學了不用等于沒學.其次,要學以致用,理論聯系實際,這樣才會取得事半功倍的效果.五、附錄附錄一:元件清單元件名稱數量AT89C51單片機112MHZ晶振133pF電容222uF電解電容1按鍵開關5IC插座40Pin1DS18B20溫度傳感器1蜂鳴器1LED?5紅1四位一體共陰數碼管1470,1K,4。7K電阻8,2,1三極管85501導線若干排針若干附錄二:完整電路原理圖附錄三:焊接實物圖附錄四:源程序/*********************************************************************程序名;基于51單片機的溫度計*功能:實時測量溫度,超過上下限報警,報警溫度可手動調整。K1是用來*進入上下限調節模式的,當按一下K1進入上限調節模式,再按一下進入下限*調節模式。在正常模式下,按一下K2進入查看上限溫度模式,顯示1s左右自動*退出;按一下K3進入查看下限溫度模式,顯示1s左右自動退出;按一下K4消除*按鍵音,再按一下啟動按鍵音。在調節上下限溫度模式下,K2是實現加1功能,*K1是實現減1功能,K3是用來設定上下限溫度正負的。*編程者:彭明闖*編程時間:2014/05/30 ?*********************************************************************/#include<reg52.h〉 ? #include<intrins.h〉?? //將intrins.h頭文件包含到主程序(調用其中的_nop_()空操作函數延時)#defineuintunsignedint??#defineucharunsignedchar ?ucharmax=0x00,min=0x00;? //max是上限報警溫度,min是下限報警溫度bits=0; ? ? ? ??//s是調整上下限溫度時溫度閃爍的標志位,s=0不顯示200ms,s=1顯示1s左右bits1=0; //s1標志位用于上下限查看時的顯示voiddisplay1(uintz);?? //聲明display1()函數(display。h頭文件中的函數,ds18b20.h要用應先聲明)#include”ds18b20.h" ?? #include"keyscan.h" ???#include"display。h" ? ?/******************************************************//* ??? ??? 主函數 ? ? ? ? ?//*****************************************************/voidmain(){?beer=1; ?? //關閉蜂鳴器 led=1; ??? //關閉LED燈 timer1_init(0);? //初始化定時器1(未啟動定時器1) get_temperature(1); ?//首次啟動DS18B20獲取溫度(DS18B20上電后自動將EEPROM中的上下限溫度復制到TH和TL寄存器) while(1) ? ? { ? keyscan(); ?? ??get_temperature(0);???display(temp,temp_d*0。625); ?alarm();???? }}/*********************************************************************程序名;DS18B20頭文件*編程者:彭明闖*編程時間:2014/5/30*說明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數部分),temp_d*(測得的溫度小數部分),標志位f(測量溫度的標志位‘0’表示“正溫度"‘1’表*示“負溫度"),標志位f_max(上限溫度的標志位‘0’表示“正溫度”、‘1’表*示“負溫度”),標志位f_min(下限溫度的標志位‘0’表示“正溫度”、‘1'表*示“負溫度”),標志位w(報警標志位‘1’啟動報警‘0'關閉報警)。 ?*********************************************************************/#ifndef__ds18b20_h__ ???//定義頭文件#define__ds18b20_h__#defineuintunsignedint? #defineucharunsignedchar? ?sbitDQ=P2^3; ????//DS18B20接口sbitbeer=P1^0;??? ?//用beer表示P1.0sbitled=P1^1; ????? //用led表示P1。1uchartemp=0; ??//測量溫度的整數部分uchartemp_d=0; //測量溫度的小數部分bitf=0;? //測量溫度的標志位,0'表示“正溫度"‘1’表示“負溫度”)bitf_max=0; ???? //上限溫度的標志位‘0’表示“正溫度”‘1'表示“負溫度”)bitf_min=0; //下限溫度的標志位‘0’表示“正溫度”、‘1’表示“負溫度”)bitw=0;?? ? //報警標志位‘1’啟動報警‘0’關閉報警/******************************************************//* ? ? ?? 延時子函數 ?? ?????//*****************************************************/voidds18b20_delayus(uintt)//延時幾μs{while(t—-);}voidds18b20_delayms(uintt) ?//延時1ms左右{?uinti,j; for(i=t;i〉0;i——)?for(j=120;j〉0;j--);}/******************************************************//*? ? DS18B20初始化函數? ??????//*****************************************************/voidds18b20_init()??? {?ucharc=0;?DQ=1; DQ=0; ??? ? //控制器向DS18B20發低電平脈沖 ds18b20_delayus(80); ?//延時15—80μs?DQ=1;????? ?? ?//控制器拉高總線, while(DQ); ?? ???//等待DS18B20拉低總線,在60—240μs之間 ds18b20_delayus(150);? //延時,等待上拉電阻拉高總線 DQ=1; ? ???? ?//拉高數據線,準備數據傳輸;}/******************************************************//*????? DS18B20字節讀函數??? ? ?//*****************************************************/uchards18b20_read()??? { uchari; uchard=0;?DQ=1;? ????//準備讀; for(i=8;i〉0;i-—) { d>>=1; //低位先發; ?DQ=0; ?? ?? ? _nop_();??_nop_();?? ??DQ=1;? ????//必須寫1,否則讀出來的將是不預期的數據; if(DQ)? ?? ?//在12us處讀取數據; ?d|=0x80; ds18b20_delayus(10);? ??}?returnd;??? //返回讀取的值}/******************************************************//* ?? ? ???DS18B20字節寫函數 ?? ?//*****************************************************/voidds18b20_write(uchard)? {uchari;for(i=8;i>0;i—-){ DQ=0; ?DQ=d&0x01;??ds18b20_delayus(5); DQ=1; ??d〉>=1;}}/******************************************************//*? ? ? ?獲取溫度函數? ??? //*****************************************************/voidget_temperature(bitflag)? {?uchara=0,b=0,c=0,d=0;uinti; ?ds18b20_init();? ?? ds18b20_write(0xcc); ?//向DS18B20發跳過讀ROM命令?ds18b20_write(0x44);?? //寫啟動DS18B20進行溫度轉換命令,轉換結果存入內部RAM if(flag==1)?{? ?? //首次啟動DS18B20進行溫度轉換需要500ms,若轉換時間不夠就出錯,讀出的是85度的錯誤值。 display1(1); ? //用開機動畫耗時 }?else?ds18b20_delayms(1);? ? ds18b20_init(); ??ds18b20_write(0xcc);?? ? ds18b20_write(0xbe);? ? a=ds18b20_read();? ???//讀內部RAM(LSB)?b=ds18b20_read(); ? //讀內部RAM(MSB)?if(flag==1)?? ? //局部位變量f=1時讀上下線報警溫度?{ max=ds18b20_read();??//讀內部RAM(TH)?min=ds18b20_read();??//讀內部RAM(Tl)?? } if((max&0x80)==0x80) ?//若讀取的上限溫度的最高位(符號位)為‘1’表明是負溫度?{f_max=1;max=(max-0x80);}//將上限溫度符號標志位置‘1'表示負溫度,將上限溫度裝換成無符號數。 if((min&0x80)==0x80)???//若讀取的下限溫度的最高位(符號位)為‘1'表明是負溫度 {f_min=1;min=(min—0x80);}//將下限溫度符號標志位置‘1’表示負溫度,將下限溫度裝換成無符號數。? ?i=b; i>>=4; if(i==0) {f=0;? ??//i為0,正溫度,設立正溫度標記temp=((a>>4)|(b<<4));??//整數部分?a=(a&0x0f);?temp_d=a; ??? //小數部分 }?else { f=1;?? ?//i為1,負溫度,設立負溫度標記 a=~a+1;?b=~b;?temp=((a>〉4)|(b<〈4));?? ?//整數部分 a=(a&0x0f);??? ?//小數部分?temp_d=a; }}/******************************************************//*??? ?? ??存儲極限溫度函數????????//*****************************************************/voidstore_t(){ if(f_max==1)?? ?//若上限溫度為負,將上限溫度轉換成有符號數(最高位為1是負,為0是正) max=max+0x80; if(f_min==1) ????//若下限溫度為負,將上限溫度轉換成有符號數 min=min+0x80; ds18b20_init();?? ds18b20_write(0xcc); ? ds18b20_write(0x4e); //向DS18B20發寫字節至暫存器2和3(TH和TL)命令 ds18b20_write(max);???//向暫存器TH(上限溫度暫存器)寫溫度?ds18b20_write(min);???//向暫存器TL(下限溫度暫存器)寫溫度 ds18b20_write(0xff); //向配置寄存器寫命令,進行溫度值分辨率設置?ds18b20_init(); ??ds18b20_write(0xcc); ??ds18b20_write(0x48);? ?//向DS18B20發將RAM中2、3字節的內容寫入EEPROM}? ? //DS18B20上電后會自動將EEPROM中的上下限溫度拷貝到TH、TL暫存器/******************************************************//*? ? ? 溫度超限報警函數?? ? ?//*****************************************************/voidalarm(){? ? ? ??//若上限值是正值 if(f_max==0)?{?if(f_min==0)? ? //若下限值是正值? { ??if(f==0) ? ?//若測量值是正值 { ?if(temp〈=min||temp>=max)? ?{w=1;TR1=1;}??//當測量值小于最小值或大于最大值時報警 ? if((temp<max)&&(temp〉min)) ? {w=0;}? ? //當測量值大于最小值且小于最大值時不報警 ? }?? if(f==1){w=1;TR1=1;} //若測量值是負值時報警 }?if(f_min==1) ? //若下限值是負值? { ?if(f==0) ?? //若測量值是正值? {?? if(temp>=max)//當測量值大于最大值時報警? ?{w=1;TR1=1;} ?? if(temp<max)//當測量值小于最大值時不報警 ?? {w=0;}? }?? if(f==1) //若測量值是負值 ? {?? if(temp>=min)//當測量值大于最小值時報警? {w=1;TR1=1;}??? if(temp<min)//當測量值小于最小值時不報警??? {w=0;}?? }??} }?if(f_max==1)? //若下限值是負值?{?if(f_min==1)? ??//若下限值是負值 ?{ ??if(f==1)????//若測量值是負值 ??{ ? ?if((temp〈=max)||(temp〉=min))? ? {w=1;TR1=1;}??//當測量值小于最大值或大于最小值時報警 ?if((temp〈min)&&(temp>max))?? ?{w=0;}????//當測量值小于最小值且大于最大值時不報警 } if(f==0){w=1;TR1=1;} //若測量值是正值時報警? }?}?}#endif/***********************************************************************程序名;ds18b20keyscan函數*功能:通過鍵盤設定設定上下限報警溫度*編程者:彭明闖*編程時間:2014/5/30**********************************************************************/#ifndef__keyscan_H__ ? //定義頭文件#define__keyscan_H__ sbitkey1=P2^2; ??? sbitkey2=P2^1; ??? ?sbitkey3=P2^0; ??? ?sbitkey4=P3^3; ? ?uchari=0; //定義全局變量i用于不同功能模式的選擇,‘0’正常模式,‘1’上限調節模式,‘2’下限調節模式uchara=0; //定義全局變量a用于不同模式下數碼管顯示的選擇bit?k4=0; ? ??//K4按鍵雙功能選擇位,k4=0時K4按鍵選擇消按鍵音的功能,k4=1時K4按鍵選擇正負溫度設定功能bitv=0;?? ? ? //K2、K3按鍵雙功能選擇位,v=0時選擇上下限查看功能,v=1時選擇上下限溫度加減功能bitv1=0; ??? ?//v1=1時定時1250ms時間到自動關閉報警上下限查看功能bitv2=0; //消按鍵音功能調整位,為‘0'時開按鍵音,為‘1’時關按鍵音/******************************************************//* ??? ???讀鍵盤延時子函數 ? ?? ?//*****************************************************/voidkeyscan_delay(uintz)?? //延時1ms左右{uinti,j;for(i=z;i>0;i—-)?for(j=120;j>0;j--);}/******************************************************//* ? ????? ?溫度調節函數 ??? ?? ?//*****************************************************/inttemp_change(intcount,bitf) //上下限溫度調整{if(key2==0)? ? ?//判斷K2是否按下 {? ?? ? if(v2==0)beer=0; ??//v2=0開按鍵音,否則消按鍵音 ?keyscan_delay(10);???//延時10ms? if(key2==0) ? ?//再次判斷K2是否按下(實現按按鍵時消抖) {????beer=1;? ? //K2按下關按鍵音 if(f==0)??? //若溫度為正 {? count++;? //每按一下K2溫度上調1 ?if(a==1){if(count〉125)count=125;}//當溫度值大于125時不上調?? if(a==2){if(count>125)count=125;}??} ?if(f!=0) ??? //若溫度為負 ?{ ?? count++; ? //每按一下K2溫度下調1 ??if(a==1){if(count>55)count=55;}//當溫度值小于-55時不再下調 ?if(a==2){if(count〉55)count=55;}? }? }? while(key2==0); ? //K2松開按鍵時消抖??keyscan_delay(10); ?} if(key3==0) { if(v2==0)beer=0; ?keyscan_delay(10); ?if(key3==0) ? ?//K3按按鍵時消抖 {? beer=1;?? count——; ??//每按一下K3溫度為正時下調1,為負時上調1 if(a==1){if(count<0)count=0;}//當溫度值達到0時不再調? if(a==2){if(count<0)count=0;}? ?}??while(key3==0); ?keyscan_delay(10);? //K3松開按鍵時消抖? } returncount;}/******************************************************//* ? ?? ?讀鍵盤函數? ? ???//*****************************************************/voidkeyscan(){ if(key1==0) {?if(v2==0)beer=0;??keyscan_delay(10);? if(key1==0)???? //K1按按鍵時消抖 {??beer=1;? TR1=1; ?? //開定時器1,通過s標志位的變化,實現在上下限溫度調整時溫度顯示時閃爍的功能 ??k4=1;??? ?//在上下溫度調節功能模式下選擇K4的調整上下限溫度正負的功能 v=1;? ? //在上下溫度調節功能模式下選擇K2、K3的溫度加減功能 i++;? ? //K1按一下i加1,i=‘0’進入正常模式,i=‘1'進入調上限模式,i=‘2’進入調下限模式??if(i>2) ? //K1按下三次后退出調節模式 { i=0;?????//進入正常模式 ? TR1=0; //關定時器1? k4=0; ? //在正常模式下選擇K4的消按鍵音功能 v=0;? ??//在正常模式下選擇K2、K3的查看上下限報警溫度功能 ??store_t(); ? //存儲調整后的上下限報警溫度 ?} ? ?switch(i) //顯示選擇 ?{??case0:a=0;break;?//a=0選擇顯示測得的溫度? case1:a=1;break;//a=1選擇顯示上限溫度???case2:a=2;break;//a=2選擇顯示下限溫度? default:break; ?}? ? } while(key1==0); ?? //K1松按鍵時消抖? keyscan_delay(10); ??} if(a==1&&v==1) //a=1選擇顯示上限溫度且v=1時選擇上下限溫度加功能?{led=0;max=temp_change(max,f_max);}//顯示上限溫度 elseif(a==2&&v==1)??? //a=2選擇顯示下限溫度且v=1時選擇上下限溫度減功能?{led=1;min=temp_change(min,f_min);} else; if(k4==1) ? ? //k4=1時K4按鍵選擇正負溫度設定功能?{ ?if(key4==0)??{??if(v2==0)beer=0; ??keyscan_delay(5);? if(key4==0) { beer=1; ??if(a==1)???{if(max〉55)f_max=0;elsef_max=~f_max;}//當溫度大于55度時,只能設定為正溫度? ?if(a==2) ?{if(min>55)f_max=0;elsef_min=~f_min;}//當溫度大于55度時,只能設定為正溫度 ?? ? ?} while(key4==0); keyscan_delay(10);??}?}??if(v==0) ? //v=0時選擇上下限查看功能 { ?if(key2==0)? { if(v2==0)beer=0; ?keyscan_delay(10); ?if(key2==0)???{ beer=1; ?a=1;? ??//選擇上限顯示 ? TR1=1;?? ?//開定時器1開始定時一分鐘左右 ?s1=1;? ?//上限顯示不閃爍,顯示一分鐘左右自動退出?? } ??while(key2==0);? ?keyscan_delay(10); ??? }? if(key3==0) { if(v2==0)beer=0; ?keyscan_delay(10); if(key3==0)? { ? beer=1;? ?a=2;? ? ?//選擇下限顯示 ?TR1=1; ? //開定時器1開始定時1s? ?s1=1;? ? //下限顯示不閃爍,顯示1s自動退出? ? }?? while(key3==0); ?keyscan_delay(10); ?? }? if(v1==1)?? ?//v1=1時定時1s時間到自動關閉報警上下限查看功能 ?{a=0;v1=0;TR1=0;} ?//a=0顯示實測溫度,v1清零,關定時器1 ?if(k4==0)? //k4=0時K4按鍵選擇消按鍵音的功能??{???? ??? if(key4==0) ? { ??if(v2==0)beer=0;? keyscan_delay(10); ???if(key4==0)? ?{ ???beer=1; ? v2=~v2;???//為‘0’時開按鍵音,為‘1'時關按鍵音 ? ?? }?? ?while(key4==0); ?? keyscan_delay(10);? }??? } }}#endif/***********************************************************************程序名;ds18b20數碼管動態顯示頭文件*功能:通過定時器0延時是數碼管動態顯示*編程者:彭明闖*編程時間:2014/5/30**********************************************************************/#ifndef__ds18b20_display_H__ ?#define__ds18b20_display_H__#defineuintunsignedint?? //變量類型宏定義,用uint表示無符號整形(16位)#defineucharunsignedchar //變量類型宏定義,用uchar表示無符號字符型(8位)sbitwei1=P2^4;? ??? //可位尋址變量定義,用wei1表示P2.4口sbitwei2=P2^5; ? ? //用wei2表示P2.5口sbitwei3=P2^6;? ??//用wei3表示P2.6口sbitwei4=P2^7; ???//用wei4表示P2.7口ucharnum=0;? ? ?//定義num為全局無符號字符型變量,賦初值為‘0’ucharcodetemperature1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};?//定義顯示碼表0~9ucharcodetemperature2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};?//帶小數點的0~9.ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38}; //依次是‘不顯示'‘.’‘-’‘H’‘L'/******************************************************//*?? ??? ? 延時子函數? ? ?? ?//*****************************************************/voiddisplay_delay(uintt) ?//延時1ms左右{ uinti,j; for(i=t;i>0;i--)?for(j=120;j>0;j——);}/******************************************************//*?? ? ?? 定時器1初始化函數? ?? //*****************************************************/voidtimer1_init(bitt){TMOD=0x10; ? TH0=0x3c; ? ?TL0=0xb0; ??EA=1;?? ? ??ET1=1; ?? TR1=t;????? //局部變量t為1啟動定時器1,為0關閉定時器1}/******************************************************//* ? ? ???定時器1中斷函數???? //*****************************************************/voidtimer1()interrupt3{TH0=0x3c;? ?? //重新賦初值,定時50msTL0=0xb0; num++; ? ?? //每進入一次定時器中斷num加1(每50ms加1一次)if(num〈5)?{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}} ??? ?else ? ??//進入4次中斷,定時200ms時若報警標志位w為‘1'則啟動報警,不為‘1'不啟動 ??? ?? ? //實現間歇性報警功能 {s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num〉20) ?? //進入20次中斷,定時1s{?num=0; ? ?//num歸0,重新定開始定時1s?s1=0;? ? ? //定時1s時間到時自動關閉報警上下限顯示功能?v1=1;? ??//定時1s時間到時自動關閉報警上下限查看功能} }/******************************************************//*? ? ? 調整報警上下限選擇函數 ????//*****************************************************/voidselsct_1(ucharf,uchark)?//消除百位的0顯示,及正負溫度的顯示選擇{if(f==0)? ???? ??//若為正溫度,百位為0則不顯示百位,不為0則顯示?{? if(k/100==0)P0=temperature3[0]; ?elseP0=temperature1[k/100]; } if(f==1) ??//若為負溫度,若十位為0,百位不顯示,否則百位顯示‘-' {?if(k%100/10==0)P0=temperature3[0];??elseP0=temperature3[2];?}}voidselsct_2(bitf,uchark) ?//消除十位的0顯示,及正負溫度的顯示選擇{if(f==0)??? ?? //若為正溫度,百位十位均為0則不顯示十位,否則顯示十位 { ?if((k/100==0)&&(k%100/10==0)) P0=temperature3[0];??elseP0=temperature1[k%100/10]; } if(f==1) ?? ? ??//若為負溫度,若十位為0,十位不顯示,否則十位顯示‘-’?{?if(k%100/10==0)P0=temperature3[2];? elseP0=temperature1[k%100/10]; } }/******************************************************//*? ?? ?? ?主函數顯示? ?? ??? //*****************************************************/voiddisplay(uchart,uchart_d)?//用于實測溫度、上限溫度的顯示{uchari;for(i=0;i〈4;i++)?? //依次從左至右選通數碼管顯示,實現動態顯示{? switch(i) { case0:?? //選通第一個數碼管? wei2=1; //關第二個數碼管??wei3=1; ???//關第三個數碼管 wei4=1;? ??//關第四個數碼管 wei1=0;????//開第一個數碼管 ?? if(a==0){selsct_1(f,t);}//若a=0則在第一個數碼管上顯示測量溫度的百位或‘-’ ?if(a==1)??{ ?P0=temperature3[3];//若a=1則在第一個數碼管上顯示‘H’ ?}??if(a==2)? { ? P0=temperature3[4];//若a=2則在第一個數碼管上顯示‘L’??}??? ? break; case1: ?? //選通第二個數碼管 ?wei1=1; ? ?wei3=1;??wei4=1;???wei2=0;????if(a==0){selsct_2(f,t);}//若a=0則在第二個數碼管上顯示測量溫度的十位或‘-' if(a==1)??? ?? //若a=1則在第二個數碼管上顯示上限報警溫度的百位或‘—’ ?{??if(s==0)selsct_1(f_max,max);//若s=0則顯示第二個數碼管,否則不顯示??elseP0=temperature3[0];??//通過s標志位的變化實現調節上下限報警溫度時數碼管的閃爍??if(s1==1)selsct_1(f_max,max);//若s1=1則顯示第二個數碼管(s1標志位用于上下限查看時的顯示)? } ?if(a==2) ? ??? //若a=2則在第二個數碼管上顯示下限報警溫度的百位或‘-’? { if(s==0)selsct_1(f_min,min);??elseP0=temperature3[0]; if(s1==1)selsct_1(f_min,min); } ? ?? ???break; case2:????? ???//選通第三個數碼管 ?wei1=1;??wei2=1; ??wei4=1; ? wei3=0; ? if(a==0){P0=temperature2[t%10];}//若a=0則在第三個數碼管上顯示測量溫度的個位??if(a==1)?? ???? ?//若a=1則在第三個數碼管上顯示上限報警溫度的十位或‘-’? {? if(s==0)selsct_2(f_max,max);//若s=0則顯示第三個數碼管,否則不顯示? elseP0=temperature3[0];? ?if(s1==1)selsct_2(f_max,max);//若s1=1則顯示第三個數碼管 ?} if(a==2)? ?? ? ?? //若a=2則在第三個數碼管上顯示下限報警溫度的十位或‘-’? {? if(s==0)selsct_2(f_min,min);? ?elseP0=temperature3[0]; ? if(s1==1)selsct_2(f_min,min); } ?? ????? ?break;?case3: ?? //選通第四個數碼管? wei1=1; ??wei2=1; ? wei3=1; ?wei4=0; ? ?if(a==0){P0=temperature1[t_d];}//若a=0則在第四個數碼管上顯示測量溫度的小數位 ?if(a==1)? ??? ?//若a=1則在第四個數碼管上顯示上限報警溫度的個位??{??if(s==0)P0=temperature1[max%10];//若s=0則顯示第四個數碼管,否則不顯示 ?elseP0=temperature3[0]; ?if(s1==1)P0=temperature1[max%10];//若s1=1則顯示第四個數碼管 }? if(a==2)? ?? ?? ?//若a=2則在第四個數碼管上顯示下限報警溫度的個位 ?{? if(s==0)P0=temperature1[min%10];? ?elseP0=temperature3[0];? ?if(s1==1)P0=temperature1[min%10];? } ? ???? ?? ??break; ??}?display_delay(10);? ?//每個數碼管顯示3ms左右 }?}/******************************************************//* ? ??? 開機顯示函數??? ? ????//*****************************************************/voiddisplay1(uintz)?? //用于開機動畫的顯示{uchari,j;bitf=0;for(i=0;i〈z;i++) ?//‘z’是顯示遍數的設定{ ? for(j=0;j<4;j++)??//依次從左至右顯示‘-’?{ switch(j) {?? case0: wei2=1; ?wei3=1; ? wei4=1;? wei1=0;break;?? ?P0=temperature3[2];//第一個數碼管顯示???case1:? wei1=1; ? ??wei3=1; ??wei4=1;?? ?wei2=0;break; ?? P0=temperature3[2];//第二個數碼管顯示???case2:? wei1=1; ? wei2=1; ??wei4=1; ? wei3=0;break; ?? P0=temperature3[2];//第三個數碼管顯示? ?case3:?? wei1=1; ? wei2=1; ?? wei3=1; wei4=0;break;? ? ?P0=temperature3[2];//第四個數碼管顯示 ?}? display_delay(400);?//每個數碼管顯示200ms左右 }?? }}#endif六、參考文獻(1).郭天祥.51單片機c語言教程.電子工業出版社。2009.12(2).李群芳.單片微型計算機與接口技術。電子工業出版社。2012。12摘要近年來,隨著科技的飛速發展,單片機的應用正在不斷深入,同時帶動傳統控制檢測技術日益更新.在實時檢測和自動控制的單片機應用系統中,單片機往往作為一個核心部件來使用,正在不斷的應用到實際生活中,并且根據具體硬件結構軟硬件結合,加以完善。十字路口車輛穿梭,行人熙攘,車行車道,人行人道,有條不紊.那么靠什么來實現這井然秩序呢?靠的就是交通信號燈的自動指揮系統。交通信號燈控制方式很多。本系統采用MCS-51系列單片機STC89C51為中心器件來設計交通燈控制器,實現了通過信號燈對路面狀況的智能控制。從一定程度上解決了交通路口堵塞、車輛停車等待時間不合理、急車強通等問題。系統具有結構簡單、可靠性高、成本低、實時性好、安裝維護方便等優點,有廣泛的應用前景。關鍵詞:交通燈單片機數碼管一.總體設計思路1.1設計目的及思路設計目的了解交通燈管理的基本工作原理,熟練掌握STC89C51的工作原理和應用編程,熟悉STC89C51單片機并行接口的各種工作方式和應用,并了解計數器/定時器的工作方式和應用編程外部中斷的方法,掌握多位LED顯示問題的解決。設計思路(1)分析目前交通路口的基本控制技術,提出自己的交通控制的初步方案.(2)確定系統交通控制的總體設計,增加了倒計時顯示提示。(3)進行顯示電路.(4)進行軟件系統的設計。1.2實際交通燈顯示時序及狀態轉換的理論分析圖1所示為紅綠燈轉換的狀態圖。S2S1S2S1S4S3S4S3圖1紅綠燈狀態轉換圖狀態S1S2S3S4時間30s5s30s5s東西道紅燈亮紅燈亮綠燈亮黃燈亮南北道綠燈亮黃燈亮紅燈亮紅燈亮表1十字路口指示燈燃亮方案說明:(1)當東西方向為紅燈,此道車輛禁止通行,東西道行人可通過;南北道為綠燈,此道車輛通過,行人禁止通行。時間為60秒。(2)黃燈閃爍5秒,警示車輛和行人紅、綠燈的狀態即將切換.(3)當東西方向為綠燈,此道車輛通行;南北方向為紅燈,南北道車輛禁止通過,行人通行。時間為80秒.東西方向車流大通行時間長。(4)這樣如上表的時間和紅、綠、黃出現的順序依次出現這樣行人和車輛就能安全暢通的通行。(5)此表可根據車流量動態設定紅綠燈初始值。共四種狀態,分別設定為S1、S2、S3、S4,交通燈以這四種狀態為一個周期,循環執行如下圖所示:圖2交通燈狀態循環圖圖2交通燈狀態循環圖程序就是在上述四種狀態下循環轉化的。一個周期四個狀態,在正常模式下共花費1分10秒。二.具體設計方案2.1方案要求:本設計要求與交通信號實際控制一致,采用LED模擬信號燈,信號燈分東西、南北二組,分別有紅、黃、綠三色。其工作狀態由程序控制,啟動、停止按鈕分別控制信號燈的啟動與停止。白天/黑夜轉換開關可對信號進行控制轉換。并且要求能用兩位數碼管(或者一位數碼管)來顯示紅燈或者綠燈等待的時間,在黃燈的時候數碼管不顯示。信號燈的控制要求如下:⑴假設東西方向交通繁忙為主干道,車流量為南北交通的兩倍.因此東西方向的綠燈通行時間為是南北方向上的兩倍。⑵開始時東西方向綠燈先亮,南北為紅燈。⑶按下啟動按鈕開始工作,,按下停止按鈕,停止工作.白天/黑夜轉換開關閉合時為黑夜工作狀態,這時只有黃燈來回閃爍,斷開為白天工作狀態。白天工作狀態要求:東西方向綠燈亮40s,然后黃燈閃三下(1下/秒,共5秒),然后紅燈亮20s,而南北方向為紅燈亮40s然后綠燈亮20s,然后黃燈也閃三下;如此周期循環下去。示意圖2。2方案分析根據十字路口交通燈的要求,可將本系統分為三個模塊,第一模塊是控制模塊,主要負責整個系統的控制和運算,從而使各模塊正常工作,第二個模塊式顯示模塊包括LED燈和數碼管;第三是電源模塊,給各模塊提供電源,讓各模塊工作。其系統設計結構如圖:圖3.系統設計結構圖圖3.系統設計結構圖2。389C51單片機引腳功能說明89C51外部引腳圖:(可以直接拷入ASM程序文件中,作注釋使用,十分方便)
┏━┓┏━┓
P1.0
┫1┗┛40┣
Vcc?
P1.1
┫2
39┣
P0.0
P1.2
┫3
38┣
P0.1
?
P1。3
┫4
37┣
P0。2
P1.4
┫5
36┣
P0.3
P1.5
┫6
35┣
P0.4
P1.6
┫7
34┣
P0.5
?
P1。7
┫8
33┣
P0。6
?
RST/Vpd
┫9
32┣
P0.7
?
RXDP3.0
┫10
31┣
—EA/Vpp(內1/外0程序地址選擇)?
TXDP3.1
┫11
30┣
ALE/—P(地址鎖存輸出)?-INT0P3.2
┫12
29┣
-PSEN
(外部程序讀選通輸出)
-INT1P3。3
┫13
28┣
P2。7
?
T0
P3.4
┫14
27┣
P2。6
T1
P3.5
┫15
26┣
P2.5
—WRP3。6
┫16
25┣
P2。4
?
-RDP3.7
┫17
24┣
P2。3
?
X2
┫18
23┣
P2。2
?
X1
┫19
22┣
P2.1
GND
┫20
21┣
P2.0
?
┗━━━━┛引腳說明:?
①電源引腳?
Vcc(40腳):典型值+5V.
Vss(20腳):接低電平.?
②外部晶振?
X1、X2分別與晶體兩端相連接。當采用外部時鐘信號時,X2接振蕩信號,X1接地
③輸入輸出口引腳:
P0口:I/O雙向口。作輸入口時,應先軟件置“1”。
P1口:I/O雙向口。作輸入口時,應先軟件置“1”。?
P2口:I/O雙向口。作輸入口時,應先軟件置“1"。
P3口:I/O雙向口.作輸入口時,應先軟件置“1”。
④控制引腳:?
RST/Vpd、ALE/—PROG、—PSEN、-EA/Vpp組成了MSC-51的控制總線。
RST/Vpd(9腳):復位信號輸入端(高電平有效).
第二功能:加+5V備用電源,可以實現掉電保護RAM信息不丟失。?
ALE/-PROG(30腳):地址鎖存信號輸出端。
第二功能:編程脈沖輸入.?
—PSEN(29腳):外部程序存儲器讀選通信號.?
—EA/Vpp(31腳):外部程序存儲器使能端。?
第二功能:編程電壓輸入端(+21V).圖6.單片機8051的內部結構圖6.單片機8051的內部結構2.4單片機最小系統時鐘電路圖7.時鐘電路XTAL1是片內振蕩器的反相放大器輸入端,XTAL2則是輸出端,使用外部振蕩器時,外部振蕩信號應直接加到XTAL1,而XTAL2懸空.內部方式時,時鐘發生器對振蕩脈沖二分頻,如晶振為12MHz,時鐘頻率就為6MHz.晶振的頻率可以在1MHz-24MHz內選擇。電容取30PF左右.系統的時鐘電路設計是采用的內部方式,即利用芯片內部的振蕩電路。AT89單片機內部有一個用于構成振蕩器的高增益反相放大器。引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外晶體諧振器一起構成一個自激振蕩器。外接晶體諧振器以及電容C1和C2構成并聯諧振電路,接在放大器的反饋回路中.對外接電容的值雖然沒有嚴格的要求,但電容的大小會影響震蕩器頻率的高低、震蕩器的穩定性、起振的快速性和溫度的穩定性。因此,此系統電路的晶體振蕩器的值為12MHz,電容應盡可能的選擇陶瓷電容,電容值約為22μF.在焊接刷電路板時,晶體振蕩器和電容應盡可能安裝得與單片機芯片靠近,以減少寄生電容,更好地保證震蕩器穩定和可靠地工作。復位電路在振蕩器運行時,有兩個機器周期(24個振蕩周期)以上的高電平出現在此引腿時,將使單片機復位,只要這個腳保持高電平,51芯片便循環復位.復位后P0-P3口均置1引腳表現為高電平,程序計數器和特殊功能寄存器SFR全部清零.當復位腳由高電平變為低電平時,芯片為ROM的00H處開始運行程序.復位是由外部的復位電路來實現的。片內復位電路是復位引腳RST通過一個斯密特觸發器與復位電路相連,斯密特觸發器用來抑制噪聲,它的輸出在每個機器周期的S5P2,由復位電路采樣一次。復位電路通常采用上電自動復位和按鈕復位兩種方式,此電路系統采用的是上電與按鈕復位電路。當時鐘頻率選用6MHz時,C取22μF,Rs約為200Ω,Rk約為1K。復位操作不會對內部RAM有所影響.常用的復位電路如下圖所示:圖8.復位電路圖顯示電路顯示器普遍地用于直觀地顯示數字系統的運行狀態和工作數據,按照材料及產品工藝,單片機應用系統中常用的顯示器有:發光二極管LED顯示器、液晶LCD顯示器、CRT顯示器等。LED數碼管是現在最常用的顯示器之一。發光二極管(LED)由特殊的半導體材料砷化鎵、磷砷化鎵等制成,可以單獨使用,也可以組裝成分段式或點陣式LED顯示器件(半導體顯示器)。分段式顯示器(LED數碼管)由7條線段圍成8字型,每一段包含一個發光二極管。外加正向電壓時二極管導通,發出清晰的光。只要按規律控制各發光段亮、滅,就可以顯示各種字形或號。LED數碼管有共陽、共陰之分。本系統采用的是兩位共陰極數碼管三.電路圖和程序圖10.交通燈電路圖具體程序:#include<REG51.H>#defineucharunsignedchar#defineuintunsignedintuintnum,shi,ge;sbitred=P1^0;sbityel=P1^1;sbitgre=P1^2;? voiddelay(){uinta;for(a=500;a〉0;a-—);? }ucharcodearry_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidinitial(){EA=1;ET0=1;TMOD=0x01;TH0=0x4c;TL0=0xd0;}voiddisplay(intY){shi=Y/10;ge=Y%10;TR0=1;while(shi|ge!=0){P2=0xfe;P3=arry_duan[shi];delay();P2=0xfd;P3=?arry_duan[ge];delay();}TR0=0;}voidtimer0()interrupt1{TH0=0x4c;TL0=0xd0;num++;if(num==20){num=0;ge-—;if(ge==-1){ge=9;shi—-;}}}main(){initial();while(1){red=0;yel=0;gre=1;display(40);red=0;yel=1;gre=0;display(3);red=1;yel=0;gre=0;display(20);red=0;yel=1;gre=0;display(3);}}程序編譯和。hex文件創建截圖仿真截圖四.實驗心得體會通過本次試驗我復習了單片機程序的編寫,電路的連接以及程序的調試仿真,更加深刻的感受到了單片機的強大功能,通過實驗也加強了動手操作的能力,和同學一起更加懂得了相互合作的重要性,以后我會更加努力的把本專業知識學好學精,爭取為國家做到屬于自己應做的奉獻。五.課程設計參考資料1.《電子系統綜合設計》郭勇北京大學出版社2.《數字電子技術基礎》閻石高教出版社3.《模擬電子技術基礎》童詩白高教出版社4.《單片機原理及應用》張毅剛高等教育出版社單片機原理及系統課程設計評語:考勤10分守紀10分過程30分設計報告30分答辯20分總成績(100)專業:自動化班級:姓名:學號:指導教師:蘭州交通大學自動化與電氣工程學院2015年12月30日基于單片機的16鍵電子琴一、電子琴設計的目的、要求與設計方法1.1設計目的現代樂器中,電子琴是高新科技在音樂領域的一個代表,體現了人類電子技術和藝術的完美結合。電子琴自動伴奏的穩定性、準確性,以及鮮明的強弱規律、隨人設置的速度要求,都更便于人們由易到難、深入淺出的準確掌握歌曲節奏和樂曲風格,對其節奏的穩定性和準確性訓練能起到非常大的作用.1.2設計要求本設計主要是用AT89C52單片機為核心控制元件,設計一個微縮版的電子琴。單片機與按鍵構成主控制模塊,在主控制模塊上設置有9個按鍵,分別達成不同目標。本系統主要為了完成電子琴的三大功能:電子琴彈奏和音樂播放及錄音。1。3電子琴設計方法1.3。1設計工具表1軟件簡介軟件名稱設計作用KeiluVision4編寫程序與編譯PROTEUS繪制硬件電路圖、數字仿真MicrosoftVisio繪制程序流圖與框圖1。3.2設計思路(1)功能按鍵觸發外部中斷,以完成不同曲目的的切換。(2)設置定時器產生不同頻率的方波,I/O口輸出,經功放后揚聲器發聲.(3)采用4×4矩陣鍵盤彈奏16個音(低XI到高DO).電子琴的設計方案及原理2.1設計總體方案本系統采用AT89C52為主控芯片.輸入電路有16個琴鍵按鍵,通過按鍵隨意按下所要表達的音符,作為電平送給主體電路,中央處理器通過識別,解碼輸出音符,在揚聲器中發出有效的聲音。1個音樂按鍵用于播放音樂和切換歌曲,通過按鍵觸發中斷,重置定時器初值,于另一個揚聲器中發出有效音響.總設計框圖如下圖1所示.單單片機時鐘復位電路時鐘復位電路數碼管顯示電路數碼管顯示電路琴鍵控制電路琴鍵控制電路音頻播放電路音頻播放電路音樂切換電路音樂切換電路圖1基于單片機的電子琴電路原理框圖2。2發聲原理利用AT89C52的內部定時器使其工作計數器模式(MODE1)下,改變計數值TH0及TL0以產生不同頻率的方法產生不同音階,例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計數器計時956μs/1μs=956,每計數956次時將I/O反相,就可得到中音DO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期貨市場交易心理學的應用研究考核試卷
- 耐火土石礦山環境保護與綠色開采技術應用考核試卷
- 紙質戶外廣告材料設計與制造考核試卷
- 無線廣播電視傳輸中的信號傳輸信號覆蓋優化方法考核試卷
- 森林經營與管護的森林采伐與土地管理考核試卷
- 天津理工大學《媒介批評與文化影響》2023-2024學年第一學期期末試卷
- 珠海三中高二下學期期中考試文科化學試題
- 山東省菏澤市名校2025屆新初三開學摸底考(全國I卷)化學試題含解析
- 四川長江職業學院《計算機地圖制圖》2023-2024學年第二學期期末試卷
- 山東工業職業學院《體育游戲組織與編創》2023-2024學年第二學期期末試卷
- 中國食物成分表2020年權威完整改進版
- 社區體檢合同范例
- 招標師《招標采購項目管理》近年考試真題題庫(含答案解析)
- 杰之緣時尚服裝店雙十二活動策劃方案
- 早產兒視網膜病預防管理專家共識(2024)解讀
- 特種設備日管控、周排查、月調度模板
- 國開(遼寧)2024年《書法鑒賞》形考作業1-4答案
- 裝配式建筑的發展現狀和面臨的挑戰研究
- 《幼兒良好生活習慣培養的探究》8700字(論文)
- 《北京二年級下學期數學期中試卷全攻略》
- 第六單元 資本主義制度的初步確立 復習課件 2024-2025學年統編版九年級歷史上冊
評論
0/150
提交評論