01.#include "reg51.h" 02.#include "LCD1602.h" 03.#include "i2c.h" 04. 05.sbit S1 =P2^1; 06.sbit S4 =P2^2; 07./********************************** 08. 参数声明 09.**********************************/ 10.uint F=0; //频率 11.uint S=0,Pwm=0,Tra=0,AA=0; //正弦波 方波 三角波 锯齿波信号 12.uchar zkb=30,bx=1; //频率加/减 PWM占空比 波形选择 13.uchar t1=0,flagPwm=0,flag1=0; //标志位 14.uchar T=0; //周期 15. 16.uchar code num[]={ 0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD 17. ,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7 18. ,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4 19. ,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE 20. ,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6 21. ,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB 22. ,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3 23. ,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,0x8F,0x8B,0x88,0x85,0x82 24. ,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51 25. ,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27 26. ,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A 27. ,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00 28. ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08 29. ,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23 30. ,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B 31. ,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C 32. }; 33. 34./********************************* 35. 函数声明 36.**********************************/ 37.void Fun_Sin(); 38.void Fun_Triangle(); 39.void Fun_Pwm(); 40.void Fun_AA(); 41.void TimerInit(); 42.void KEY(); 43.void Delay10ms(); 44. 45./******************************************* 46. 主函数 47.*******************************************/ 48.void main() //主程序 49.{ 50. S1 = 1; 51. S4 = 1; 52. LcdInit(); //屏幕初始化 53. TimerInit(); //定时器初始化 54. 55. while(1) 56. { 57. KEY(); //按键检测 58. switch(bx) 59. { 60. case 1:Fun_Sin(); break; //正弦波 61. case 2:Fun_Triangle(); break; //三角波 62. case 3:Fun_Pwm(); break; //方波 63. case 4:Fun_AA(); break; //锯齿波 64. } 65. 66. if(flag1==1) 67. { 68. T=1*t1; 69. F=((1*100000)/T); 70. 71. LcdWriteCom(0x89); 72. LcdWriteData(T%1000/100+'0'); 73. LcdWriteData(T%100/10+'0'); 74. LcdWriteData(T%10+'0'); 75. 76. LcdWriteCom(0x82+0x40); 77. LcdWriteData(F%10000/1000+'0'); 78. LcdWriteData(F%1000/100+'0'); //个位 79. LcdWriteData('.'); 80. LcdWriteData(F%100/10+'0'); //小数后一位 81. LcdWriteData(F%10+'0'); //小数后两位 82. } 83. flag1=0; 84. } 85.} 86. 87./********************************** 88. 延迟10ms函数 89.**********************************/ 90.void Delay10ms() 91.{ 92. uchar a,b,c; 93. for(c=1;c>0;c--) 94. for(b=38;b>0;b--) 95. for(a=130;a>0;a--); 96.} 97./********************************** 98. 按键检测函数 99.**********************************/ 100.void KEY() 101.{ 102. if(S1==0) 103. { 104. Delay10ms(); 105. if(S1==0) 106. { 107. bx=bx+1; 108. flag1=1; //周期显示标志位 109. case_1: 110. switch(bx) 111. { 112. case 1: LcdWriteCom(0x83); 113. LcdWriteData('S'); 114. LcdWriteData('i'); 115. LcdWriteData('n');break; 116. case 2: LcdWriteCom(0x83); 117. LcdWriteData('T'); 118. LcdWriteData('r'); 119. LcdWriteData('a');break; 120. case 3: LcdWriteCom(0x83); 121. LcdWriteData('P'); 122. LcdWriteData('w'); 123. LcdWriteData('m');break; 124. case 4: LcdWriteCom(0x83); 125. LcdWriteData('A'); 126. LcdWriteData('A'); 127. LcdWriteData(' ');break; 128. default:bx=1; 129. goto case_1; 130. } 131. 132. } 133. while(!S1); //检测按键是否松开 134. } 135. 136. if(S4==0) 137. { 138. Delay10ms(); 139. if(S4==0) 140. { 141. zkb=zkb+10; 142. if(zkb>90) 143. { 144. zkb=10; 145. } 146. 147. LcdWriteCom(0x8c+0x40); 148. LcdWriteData(zkb%100/10+'0'); 149. LcdWriteData(zkb%10+'0'); 150. } 151. while(!S4); //检测按键是否松开 152. } 153.} 154./********************************** 155. 正弦波1函数 156.**********************************/ 157.void Fun_Sin() 158.{ 159. uchar i; 160. t1=0; //重置计数标志位 161. TR0=1; //开定时 162. for(i=0;i<255;i++) 163. { 164. S=num[i]; //打点赋值 165. 166. I2cStart(); 167. I2c_write_char(0x90); 168. I2cAck(); 169. I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端 0100 0000 170. I2cAck(); 171. I2c_write_char(S); //放置需要转换的量 172. I2cAck(); 173. I2cStop(); 174. } 175. TR0=0; //关定时 176.} 177./******************************* 178. 三角波2函数 179.********************************/ 180.void Fun_Triangle() 181.{ 182. uchar i; 183. t1=0; //重置计数标志位 184. TR0=1; //开定时器 185. for(i=0;i<255;i++) 186. { 187. Tra =i; 188. I2cStart(); 189. I2c_write_char(0x90); 190. I2cAck(); 191. I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端 0100 0000 192. I2cAck(); 193. I2c_write_char(Tra); 194. I2cAck(); 195. I2cStop(); 196. } 197. for(i=255;i>0;i--) 198. { 199. Tra =i; 200. I2cStart(); 201. I2c_write_char(0x90); 202. I2cAck(); 203. I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端 0100 0000 204. I2cAck(); 205. I2c_write_char(Tra); 206. I2cAck(); 207. I2cStop(); 208. } 209. TR0=0; //关定时器 210.} 211./******************************** 212. 方波3函数 213.********************************/ 214.void Fun_Pwm() 215.{ 216. t1=0; //重置计数标志位 217. TR0=1; //开定时器 218. 219. for(flagPwm=0;flagPwm<100;flagPwm++) 220. { 221. if(flagPwm<zkb) //占空比为%30 222. { 223. Pwm=0; 224. } 225. else 226. { 227. Pwm=255; 228. } 229. 230. I2cStart(); //DA转换程序 231. I2c_write_char(0x90); 232. I2cAck(); 233. I2c_write_char(0x40);//控制字 允许模拟输出 不自增单端 0100 0000 234. I2cAck(); 235. I2c_write_char(Pwm); 236. I2cAck(); 237. I2cStop(); 238. } 239. TR0=0; //关定时器 240.} 241./*********************************** 242. 锯齿波4函数 243.***********************************/ 244.void Fun_AA() 245.{ 246. uchar i; 247. t1=0; //重置计数标志位 248. TR0=1; //开定时器 249. for(i=255;i>0;i--) 250. { 251. AA =i; 252. I2cStart(); 253. I2c_write_char(0x90); 254. I2cAck(); 255. I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端 0100 0000 256. I2cAck(); 257. I2c_write_char(AA); 258. I2cAck(); 259. I2cStop(); 260. } 261. TR0=0; //关定时器 262.} 263./********************************* 264. 定时器初始化函数 265.**********************************/ 266.void TimerInit() 267.{ 268. TMOD|=0x01; //定时器0工作方式1 269. 270. TH0=0xFC; // 65536-1000+1 271. TL0=0x18; 272. 273. ET0=1; 274. EA=1; //定时器总开关 275. TR0=0; //中断开关 276.} 277./********************************** 278. 定时器中断函数 279.**********************************/ 280.void Timer(void) interrupt 1 //中断 281.{ 282.// TR0=0; //赋初值,定时器需在关闭状态 283. TH0=0xfc;// 65536-1000+1 284. TL0=0x18;// 285.// TR0=1; 286. 287. t1=t1+1; //计数中断个数 每个中断 1ms 288. 289.} |
1C-83-41-13-8C-08 |