標(biāo)題: 51單片機(jī)簡(jiǎn)易信號(hào)發(fā)生器仿真設(shè)計(jì) 含誤差分析+源碼+波形圖 [打印本頁(yè)]
作者: 總是離人淚 時(shí)間: 2019-1-9 21:22
標(biāo)題: 51單片機(jī)簡(jiǎn)易信號(hào)發(fā)生器仿真設(shè)計(jì) 含誤差分析+源碼+波形圖
本人的課程設(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)可鍵盤(pán)輸入信號(hào)發(fā)生的頻率。
2、可完成脈寬范圍為100μs~1s的脈沖信號(hào)發(fā)生器,要求如下:
(1)可鍵盤(pán)輸入發(fā)生脈沖寬度;
(2)每按一次觸發(fā)鍵,可發(fā)出一個(gè)單脈沖。
3、根據(jù)已經(jīng)描述的C語(yǔ)言控制程序,運(yùn)用Proteus畫(huà)出硬件連接圖,并將運(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í)器
}
}
0.png (39.27 KB, 下載次數(shù): 72)
下載附件
2019-1-10 02:31 上傳
全部資料51hei下載地址:
單片機(jī)課程設(shè)計(jì).rar
(2.1 MB, 下載次數(shù): 169)
2019-1-9 21:17 上傳
點(diǎn)擊文件名下載附件
完整工程
下載積分: 黑幣 -5
作者: 總是離人淚 時(shí)間: 2019-1-10 14:57
本帖最后由 總是離人淚 于 2019-1-11 21:48 編輯
晶振是11.0592Mhz的 ,實(shí)物運(yùn)行的誤差補(bǔ)償已經(jīng)調(diào)整好了(仿真的誤差需要自己補(bǔ)償)
作者: 總是離人淚 時(shí)間: 2019-3-16 15:26
在reg52.h頭文件中添加這兩句代碼#define uint unsigned int
#define uchar unsigned char
作者: 總是離人淚 時(shí)間: 2019-5-6 22:29
您好,您遇到什么問(wèn)題了?可以找我的,我給您解決。
作者: 總是離人淚 時(shí)間: 2020-5-30 15:22
這個(gè)系統(tǒng)的使用講解網(wǎng)站 https://b23.tv/Bxez2n
作者: 尷尬 時(shí)間: 2020-6-4 11:46
可以調(diào)節(jié)頻率嗎
作者: 總是離人淚 時(shí)間: 2020-7-10 16:29
頻率可調(diào),占空比可調(diào),脈寬可調(diào)。全部均可通過(guò)矩陣按鍵實(shí)現(xiàn)
作者: 郎中 時(shí)間: 2020-7-10 18:16
可以調(diào)節(jié)頻率嗎
作者: 總是離人淚 時(shí)間: 2020-7-18 08:42
頻率可調(diào),占空比可調(diào),脈寬可調(diào)。全部均可通過(guò)矩陣按鍵實(shí)現(xiàn)
作者: 雨傘 時(shí)間: 2020-10-29 23:06
好文章謝謝分享
作者: tt98 時(shí)間: 2020-10-31 16:27
這個(gè)有料!看看能不能在實(shí)際中應(yīng)用到!
作者: 富蘭克林2 時(shí)間: 2020-12-23 11:21
好文章
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |