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