zoukankan      html  css  js  c++  java
  • 信号发生器的设计(期末课程设计)

    题目:信号发生器的设计

    设计一个信号源,可以输出三种波形(正弦波,方波,三角波),通过按键可以改变输出波形,也可以改变波形的频率,并且频率可以通过数码管显示出来(频率显示到个位,大概正确就好,不用太准确)。

    1、实现正弦波的输出,并且能够改变频率,5

    (1)实现正弦波的输出,2分

    (2)能够改变频率,1分

    (3)能够显示频率,2分

    2、实现方波的输出,并且能够改变频率,5

    (1)实现方波的输出,2分

    (2)能够改变频率,1分

    (3)能够显示频率,2分

    3、实现三角波的输出,并且能够改变频率,5

    (1)实现三角波的输出,2分

    (2)能够改变频率,1分

    (3)能够显示频率,2分

    提问环节:教师提问有关信号源的3个问题,根据学生回答情况给分,每个问题5,满分15

    使用的单片机:

    注意事项:

    1.频率只显示到个位,所以在周期 t上做了一些限制(见代码注释)。
    2.按按钮时,按下要停一段时间(等待一个周期走完),按钮才会起作用。

    参考代码:

    说明:次程序用单片机上的LED灯来模拟波的输出。

         K1:切换输出波
         K2:频率降低
         K3:频率提高
         默认频率:方波f1=5, 三角波f2=1, sin正弦波f3=1

    代码注释写的比较细,便于大家理解,但是老师会考的很简单,不会针对某一语句问你问题的。比如会问你dispFre()那一块的代码是实现什么功能的, 频率计算公式为什么这样写等等。

      1 //hill20200709
      2 #include<reg52.h> //头文件
      3 #include<intrins.h> //左右移函数头文件
      4 #define uchar unsigned char  //宏定义变量,相当于起个别名
      5 #define uint unsigned int
      6 
      7 //按键声明
      8 sbit K1=P3^4; 
      9 sbit K2=P3^5; 
     10 sbit K3=P3^6;  
     11 
     12 //3种波的周期t
     13 int t1=100; //单位为ms
     14 int t2=2;
     15 int t3=2;
     16 
     17 //数码管显示时需要的数组,数组元素对应显示的状态
     18 uchar code table[]={
     19 0x3f,0x06,0x5b,0x4f,
     20 0x66,0x6d,0x7d,0x07,
     21 0x7f,0x6f,0x77,0x7c,
     22 0x39,0x5e,0x79,0x71};
     23 
     24 //数码管显示时需要的位声明
     25 sbit DU =P2^6;
     26 sbit WE =P2^7; 
     27 
     28 //形成sin的波形用到的数组
     29 uchar code tosin[256]=
     30 {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5 ,
     31     0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5 ,
     32     0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd ,
     33     0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,
     34     0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,
     35     0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 ,
     36     0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,
     37     0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,
     38     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,
     39     0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e , 
     40   0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; 
     41 
     42 char n;
     43 
     44 //延时函数
     45 void delayms(uint ms)    
     46 {
     47     uint k,l;
     48     for(k=ms;k;k--)    
     49         for(l=110;l;l--);    //约1ms
     50 }
     51 
     52 //显示频率函数 (很重要)
     53 void dispFre(uint flag){ //参数flag判断是哪种波形
     54 
     55     int f,num;
     56 
     57     if(flag==0){ //flag=0判断是方波
     58         f=1000/((2*t1)); //频率计算公式(自动类型转化为整型)
     59     }
     60     else if(flag==1){//flag=1判断是三角波
     61         f=1000/(400*t2); //频率计算公式
     62     }
     63     else{//flag=2(其他) 判断是正弦波
     64         f=1000/(256*t3); //频率计算公式
     65     }
     66 
     67     num=f%10; //只要个位
     68 
     69     DU=1;
     70     P0=table[num]; 
     71     DU=0;
     72     WE=1;      
     73     P0=0xdf;      //1101 1111  只要第6个数码管亮
     74     WE=0;
     75     delayms(2);//延时函数
     76 }
     77 
     78 
     79 void square() //方波
     80 {
     81         P1=0; //LED全灭
     82         delayms(t1);//延时函数
     83 
     84         P1=255; //LED全亮
     85         delayms(t1);//延时函数
     86 }
     87 
     88 void triangle() //三角波
     89 {
     90     int a,x,y;
     91     for(x=200;x;x--)
     92     {
     93         a++;
     94         delayms(t2); //200个循环,每个循环a加一
     95         P1=a;
     96     }
     97     for(y=200;y;y--)
     98     {        
     99         a--;
    100         delayms(t2); //200个循环,每个循环a减一
    101         P1=a;
    102     }
    103 }
    104 
    105 void sin() //正弦波
    106 {
    107     int i;
    108     for(i=0;i<=255;i++)
    109     {
    110         P1=tosin[i];  //调用数组,形成sin的波形
    111         delayms(t3);
    112     }
    113 }
    114 
    115 void key_switch() //定义切换波形的按键函数
    116 {
    117     if(K1==0) //定义负责K1的函数
    118     {
    119         delayms(10); //防抖,下面同理
    120         if(K1==0){
    121             n++;
    122             if(n==3){
    123                 n=0;
    124             }
    125             while(!K1); //K1按下去了就一直运行空循环
    126         }
    127     }    
    128 }
    129 void key_plus(){ //定义负责K2的函数实现周期t加,f减
    130     if(K2==0){
    131         delayms(10);
    132         if(t1<520){      //t1=500时,f=1; 等于520时f=0
    133             t1=t1+20;
    134         }
    135         else{     //f减到0时,自动复位到初始的5
    136             t1=100;
    137         }
    138         if(t2<3){ //t2加到3时 f=0
    139             t2++;
    140         }
    141         else{
    142             t2=2;
    143         }
    144         if(t3<4){ //t3加到4时 f=0
    145             t3++;
    146         }
    147         else{
    148             t3=2;
    149         }
    150         while(!K2);
    151     }
    152 }
    153 void key_minus(){ //定义负责K3的函数实现周期t减,f加
    154     if(K3==0){ //时间出现负数的时候程序会卡死,且数码管就1位,所以要对t限制
    155         delayms(10);
    156         if(t1>60){      //t1=60时,f=8; 等于40时f=12
    157             t1=t1-20;
    158         }
    159         else{     //f加到8时,自动复位到5
    160             t1=100;
    161         }
    162         if(t2>0){ //t2
    163             t2--;
    164         }
    165         else{
    166             t2=2;
    167         }
    168         if(t3>0){ //t3
    169             t3--;
    170         }
    171         else{
    172             t3=2;
    173         }
    174         while(!K3);
    175     }
    176         
    177 }
    178 
    179 void main()
    180 {
    181 
    182     while(1)
    183     {
    184         key_switch();//实现切换波形的函数
    185         key_plus(); //实现周期增加、频率减小的函数
    186         key_minus(); //实现周期减小、频率增加的函数
    187         dispFre(n); //显示频率到数码管
    188         
    189         //下面的代码(非常重要)实现判断需要输出那种波形
    190         if(n==0){
    191             square(); //方波
    192         }
    193         else if(n==1){
    194             triangle(); //三角波
    195             
    196         }
    197         else{
    198             sin(); //正弦波
    199             
    200         }
    201 
    202         
    203     }
    204 }

     三种波及频率计算(原理结合代码)

    本人单片机初学者,多多关照!文章内容肯定有不当之处,敬请指出改正。

  • 相关阅读:
    jenkins 邮件配置
    jenkins+git学习笔记
    用户定义的变量+HTTP Cookie 管理器组合实现接口关联+问题处理
    jmeter参数化实现之CSV Data Set Config
    Jmeter学习笔记
    除法应用遇到的问题-类型及小数点
    python2输出中文乱码问题
    python常见函数及方法
    数据库的基本操作
    使用eclipse搭建maven项目
  • 原文地址:https://www.cnblogs.com/hillxu/p/13320693.html
Copyright © 2011-2022 走看看