本人的課程設計,和大家分享分享,多謝大家的指導和建議!
后面的附件有完整的工程文件、實習報告、仿真文件和部分誤差分析(完整的交給老師了,所有要求均滿足,誤差很小)
一、課程設計內容及基本要求利用單片機IO口作輸出,通過定時器的周期性中斷輸出一個占空比可調、頻率可調的簡易方波信號發生器,具體要求如下:
1、完成頻率范圍為0.1Hz~5KHz的方波發生器,要求如下:
(1)占空比5%~95%連續可調;
(2)可鍵盤輸入信號發生的頻率。
2、可完成脈寬范圍為100μs~1s的脈沖信號發生器,要求如下:
(1)可鍵盤輸入發生脈沖寬度;
(2)每按一次觸發鍵,可發出一個單脈沖。
3、根據已經描述的C語言控制程序,運用Proteus畫出硬件連接圖,并將運用C語言描述的程序下載到Proteus虛擬單片機中,在Proteus中實現“簡易方波信號發生器”的各項功能。
目錄
一、Proteus仿真
1、仿真電路圖
2、0.1HZ波形
3、5KHZ波形
4、10%占空比波形(10HZ)
5、90%占空比波形(10HZ)
6、工程文件框架
二、主程序部分
1、主函數
2、定時器初始化函數及中斷服務函數
三、頂層驅動文件
1、頂層驅動 .C 文件
2、頂層驅動 .H 文件
四、底層驅動文件
1、矩陣按鍵
1.1 矩陣按鍵 .C 文件
1.2 矩陣按鍵 .H 文件
2、四段數碼管
2.1 四段數碼管.C 文件
2.2 四段數碼管.H 文件
一、 Proteus仿真1、仿真電路圖2、0.1HZ波形3、5KHZ波形4、10%占空比波形(10HZ)5、90%占空比波形(10HZ)6、工程文件框架
二、主要程序部分
主要是根據不同頻率段分不同的最小計數時長
/******************************************************************************* * FunctionName : Function_1_Serve * Description : 模式1服務函數 定時器0單位定時周期配置 * Input : None * Output : None * Return : None *******************************************************************************/ void Function_1_Serve(void) { float temp = 0.0; temp = Calculate_Data();//計算方波頻率 /*對應不同頻率段 設置不同的單位定時器周期*/ 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)// 設置不同的單位定時器周期 { /*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服務函數 定時器1單位定時周期配置 * 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 :系統定時器初始化 * 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 :定時器0中斷服務函數 * Input : None * Output : None *******************************************************************************/ void Time0(void)interrupt 1 { TH0 = TIMEO_H; TL0 = TIMEO_L; time0_num++; //記錄一個周期進入定時器中斷的次數 if(time0_num > time0_high_num) //輸出口由高電平跳變為低電平 OUTPUT=0; if(time0_num > time0_all_num) //輸出口由低電平跳變為高電平 { OUTPUT=1; time0_num = 0; } } /******************************************************************************* * FunctionName : Time1(void) interrupt 3 * Description : 定時器1中斷服務函數 * Input : None * Output : None *******************************************************************************/ void Time1(void)interrupt 3 { TH1 = TIME1_H; TL1 = TIME1_L; time1_num++; //記錄進入定時器中斷的次數 if(time1_all_num>time1_num) //輸出口由高電平跳變為低電平 OUTPUT = 1; if(time1_all_num<time1_num) //輸出口由低電平跳變為高電平 { OUTPUT = 0; time1_num = 0; TR1 = 0;//高電平輸出結束 關閉定時器 } }
0.png (39.27 KB, 下載次數: 72)
下載附件
2019-1-10 02:31 上傳
全部資料51hei下載地址:
單片機課程設計.rar
(2.1 MB, 下載次數: 169)
2019-1-9 21:17 上傳
點擊文件名下載附件
完整工程 下載積分: 黑幣 -5
|