仿真一直仿真不了,下面附有仿真圖
102617wkbulkiji5cuuppl.jpeg (1.38 MB, 下載次數: 40)
下載附件
2021-4-29 23:44 上傳
1、用數碼管顯示電風扇的不同工作狀態:不同檔風力(強風、中風、弱風); 2、設置風力鍵用于切換設置風力; 3、設計“定時”鍵,用于運行時間的定時設置; 5、可以有其他擴展功能。
單片機源程序如下:
#include "reg52.h"
#include <intrins.h>
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit moto=P1^0;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit LED=P2^0;
int i;
u8 NUM;
u8 data xx;
volatile u8 TIME1[4]={1,2,3,4};
u16 time_cnt=0; //定時器中斷計數次數
u16 freq=100; //PWM輸出頻率100HZ
u8 duty_cycle=40; //占空比20%
bit flag=0;
u8 DisplayData[5];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/**************************************************************/
void delay_10us(u16 us);
void delay_ms(u16 z);
void delay(u16 i);
void Time0_Init(void);
void Time1_Init();
void datapros();
void TIPLAY();
void PWMInit();
/***************************************************************/
//延時函數10*us(us)
void delay_10us(u16 us)
{
while(us--);
}
void delay_ms(u16 z)
{
u16 x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void delay(u16 i)
{
while(i--);
}
void Time0_Init(void)
{
TMOD|=0x01;
TH0 = 0XFF;
TL0 = 0X9C; //定時0.1ms
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Time1_Init()
{
TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
TH1=0XFC; //給定時器賦初值,定時1ms
TL1=0X18;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
void datapros()
{
DisplayData[1]=smgduan[NUM];
// DisplayData[1]=smgduan[0];//百
// DisplayData[2]=smgduan[0];//十
// DisplayData[3]=smgduan[5];//個
DisplayData[2]=smgduan[TIME1[xx]];
}
void TIPLAY()
{
if(k4==0)
{
delay_10us(1000);
if(k4==0)
{
flag=~flag;
}
while(!k4);
}
if(flag==0)
{
ET0 = 0;
moto=0;
if(k3==0)
{
delay_10us(1000);
if(k3==0)
{
xx++;
}
while(!k3);
if(xx>3)xx=0;
}
}
else
{
ET0 = 1;
Time1_Init();
while(1)
{
PWMInit();
datapros();
LSA=0;LSB=0;LSC=0;//顯示第0位
P0=DisplayData[1];
delay_10us(5); //間隔一段時間掃描
P0=0x00;
LSA=1;LSB=0;LSC=1;//顯示第5位
P0=DisplayData[2];
delay_10us(5); //間隔一段時間掃描
P0=0x00;
}
}
}
void PWMInit()
{
if(NUM>=3)NUM=3;
if(NUM<=0)NUM=0;
if(k1==0) //加速
{
delay_10us(1000);
if(k1==0)
{
if(duty_cycle<100)
duty_cycle+=20;
NUM++;
}
while(!k1);;
}
else if(k2==0) //減速
{
delay_10us(1000);
if(k2==0)
{
if(duty_cycle>0)
duty_cycle-=20;
NUM--;
}
while(!k2);
}
if(duty_cycle>=100)duty_cycle=100;
else if(duty_cycle<=0)duty_cycle=0;
// if(NUM>3)NUM=3;
// if(NUM<0)NUM=0;
}
void main()
{
// u8 i;
Time0_Init();
while(1)
{
PWMInit();
datapros();
LSA=0;LSB=0;LSC=0;//顯示第0位
P0=DisplayData[1];
delay_10us(5); //間隔一段時間掃描
P0=0x00;
LSA=1;LSB=0;LSC=1;//顯示第5位
P0=DisplayData[2];
delay_10us(5); //間隔一段時間掃描
P0=0x00;
TIPLAY();
LSA=0;LSB=1;LSC=1;//顯示第6位
P0=DisplayData[2];
delay_10us(10); //間隔一段時間掃描
P0=0x00;
LSA=1;LSB=1;LSC=1;//顯示第7位
P0=DisplayData[1];
delay_10us(10); //間隔一段時間掃描
P0=0x00;//消隱
}
moto=0; //關閉電機
for(i=0;i<100;i++)
{
moto=1; //開啟電機
delay(5000); //大約延時50ms
}
moto=0; //關閉電機
}
void Time0Init() interrupt 1
{
TR0 = 0; //關閉定時器0
TH0 = 0XFF;
TL0 = 0X9C; //定時0.1ms
time_cnt++;
if(time_cnt>=freq)
time_cnt=0;
else if(time_cnt<=duty_cycle)
{
moto=1;
}
else
{
moto=0;
}
TR0 = 1; //開啟定時器0
}
void Timer1() interrupt 3
{
// u16 TIME1=5000;
static u16 i;
TH1=0XFC; //給定時器賦初值,定時1ms
TL1=0X18;
i++;
if(i==(TIME1[xx]*5000))
{
i=0;
ET0 = 0;
moto=0;
}
}
|