|
|
AT89C51在已有的程序里面加一個(gè)步進(jìn)電機(jī),設(shè)置兩個(gè)鍵,控制步進(jìn)電機(jī)的正反轉(zhuǎn)。
在這個(gè)程序里面,加一個(gè)步進(jìn)電機(jī)的控制程序,然后利用兩個(gè)按鍵,控制它的正反轉(zhuǎn)
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
//數(shù)碼管段選定義 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; //設(shè)置的時(shí)間
uchar flag_alarm; //報(bào)警標(biāo)志位
uchar miao ;
uchar flag_v;
/***********************1ms延時(shí)函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/********************獨(dú)立按鍵程序*****************/
void key() //獨(dú)立按鍵程序
{
static uchar key_new;
P1 |= 0x03;
if((P1 & 0x03) != 0x03) //按鍵按下
{
delay_1ms(1); //按鍵消抖動(dòng)
if(((P1 & 0x03) != 0x03) && (key_new == 1))
{ //確認(rèn)是按鍵按下
key_new = 0;
switch(P1 & 0x03)
{
case 0x01:
set_time ++; //設(shè)置的時(shí)間加1
if(set_time > 9)
set_time = 1;
break; //得到按鍵值
case 0x02:
if(set_time == 0)
set_time = 10;
set_time --; //設(shè)置的時(shí)間減1
break; //得到按鍵值
}
}
}
else //按鍵松開
key_new = 1;
}
/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time_init()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時(shí)器0、
ET0 = 1; //開定時(shí)器0中斷
TR0 = 1; //允許定時(shí)器0定時(shí)
}
/******************主程序**********************/
void main()
{
time_init(); //定時(shí)器初始化程序
while(1)
{
key(); //獨(dú)立按鍵程序
P0 = smg_du[set_time]; //顯示時(shí)間
if(hw == 0) //有檢測(cè)液滴
{
delay_1ms(1); //消除干擾
if(hw == 0) //有檢測(cè)液滴
{
miao = 0;
flag_v = 0;
beep = 1; //關(guān)閉報(bào)警
}
}
if(flag_alarm == 1) //報(bào)警
{
if(miao - set_time <= 10) //報(bào)警10秒
{
beep = ~beep; //報(bào)警
delay_1ms(300);
}
else
{
beep = 1; //關(guān)閉報(bào)警
}
}
}
}
/*********************定時(shí)器0中斷服務(wù)程序************************/
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; //報(bào)警
}
if(miao >= 100)
miao = 100;
}
}
|
|