欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機風扇風速控制電路 求指導一下我的代碼!
[打印本頁]
作者:
cwm5744
時間:
2019-3-4 15:18
標題:
單片機風扇風速控制電路 求指導一下我的代碼!
設計一個風扇風速控制電路,用三個按鍵控制風速、風種、啟動/停止;運轉狀態用指示燈顯示。
風速:強、中、弱對應電扇的不同轉速。 風種:睡眠、自然、正常。睡眠時,電扇運轉10秒,間斷10秒;自然時,自然風運轉5秒,間斷5秒;正常時電扇連續運轉。
現在代碼出現的問題是:選擇風種那里,停轉5秒那里沒問題,但是一旦進入停轉10秒那里就變成轉10秒,只停止3秒左右,模式3直接進入不了,一直在模式1和2之間變換。
代碼如下:
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<uart.h>
#define uchar unsigned char
#define uint unsigned int
uchar zkb,aa;
uchar t=0,snum=0,s1num=0,tt=0; //t記錄中斷次數,確定PWM的周期
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit ENA=P2^5; //產生PWM波?
sbit dula=P2^6;
sbit wela=P2^7;
sbit zs=P3^7; //轉速
sbit ms=P3^6; //模式
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
sbit d5=P1^4;
sbit lcden=P3^4;
sbit rs=P3^5;
void delayms(uint xms) //延時子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//液晶顯示模塊的讀寫以及控制
void write_com(uchar com) //寫命令函數
{
rs=0;
lcden=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date) //寫數據函數
{
rs=1;
lcden=0;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//函數功能:顯示檔數和模式
void display_sym()
{
write_com(0x80);
write_data('v');
write_data(':');
write_com(0x80+0x40);
write_data('m');
write_data(':');
}
void keyscan()
{
if(zs==0) //控制電機的四個轉速
{
delayms(5);//消抖
if(zs==0) //zs鍵確實按下
{
snum++; //每按一次加1
while(!zs); //等待松開
if(snum==3) //當snum=5時,回到第一檔
{
snum=0; //0檔,速度最大
}
switch(snum)
{
case 0:zkb=40;break; //snum為0時,1檔
case 1:zkb=60;break; //snum為1時,2檔
case 2:zkb=90;break; //snum為2時,3檔
default: break;
}
}
}
if(ms==0) //控制電機的四個轉速
{
delayms(5);//消抖
if(ms==0) //zs鍵確實按下
{
while(!ms); //等待松開
s1num++; //每按一次加1
if(s1num==1) //
{
tt=0;
aa=100;
IN1=1; //
IN2=0;
}
if(s1num==2) //
{
tt=0;
aa=200;
IN1=1; //
IN2=0;
}
if(s1num==3) //
{
s1num=0; //清零下次計算
IN1=1;
IN2=0;
}
}
}
}
void init()
{
dula=0;
wela=0;
lcden=1;
IN1=1;
IN2=0;
write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); // 寫一個字符后地址指針加1
write_com(0x01); //顯示清0,數據指針清0
write_com(0x80); //通電時,指針知道顯示屏第一行首位處
TMOD=0x21; //
TH1=(65536-917)/256; //定時器1賦初值100us
TL1=(65536-917)%256;
TH0=(65536-45872)/256; //定時器0賦初值50ms
TL0=(65536-45872)%256;
ET1=1; // 定時器1打開
ET0=1; // 定時器0打開
TR0=1; // 啟動定時器0
TR1=1; // 啟動定時器1
EA=1; // 打開總中斷
}
void main()
{
init(); //初始化
display_sym(); //上電時,顯示v: m:
while(1)
{
keyscan(); //按鍵掃描,實現轉速轉向調節的功能
}
}
void timer0()interrupt 1 //
{
TH0=(65536-45872)/256; //每次中斷為50ms
TL0=(65536-45872)%256;
tt++;
if(tt<aa)
IN1=1;
else
IN1=0;
if(tt==2*aa)
tt=0;
}
void timer1()interrupt 3 //該定時器1用于占空比調速
{
TH1=(65536-917)/256; //重新裝入初值 100us
TL1=(65536-917)%256;
t++; //每產生一次中斷+1
if(t<zkb) //當占空比大于t時,輸出高電平,否則輸出低電平
ENA=1; //在t<zkb時,使能端開啟,否則使能端關閉
else
ENA=0;
if(t>=100)
t=0;
}
復制代碼
作者:
cwm5744
時間:
2019-3-4 15:38
漏說了,注釋沒寫好,是第二個if那里出問題,對應的是定時器0那里。
作者:
cwm5744
時間:
2019-3-4 18:34
現在發現好像是定時器0溢出標志位tt溢出次數太多會出錯,達到某個溢出數后,tt就會自動清零
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1