请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 469|回复: 0

[资料共享] 51单片机简易信号发生器仿真设计 含误差分析+源码+波形图

[复制链接]

201

主题

11

回帖

1167

E币

助理工程师

Rank: 3Rank: 3

积分
413
发表于 2019-1-10 13:46:58 | 显示全部楼层 |阅读模式
课程设计!

后面的附件有完整的工程文件、实习报告、仿真文件和部分误差分析(完整的交给老师了,所有要求均满足,误差很小)
一、课程设计内容及基本要求利用单片机IO口作输出,通过定时器的周期性中断输出一个占空比可调、频率可调的简易方波信号发生器,具体要求如下:
1、完成频率范围为0.1Hz5KHz的方波发生器,要求如下:
1)占空比5%~95%连续可调;
2)可键盘输入信号发生的频率。
2、可完成脉宽范围为100μs1s的脉冲信号发生器,要求如下:
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、仿真电路图
104.001.jpg
2、0.1HZ波形
104.002.jpg
3、5KHZ波形
104.003.jpg
4、10%占空比波形(10HZ)
104.004.jpg
5、90%占空比波形(10HZ)
104.005.jpg
6、工程文件框架
104.006.jpg

二、主要程序部分

主要是根据不同频率段分不同的最小计数时长
/*******************************************************************************
* 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;//高电平输出结束 关闭定时器
    }
}


单片机课程设计.rar

2.1 MB, 下载次数: 2, 下载积分: E币 -5 元

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-3-29 22:58 , Processed in 0.048186 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表