- #include<reg52.h>
- #define unint unsigned int
- #define unchar unsigned char
- unchar code pwm[5][120]={
- { 4 , 12 , 20 , 27 , 35 , 43 , 51 , 58 , 66 , 74 ,
- 81 , 88 , 96 , 103 , 110 , 117 , 124 , 131 , 137 , 144 ,
- 150 , 156 , 162 , 168 , 174 , 180 , 185 , 190 , 195 , 200 ,
- 205 , 209 , 213 , 217 , 221 , 224 , 228 , 231 , 234 , 237 ,
- 239 , 241 , 243 , 245 , 246 , 247 , 248 , 249 , 250 , 250 ,
- 250 , 250 , 249 , 248 , 247 , 246 , 245 , 243 , 241 , 239 ,
- 237 , 234 , 231 , 228 , 224 , 221 , 217 , 213 , 209 , 205 ,
- 200 , 195 , 190 , 185 , 180 , 174 , 168 , 162 , 156 , 150 ,
- 144 , 137 , 131 , 124 , 117 , 110 , 103 , 96 , 88 , 81 ,
- 74 , 66 , 58 , 51 , 43 , 35 , 27 , 20 , 12 , 4
- },
- { 8 , 24 , 39 , 55 , 70 , 85 , 99 , 113 , 127 , 140 ,
- 153 , 165 , 177 , 187 , 198 , 207 , 215 , 223 , 229 , 235 ,
- 240 , 244 , 247 , 249 , 250 , 250 , 249 , 247 , 244 , 240 ,
- 235 , 229 , 223 , 215 , 207 , 198 , 187 , 177 , 165 , 153 ,
- 140 , 127 , 113 , 99 , 85 , 70 , 55 , 39 , 24 , 8},
- { 10 , 29 , 49 , 68 , 87 , 105 , 122 , 139 , 155 , 170 ,
- 184 , 196 , 208 , 218 , 227 , 234 , 241 , 245 , 248 , 250 ,
- 250 , 248 , 245 , 241 , 234 , 227 , 218 , 208 , 196 , 184 ,
- 170 , 155 , 139 , 122 , 105 , 87 , 68 , 49 , 29 , 10 },
- { 16 , 47 , 77 , 106 , 134 , 159 , 182 , 202 , 219 , 232 ,
- 242 , 248 , 250 , 248 , 242 , 232 , 219 , 202 , 182 , 159 ,
- 134 , 106 , 77 , 47 , 16},
- {20,58,96,130,162,190,213,231,243,249,249,243,231,213,190,162,130,96,58,20 }};
- // 反正弦變化
- unchar i=0;
- unchar m=0;
- unchar dr=0;
- sbit output=P0^0; //脈沖輸出
- sbit key=P3^0; //頻率轉換鍵
- void init();
- void delay(unint);
- void main()
- {
- init();
- TR0=1; //啟動定時器0
- output=1; //給脈沖
- TR1=1; //啟動定時器1
- while(1)
- {
- if(key==0)
- {
- delay(5);
- if(key==0)
- {
- while(1)
- if(key==1)
- {
- i++; //關光標
- if(i==5)
- i=0;
- break;
- }
- }
- }
- switch (i)
- {
- case 0: m=100;break; //20Hz 100個數據
- case 1: m=50;break; //40HZ 50個數據
- case 2: m=40;break; //50HZ 40個數據
- case 3: m=25;break; // 80Hz 25個數據
- case 4: m=20;break; //100HZ 20個數據
- }
- }
- }
- void init()
- {
- TMOD=0x11;
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- ET1=1; //開定時器1中斷
- }
- /****************************延時*****************************/
- void delay(unint z)
- {
- unint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void time0() interrupt 1
- {
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- output=1;
- TR1=1; //啟動定時器1
- }
- void time1() interrupt 3
- {
- output=0;
- TR1=0; //停止定時器1
- TH1=(65536-pwm[i][dr])/256;
- TL1=(65536-pwm[i][dr])%256;
- dr++;
- if(dr==m)
- dr=0;
- }
復制代碼 |