標題: 程序寫keil里面沒有報錯,生成hex文件就放在proteus里面,就是仿真不出來怎么辦? [打印本頁]
作者: 農夫山泉不甜 時間: 2020-5-27 14:50
標題: 程序寫keil里面沒有報錯,生成hex文件就放在proteus里面,就是仿真不出來怎么辦?
設計內容:1、3個獨立按鍵分別控制“自然風”、“睡眠風”、“常風”,(三者的區別是直流電機的停歇時間不同),并在數顯管上顯示出區別
2、每種類型風可以根據按下獨立按鍵次數分為4個檔的風力調節。
3、設計風扇的過熱保護,用繼電器實現。即當風扇運行一段時間后,暫停10秒。
4、其他創新內容(如報警提示
程序如下:#include<reg51.h> //頭文件
sbit K1=P1^0; //定義按鍵 開關
sbit K2=P1^1; //正常風
sbit K3=P1^2; //自然風
sbit K4=P1^3; //睡眠風
sbit mada=P2^0; //馬達驅動
sbit jdq=P2^1; //繼電器驅動
int PWM=40; //PWM寄存器
int dang=1; //檔位寄存器
int i,j; //輸出PWM是的變量
int moshi=0; //模式標志
int time; //睡眠和自然風開關間隙時間,定時寄存器
int time1; //定時工作1分鐘休息10秒鐘,定時寄存器
int daima=0; //數碼管顯示位選選擇
sbit p1=P2^4; //數碼管位選
sbit p2=P2^5;
sbit p3=P2^6;
sbit p4=P2^7;
char data_7seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0x86}; //數碼管段碼
void xianshi() //顯示子程序
{ switch(daima)
{case 0:
p1=0;p2=0;p3=0;p4=0; //位選關
P0=data_7seg[moshi]; //發送第一位數碼管顯示代碼
p1=1;p2=0;p3=0;p4=0; //第一個位選開
daima=1; //顯示延遲
break;
case 1:
p1=0;p2=0;p3=0;p4=0; //位選關
P0=data_7seg[10]; //發送第二位數碼管顯示代碼
p1=0;p2=1;p3=0;p4=0; //第二個位選開
daima=2; //顯示延遲
break;
case 2:
p1=0;p2=0;p3=0;p4=0; //位選關
P0=data_7seg[10]; //發送第三位數碼管顯示代碼
p1=0;p2=0;p3=1;p4=0; //第三個位選開
if(moshi==0)
daima=0; //顯示延遲
else
daima=3;
break;
case 3:
p1=0;p2=0;p3=0;p4=0; //位選關
P0=data_7seg[dang]; //發送第四位數碼管顯示代碼
p1=0;p2=0;p3=0;p4=1; //第四個位選開
daima=0; //顯示延遲
break;
}
}
void key() //按鍵掃描
{ if(K1==0) //檔位切換
{ dang++; //循環
if(dang>4)
dang=1;
switch(dang) //根據檔位控制PWM占空比
{ case 1: PWM=40; break;
case 2: PWM=60; break;
case 3: PWM=80; break;
case 4: PWM=100; break;
}
}
while(K1==0);
if(K2==0) //正常模式按鍵
{
moshi=1; //正常模式
}
while(K2==0);
if(K3==0) //自然風模式按鍵
{
moshi=2; //自然風模式
}
while(K3==0);
if(K4==0) //睡眠模式按鍵
{
moshi=3; //睡眠模式
}
while(K4==0);
}
void main() //主程序
{
mada=0; //初始化端口
i=100;
jdq=0;
TMOD=0X12; //定義中斷和開啟中斷
TH0=256-100;
TL0=256-100;
ET0=1;TR0=1;
EA=1;
TH1 = 0x3C;
TL1 = 0x0B0;
ET1 = 1;
TR1 = 1;
while(1) //無限循環
{ key(); //按鍵掃描
if(moshi==0) //模式=0,待機
{i=0;jdq=1;time1=0; }
else
if(moshi==1) //模式=1,正常
i=PWM; //正常輸出
else
if(moshi==2) //模式=2,自然風
{ if(time<200) //開10秒,關5秒
i=PWM;
else
i=0;
}
else
if(moshi==3) //模式=3,睡眠風
{ if(time<100) //開5秒,關10秒
i=PWM;
else
i=0;
}
}
}
void Timer0Interrupt(void) interrupt 0 //定時器中斷,輸出PWM,占空比
{
if(j>100)
j=0;
if(j<i)
{
mada=1;
}
else
{
mada=0;
}
xianshi();
}
void Timer1Interrupt(void) interrupt 3 //定時器中斷0,計時
{
TH1 = 0x3C;
TL1 = 0x0B0;
if(moshi>1)
time++;
else
time=0;
time1++;
if(time1>=1400)
time1=0;
if(time1>=1200)
jdq=1;
else
if(moshi>0)
jdq=0;
if(time>=300) time=0;
}
-
ok.PNG
(100.46 KB, 下載次數: 71)
下載附件
2020-5-27 14:44 上傳
作者: 農夫山泉不甜 時間: 2020-5-27 15:08
那個數碼管的燈不亮,但是按鈕燈是亮的。求大佬解答
作者: g2363451687 時間: 2020-5-27 16:09
keil不報錯只是語法沒錯,程序定義的變量盡量別亂定義名字,比如用拼音什么的會讓人看不懂,建議先完成pwm驅動然后再完成按鍵一步步來
作者: leily 時間: 2020-5-27 16:12
厲害,謝謝分享
作者: 農夫山泉不甜 時間: 2020-5-27 16:48
就是那個數碼管不顯示也不亮
作者: devcang 時間: 2020-5-27 16:58
建議 用一些led來顯示不同的狀態
作者: taotie 時間: 2020-5-27 18:27
lun203 9腳接+5v
p2.0繼電器 p2.1驅動
繼電器不能仿真 換一個能仿真的
錯誤不少慢慢查找吧
作者: gianthunter 時間: 2020-5-27 18:32
是程序錯誤還是軟件問題?VCC屬性設置了嗎
作者: 農夫山泉不甜 時間: 2020-5-27 19:43
嗯嗯,我是小白,還搞不太明白就用拼音了
作者: 農夫山泉不甜 時間: 2020-5-27 20:00
哥你能不能幫我改改啊,這個pwm驅動我咋一直搞不好呢
作者: 農夫山泉不甜 時間: 2020-5-27 20:01
哥 您能不能幫我改改啊,我卡到這里好幾天了,謝謝大佬
作者: 農夫山泉不甜 時間: 2020-5-27 21:15
程序對著呢,沒有報錯,圖用別的hex文件也有反應,就是一起用這個自己寫的沒反應
作者: 農夫山泉不甜 時間: 2020-5-27 21:16
對的,所以現在很煩,也不知道錯誤在哪兒?所以來這兒找一下大佬求助一下,
作者: 農夫山泉不甜 時間: 2020-5-27 21:18
這個圖錯了很多嗎?哦哦哦,謝謝。哥你能給點建議嗎?還是不太會啊
作者: xff1094214476 時間: 2020-5-27 21:21
直接看懵了
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |