欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)自動(dòng)控制升降旗系統(tǒng)源程序
[打印本頁(yè)]
作者:
gh8989090
時(shí)間:
2018-5-9 20:24
標(biāo)題:
單片機(jī)自動(dòng)控制升降旗系統(tǒng)源程序
自動(dòng)控制升降旗系統(tǒng) 程序
0.jpg
(33.94 KB, 下載次數(shù): 25)
下載附件
2018-5-9 20:52 上傳
單片機(jī)源程序如下:
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無(wú)符路字符型 宏定義 變量范圍0~255
#define uint unsigned int //無(wú)符路整型 宏定義 變量范圍0~65535
#include "eeprom52.h" //單片機(jī)存儲(chǔ)控制程序調(diào)用
#include "LCD1602.h" //LCD1602控制顯示程序調(diào)用
sbit VSDA = P3^5; //語(yǔ)音控制IO口定義
sbit VCS = P3^6;
sbit VSCL = P3^7;
sbit key_1=P1^0; //控制按鍵IO口
sbit key_2=P1^1;
sbit key_3=P1^2;
sbit key_4=P1^3;
sbit key_5=P1^4;
sbit key_6=P1^5;
sbit led_1=P1^6; //系統(tǒng)指示燈IO口
sbit led_2=P1^7;
sbit led_3=P3^0;
sbit led_4=P3^1;
uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步進(jìn)電機(jī)正轉(zhuǎn)動(dòng)數(shù)據(jù)數(shù)組
uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//步進(jìn)電機(jī)反轉(zhuǎn)動(dòng)數(shù)據(jù)數(shù)組
uint UP_dat=0,Below_dat=0,Current_dat=0;
//上移動(dòng)的角度數(shù)據(jù)變量,下移動(dòng)的角度數(shù)據(jù)變量,當(dāng)前位置數(shù)據(jù)變量
uchar Current_Height=0,circulation,speed_dat,dat_A;
//當(dāng)前旗幟的高度數(shù)據(jù)變量,步進(jìn)電機(jī)循環(huán)控制變量,轉(zhuǎn)動(dòng)速度控制變量,顯示當(dāng)前高度變量
uchar sys_state,state;
//系統(tǒng)狀態(tài)變量 ,工作流程控制變量
uchar irbyte[4];
//分析紅外數(shù)據(jù)存數(shù)的32位數(shù)據(jù);
uchar irtime,irflag,bitnum,irdateok;
//脈沖周期計(jì)時(shí)便利阿尼哥,分析數(shù)據(jù)標(biāo)志位,數(shù)據(jù)存入數(shù)組下標(biāo)變量 ,數(shù)據(jù)接受完成標(biāo)志位
uchar irdate[33];
//紅外信號(hào)的數(shù)據(jù)存儲(chǔ)數(shù)組
/***********************小延時(shí)函數(shù)**************************/
void delay_us (unsigned int us)
{
while(us--)
{
_nop_();
}
}
/********************************************************************
* 名稱(chēng) : delay_1ms()
* 功能 : 延時(shí)1ms函數(shù)
* 輸入 : q
* 輸出 : 無(wú)
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<115;j++);
}
/************ 延時(shí)函數(shù) *****************/
void delay_uint(uint z)
{
while(z--);
}
/***************清楚紅外信號(hào)暫存數(shù)組中的數(shù)據(jù)******************/
void qing(void)
{
uint i;
for(i=0;i<33;i++)
{
irdate[i]=0;
}
}
/****************分析紅外信號(hào)32位數(shù)據(jù)***************/
void deal_with(void)
{
uchar i,j,k,temp;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++) //每8位數(shù)據(jù)切換一個(gè)數(shù)組單元
{
temp=temp>>1;
if(irdate[k]>7) //根據(jù)脈沖周期的時(shí)長(zhǎng)判斷紅外數(shù)據(jù)
{
temp=temp|0x80;
}
k++;
}
irbyte[j]=temp;
}
}
/***********************三線(xiàn)發(fā)碼子程序************************/
void Send_threelines(unsigned char addr) //控制語(yǔ)音模塊播放那段地址的語(yǔ)音
{
unsigned char i;
VCS=0;
delay_1ms(5); /* 片選拉低5ms */
for(i=0;i<8;i++)
{
VSCL=0;
if(addr&0x01)
{
VSDA=1;
}
else
VSDA=0;
addr>>=1;
delay_us(150); /* 150us */
VSCL=1;
delay_us(150); /* 150us */
}
VCS=1;
delay_1ms(30);
}
/***************液晶初始化顯示函數(shù)**************/
void show_init(void)
{
LCD1602_write(0,0xC0);
LCD1602_writebyte("Height:14.0cm");//顯示旗桿總長(zhǎng)度
LCD1602_write(0,0x80);
LCD1602_writebyte("C_Height:"); //顯示當(dāng)前高度
LCD1602_write(1,0x30+Current_Height/100%10); //十位
LCD1602_write(1,0x30+Current_Height/10%10); //個(gè)位
LCD1602_writebyte(".");
LCD1602_write(1,0x30+Current_Height%10); //0.1位
LCD1602_writebyte("cm"); //單位
}
void show(void) //系統(tǒng)循環(huán)顯示函數(shù)
{
LCD1602_write(0,0x89); //顯示當(dāng)前旗幟高度
LCD1602_write(1,0x30+Current_Height/100%10);
LCD1602_write(1,0x30+Current_Height/10%10);
LCD1602_writebyte(".");
LCD1602_write(1,0x30+Current_Height%10);
}
//sys_state=0 為 旗低的狀態(tài)
//sys_state=1 為 旗頂?shù)臓顟B(tài)
//sys_state=2 為 半旗的狀態(tài)
//sys_state=3 為 正在運(yùn)行的一個(gè)狀態(tài)
//sys_state=4 為 停止的一個(gè)狀態(tài)
void key_code(void) //系統(tǒng)按鍵檢測(cè)控制程序
{
if(irdateok==1) //如果紅外信號(hào)接收完成標(biāo)志位觸發(fā) 則
{
irdateok=0;
deal_with(); //分析紅外數(shù)據(jù)
}
if((!key_1||irbyte[2]==0x44)&&sys_state==0) //如果升全旗按鍵按下(按鍵以及紅外遙控) 并旗幟處于最低部
{ //延時(shí)去抖
delay_uint(1000);
if(!key_1||irbyte[2]==0x44) //再次判斷按鍵按下
{
while(!key_1||irbyte[2]==0x44) //等待按鍵釋放
{
qing();
deal_with();
}
state=1; //跳轉(zhuǎn)升全旗流程節(jié)點(diǎn)
sys_state=3; //置為系統(tǒng)當(dāng)前狀態(tài)
led_1=0; //對(duì)應(yīng)指示燈
}
}
if((!key_2||irbyte[2]==0x40)&&sys_state==1) //如果將旗旗按鍵按下(按鍵以及紅外遙控)并旗幟處于最頂部
{
delay_uint(1000); //延時(shí)去抖
if(!key_2||irbyte[2]==0x40) //再次判斷按鍵按下
{
while(!key_2||irbyte[2]==0x40) //等待按鍵釋放
{
qing();
deal_with();
}
led_2=0; //對(duì)應(yīng)指示燈
state=3; //跳轉(zhuǎn)將全旗流程節(jié)點(diǎn)
sys_state=3; //置為系統(tǒng)當(dāng)前狀態(tài)
}
}
if((!key_3||irbyte[2]==0x07)&&sys_state==0) //如果升半旗按鍵按下(按鍵以及紅外遙控)并旗幟處于最低部
{
delay_uint(1000);//延時(shí)去抖
if(!key_3||irbyte[2]==0x07) //再次判斷按鍵按下
{
while(!key_3||irbyte[2]==0x07) //等待按鍵釋放
{
qing();
deal_with();
}
led_3=0; //對(duì)應(yīng)指示燈
state=5; //跳轉(zhuǎn)升半旗流程節(jié)點(diǎn)
sys_state=3; //置為系統(tǒng)當(dāng)前狀態(tài)
}
}
if((!key_4||irbyte[2]==0x15)&&sys_state==2) //如果半旗降下按鍵按下(按鍵以及紅外遙控)并旗幟處于最半旗狀態(tài)
{
delay_uint(1000); //延時(shí)去抖
if(!key_4||irbyte[2]==0x15) //再次判斷按鍵按下
{
while(!key_4||irbyte[2]==0x15) //等待按鍵釋放
{
qing();
deal_with();
}
state=8; //跳轉(zhuǎn)半旗將下流程節(jié)點(diǎn)
led_4=0; //對(duì)應(yīng)指示燈
sys_state=3; //置為系統(tǒng)當(dāng)前狀態(tài)
}
}
if(!key_5||irbyte[2]==0x43) //復(fù)位按鍵復(fù)發(fā)
{
delay_uint(1000); //延時(shí)去抖
if(!key_5||irbyte[2]==0x43) //再次判斷按鍵按下
{
while(!key_5||irbyte[2]==0x43) //等待按鍵釋放
{
qing();
deal_with();
}
state=11; //跳轉(zhuǎn)旗幟返回最低端節(jié)點(diǎn)
sys_state=3; //置為系統(tǒng)當(dāng)前狀態(tài)
led_1=led_2=led_3=led_4=1; //對(duì)應(yīng)指示燈
}
}
if(!key_6||irbyte[2]==0x09) //復(fù)位按鍵復(fù)發(fā)
{
delay_uint(1000); //延時(shí)去抖
if(!key_6||irbyte[2]==0x09) //再次判斷按鍵按下
{
while(!key_6||irbyte[2]==0x09)
{
qing();
deal_with();
}
Send_threelines(1);//停止語(yǔ)音播報(bào)
state=0;
sys_state=4; //停止當(dāng)前旗幟動(dòng)作
Below_dat=0;
UP_dat=0;
led_1=led_2=led_3=led_4=1; //取消指示燈
}
}
}
//sys_state=0 為 旗低的狀態(tài)
//sys_state=1 為 旗頂?shù)臓顟B(tài)
//sys_state=2 為 半旗的狀態(tài)
//sys_state=3 為 正在運(yùn)行的一個(gè)狀態(tài)
//uint UP_dat=0,Below_dat=0;
void Control_code(void)
{
switch(state)
{
case 0: //停止轉(zhuǎn)動(dòng)
P2 &= 0xf0;
P2 |= 0x00;
break;
case 1: //升全旗 并播音
Send_threelines(0);
UP_dat=8800;
state=2;
break;
case 2: //判斷是否升到最頂端
if(UP_dat==0)
{
state=0;
sys_state=1;
led_1=1;
Current_dat=8800;
}
break;
case 3: //將全旗
Below_dat=8800;
state=4;
break;
case 4: //判斷是否將到最低端
if(Below_dat==0)
{
state=0;
sys_state=0;
led_2=1;
Current_dat=0;
}
break;
case 5: //升全旗 并播音
Send_threelines(0);
UP_dat=8800;
state=6;
break;
case 6: //判斷是否升到最頂端 并降半旗
if(UP_dat==0)
{
Below_dat=2933;
state=7;
}
break;
case 7: //判斷是否將到半旗狀態(tài)
if(Below_dat==0)
{
state=0;
sys_state=2;
led_3=1;
Current_dat=8800-2933;
}
break;
case 8: //升半旗
UP_dat=2933;
state=9;
break;
case 9: //判斷是否上升完成 并降全旗
if(UP_dat==0)
{
Below_dat=8800;
state=10;
}
break;
case 10: //判斷是否將到最低端
if(Below_dat==0)
{
state=0;
sys_state=0;
led_4=1;
Current_dat=0;
}
break;
case 11: //停止語(yǔ)音播報(bào) 并將旗幟降到最低端
Send_threelines(1);
UP_dat=0;
Below_dat=Current_dat;
state=12;
break;
case 12: //判斷是否將到最低端
if(Below_dat==0)
{
state=0;
sys_state=0;
}
break;
}
Current_Height=Current_dat/62.8; //當(dāng)前旗幟高度計(jì)算
if(Current_Height>140) Current_Height=140;
if(dat_A!=Current_Height) //如果顯示的旗幟高度不等于實(shí)際高度 從新賦值并保存
{
dat_A=Current_Height;
SectorErase(0x2000); //保存當(dāng)前報(bào)讀
byte_write(0x2000,Current_Height);
}
}
void Time_init(void) //定時(shí)器初始化配置
{
TMOD = 0x20;
TH1 = 0x00;
TL1 = 0x00;
ET1 = 1;
TR1 = 1;
}
void main(void) //系統(tǒng)主程序
{
Time_init(); // 調(diào)用定時(shí)器初始化配置程序
EA=1; //打開(kāi)總中斷
EX0=1; //打開(kāi)外部中斷0
IT0=1; //配置觸發(fā)方式
delay_uint(20000); // 系統(tǒng)等待延時(shí)
Current_Height=byte_read(0x2000); //讀取EEPROM中存儲(chǔ)的數(shù)據(jù)
if(Current_Height>140) Current_Height=0; //如果當(dāng)前高度數(shù)據(jù)不正確則重新賦值
if(Current_Height==0) sys_state=0; //判讀當(dāng)前系統(tǒng)工作模式
else if(Current_Height==140)sys_state=1;
else if(Current_Height>90&&Current_dat<100) sys_state=2;
else sys_state=4;
Current_dat=Current_Height*62.8; //高度計(jì)算
if(Current_dat>8800) Current_dat=8800;
LCD1602_cls(); //液晶屏初始化程序調(diào)用
show_init(); //顯示內(nèi)容初始化調(diào)用程序
while(1)
{
show(); //顯示函數(shù)
key_code(); //按鍵處理函數(shù)
Control_code(); //系統(tǒng)控制函數(shù)
}
}
void Time_2() interrupt 3
{
irtime++;
speed_dat++;
if(speed_dat>17) //8600-8800 旗桿走一桿110mm
{
speed_dat=0;
if(UP_dat!=0)
{
P2 &= 0xf0;
P2 |= zz[circulation]; //步進(jìn)電機(jī)控制
circulation=(circulation+1)%8;
UP_dat--;
if(Current_dat<8800) Current_dat++;
}
if(Below_dat!=0)
{
P2 &= 0xf0;
P2 |= fz[circulation]; //步進(jìn)電機(jī)控制
circulation=(circulation+1)%8;
Below_dat--;
if(Current_dat!=0) Current_dat--;
}
}
}
void int0() interrupt 0 //外部中斷0 中斷程序 用于接收紅外數(shù)據(jù)信號(hào)
{
if(irflag==1)
{
if(irtime>32) //判斷起始信號(hào)
{
bitnum=0;
}
irdate[bitnum]=irtime;
irtime=0;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
1-程序.rar
(46.23 KB, 下載次數(shù): 23)
2018-5-9 20:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1