仿真一直仿真不了,下面附有仿真图
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;
}
}
|