![]() |
發布時間: 2018-9-4 21:57
正文摘要:程序自己模仿的 可是仿真出來pwm端口一直處于高電平狀態 想問問是什么問題 電路原理圖如下: 單片機源程序: #include <reg52.h> #define uchar unsigned char #define ... |
q設置的不對 |
q變量設置的不對,q變量在定義中設置成了int型,應該設置成float 或 double型。 |
int i=0,q=0.5,f=500;//設置初值占空比0.5 頻率0.5khz //這里q為整型 所以 之后的q 一直為0 if(100*q<i<=100) //這里有 語法錯誤 應該 是 if (100*q<i && i<=100) 給樓主個建議 按鍵 消抖 別用延時 用幾毫秒查鍵判斷按鍵是否按下 如果連續多次判定檢測為按下則按鍵確認為按下 |
int i=0,q=0.5,f=500;//設置初值占空比0.5 頻率0.5khz 這里 q為整型 所以 q一直為0 |
急啊 有沒有人能回答一下 |
jefelee 發表于 2018-9-5 08:45 pwm=0我放到中斷里面了 在后面。我是一個個定時器控制的頻率和占空比 |
pwm=0的部分你好像沒有寫。。。 看這個 對照一下#include <reg51.h> typedef unsigned char uchar; sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P2_0=P2^0; sbit P2_1=P2^1; sbit P2_2=P2^2; sbit P2_3=P2^3; sbit P2_4=P2^4; sbit P3_4=P3^4; uchar time=0; uchar period=30; uchar high=10; uchar th0=0; uchar tl0=1; bit dir; void dealy() { uchar i; for(i=0;i<100;i++); } void timer0() interrupt 1 using 1 { TH0=0xfc; /*¶¨ê±Æ÷3õÖμÖØ×°ÔØ*/ TL0=0x18; time++; P3_4=~P3_4; if(dir==1) { if(time==high) /*¸ßμçÆ½3ÖDøê±¼ä½áêø£¬±äμí*/ P2_0=th0; /*¾-1y·′ÏàÆ÷·′Ïà*/ else if(time==period) /*ÖüÆúê±¼äμ½£¬±ä¸ß*/ { time=0; P2_0=tl0; /*¾-1y·′ÏàÆ÷·′Ïà*/ } } else if(time==high) /*¸ßμçÆ½3ÖDøê±¼ä½áêø£¬±äμí*/ P2_1=th0; /*¾-1y·′ÏàÆ÷·′Ïà*/ else if(time==period) /*ÖüÆúê±¼äμ½£¬±ä¸ß*/ { time=0; P2_1=tl0; /*¾-1y·′ÏàÆ÷·′Ïà*/ } } void main() { P0=0x00; P2=0x00; TMOD=0x01; /*¶¨ê±Æ÷0·½ê½1*/ TH0=0xfc; /*¶¨ê±Æ÷×°ÔØ3õÖ죬éèÖÃÂö3åDÅoÅμÄÕ¼¿Õ±èÎa1£ˉ5*/ TL0=0x18; ET0=1; /*¿a¶¨ê±Æ÷0ÖD¶Ï*/ TR0=1; /*Æô¶ˉ¶¨ê±Æ÷0*/ while(1) { if(P0_0==1) EA=1; /*¿aCPUÖD¶Ï*/ if(P0_1==1) EA=0; /*1ØCPUÖD¶Ï*/ if(P0_2==1) { dir=~dir; /*×aÏò¿ØÖÆ*/ while(P0_2!=0) {}; } if(P0_3==1) { high++; if(high==30) high=0; while(P0_3!=0) {}; } } } |