本人的課程設(shè)計(jì),和大家分享分享,多謝大家的指導(dǎo)和建議!
后面的附件有完整的工程文件、實(shí)習(xí)報(bào)告、仿真文件和部分誤差分析(完整的交給老師了,所有要求均滿足,誤差很。
一、課程設(shè)計(jì)內(nèi)容及基本要求利用單片機(jī)IO口作輸出,通過(guò)定時(shí)器的周期性中斷輸出一個(gè)占空比可調(diào)、頻率可調(diào)的簡(jiǎn)易方波信號(hào)發(fā)生器,具體要求如下:
1、完成頻率范圍為0.1Hz~5KHz的方波發(fā)生器,要求如下:
(1)占空比5%~95%連續(xù)可調(diào);
(2)可鍵盤輸入信號(hào)發(fā)生的頻率。
2、可完成脈寬范圍為100μs~1s的脈沖信號(hào)發(fā)生器,要求如下:
(1)可鍵盤輸入發(fā)生脈沖寬度;
(2)每按一次觸發(fā)鍵,可發(fā)出一個(gè)單脈沖。
3、根據(jù)已經(jīng)描述的C語(yǔ)言控制程序,運(yùn)用Proteus畫出硬件連接圖,并將運(yùn)用C語(yǔ)言描述的程序下載到Proteus虛擬單片機(jī)中,在Proteus中實(shí)現(xiàn)“簡(jiǎn)易方波信號(hào)發(fā)生器”的各項(xiàng)功能。
目錄
一、Proteus仿真
1、仿真電路圖
2、0.1HZ波形
3、5KHZ波形
4、10%占空比波形(10HZ)
5、90%占空比波形(10HZ)
6、工程文件框架
二、主程序部分
1、主函數(shù)
2、定時(shí)器初始化函數(shù)及中斷服務(wù)函數(shù)
三、頂層驅(qū)動(dòng)文件
1、頂層驅(qū)動(dòng) .C 文件
2、頂層驅(qū)動(dòng) .H 文件
四、底層驅(qū)動(dòng)文件
1、矩陣按鍵
1.1 矩陣按鍵 .C 文件
1.2 矩陣按鍵 .H 文件
2、四段數(shù)碼管
2.1 四段數(shù)碼管.C 文件
2.2 四段數(shù)碼管.H 文件
一、 Proteus仿真1、仿真電路圖2、0.1HZ波形3、5KHZ波形4、10%占空比波形(10HZ)5、90%占空比波形(10HZ)6、工程文件框架
二、主要程序部分
主要是根據(jù)不同頻率段分不同的最小計(jì)數(shù)時(shí)長(zhǎng)
/******************************************************************************* * FunctionName : Function_1_Serve * Description : 模式1服務(wù)函數(shù) 定時(shí)器0單位定時(shí)周期配置 * Input : None * Output : None * Return : None *******************************************************************************/ void Function_1_Serve(void) { float temp = 0.0; temp = Calculate_Data();//計(jì)算方波頻率 /*對(duì)應(yīng)不同頻率段 設(shè)置不同的單位定時(shí)器周期*/ if(temp<=1) TIMEO = 10000; else if(temp<=10) TIMEO = 1000; else if(temp<=100) TIMEO = 100; else if(temp<=1000) TIMEO = 50; else if(temp<=10000) TIMEO = 20; switch(TIMEO)// 設(shè)置不同的單位定時(shí)器周期 { /*0.1hz-1hz*/ case 10000: TIMEO_H = 0xdc;TIMEO_L = 0x00; time0_all_num=100/temp;time0_high_num=time0_low_num=time0_all_num/2;break; /*1hz-10hz*/ case 1000: TIMEO_H = 0xfc;TIMEO_L = 0x75; time0_all_num=1000/temp;time0_high_num=time0_low_num=time0_all_num/2;break; /*10hz-100hz*/ case 100: TIMEO_H = 0xff;TIMEO_L = 0xb2; time0_all_num=10000/temp;time0_high_num=time0_low_num=time0_all_num/2;break; /*100hz-1000hz*/ case 50: TIMEO_H = 0xff;TIMEO_L = 0xdf; time0_all_num=20000/temp;time0_high_num=time0_low_num=time0_all_num/2;break; /*1000hz-10khz*/ case 20: TIMEO_H = 0xff;TIMEO_L = 0xff; time0_all_num=23000/temp;time0_high_num=time0_low_num=time0_all_num/2;break; default:break; } } /******************************************************************************* * FunctionName : Function_3_Serve * Description : 模式3服務(wù)函數(shù) 定時(shí)器1單位定時(shí)周期配置 * Input : None * Output : None * Return : None *******************************************************************************/ void Function_3_Serve(void) { float temp = 0.0; temp = Calculate_Data(); time1_all_num = (uint)temp; TIME1_H = ((65536-80)/256); TIME1_L = ((65536-80)%256); } /******************************************************************************* * FunctionName : Time_Init * Description :系統(tǒng)定時(shí)器初始化 * Input : None * Output : None * Return : None *******************************************************************************/ voidTime_Init(void) { TMOD = 0X11; TR0 = 0; TR1 = 0; ET0 = 1; ET1 = 1; EA = 1; } /******************************************************************************* * FunctionName : Time0(void) interrupt 1 * Description :定時(shí)器0中斷服務(wù)函數(shù) * Input : None * Output : None *******************************************************************************/ void Time0(void)interrupt 1 { TH0 = TIMEO_H; TL0 = TIMEO_L; time0_num++; //記錄一個(gè)周期進(jìn)入定時(shí)器中斷的次數(shù) if(time0_num > time0_high_num) //輸出口由高電平跳變?yōu)榈碗娖?/font> OUTPUT=0; if(time0_num > time0_all_num) //輸出口由低電平跳變?yōu)楦唠娖?/font> { OUTPUT=1; time0_num = 0; } } /******************************************************************************* * FunctionName : Time1(void) interrupt 3 * Description : 定時(shí)器1中斷服務(wù)函數(shù) * Input : None * Output : None *******************************************************************************/ void Time1(void)interrupt 3 { TH1 = TIME1_H; TL1 = TIME1_L; time1_num++; //記錄進(jìn)入定時(shí)器中斷的次數(shù) if(time1_all_num>time1_num) //輸出口由高電平跳變?yōu)榈碗娖?/font> OUTPUT = 1; if(time1_all_num<time1_num) //輸出口由低電平跳變?yōu)楦唠娖?/font> { OUTPUT = 0; time1_num = 0; TR1 = 0;//高電平輸出結(jié)束 關(guān)閉定時(shí)器 } }
全部資料51hei下載地址:
單片機(jī)課程設(shè)計(jì).rar
(2.1 MB, 下載次數(shù): 169)
2019-1-9 21:17 上傳
點(diǎn)擊文件名下載附件
完整工程
|