|
AT89C51在已有的程序里面加一个步进电机,设置两个键,控制步进电机的正反转。
在这个程序里面,加一个步进电机的控制程序,然后利用两个按键,控制它的正反转
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0x21,0xf6,0x23,0x26,0x6c,0x4a,0xa0,0xf2,0x20,0x24,
// A B C D E F 不显示
0x28,0xe0,0xb1,0x62,0xb0,0x48 }; //断码
uchar dis_smg[1] = 0;
sbit beep = P2^7; //蜂鸣器
sbit hw = P3^2; //红外
uchar set_time; //设置的时间
uchar flag_alarm; //报警标志位
uchar miao ;
uchar flag_v;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/********************独立按键程序*****************/
void key() //独立按键程序
{
static uchar key_new;
P1 |= 0x03;
if((P1 & 0x03) != 0x03) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x03) != 0x03) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x03)
{
case 0x01:
set_time ++; //设置的时间加1
if(set_time > 9)
set_time = 1;
break; //得到按键值
case 0x02:
if(set_time == 0)
set_time = 10;
set_time --; //设置的时间减1
break; //得到按键值
}
}
}
else //按键松开
key_new = 1;
}
/*********************定时器0、定时器1初始化******************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************主程序**********************/
void main()
{
time_init(); //定时器初始化程序
while(1)
{
key(); //独立按键程序
P0 = smg_du[set_time]; //显示时间
if(hw == 0) //有检测液滴
{
delay_1ms(1); //消除干扰
if(hw == 0) //有检测液滴
{
miao = 0;
flag_v = 0;
beep = 1; //关闭报警
}
}
if(flag_alarm == 1) //报警
{
if(miao - set_time <= 10) //报警10秒
{
beep = ~beep; //报警
delay_1ms(300);
}
else
{
beep = 1; //关闭报警
}
}
}
}
/*********************定时器0中断服务程序************************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0; //50ms
flag_v++;
if(flag_v >= 20) //1秒
{
flag_v = 0;
miao ++;
if(miao >= set_time)
{
flag_alarm = 1; //报警
}
if(miao >= 100)
miao = 100;
}
}
|
|