|
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;
}
}
|
|