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.}
|