1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
單片機智能路燈控制系統仿真及源程序
[打印本頁]
作者:
51黑ff
時間:
2016-9-26 16:27
標題:
單片機智能路燈控制系統仿真及源程序
0.png
(38.01 KB, 下載次數: 141)
下載附件
2016-9-26 16:23 上傳
單片機智能路燈控制系統仿真工程文件及程序下載:
智能路燈控制系統程序 仿真.rar
(185.5 KB, 下載次數: 235)
2016-9-26 16:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
如果還有不完善的地方,希望大家一起改進
源程序:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
#define AddWr 0x90 //寫數據地址
#define AddRd 0x91 //讀數據地址
#define _Nop() _nop_() //定義空指令
sbit IR=P3^2; //紅外接口標志
sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
sbit LATCH2=P2^3;// 位鎖存
sbit SDA=P2^1;
sbit SCL=P2^0;
bit irpro_ok,irok;
bit ack; //應答標志位
extern bit ack; //外部點應答
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
unsigned char irtime;//紅外用全局變量
unsigned char IRcord[4];
unsigned char irdata[33];
unsigned char TempData[8]; //存儲顯示值的全局變量
unsigned char RcvByte();
unsigned char ReadADC(unsigned char Chl);
unsigned char kkk;
long num;
void Ir_work(void);
void Ircordpro(void);
void delay(unsigned int t); //函數聲明
void Display();
void asd(unsigned char t);
void shaomiao(void);
void Start_I2c();
void Stop_I2c();
void SendByte(unsigned char c);
void NoAck_I2c(void);
void _nop_(void);
void guang(void);
void zhixing(void);
void mjian(void);
void mjia(void);
void hjian(void);
void hjia(void);
void jieshu(void);
void kaiguan(void);
void kaiguan()
{ kkk++;
while(kkk==2)
kkk=0;
}
void jieshu()
{ P1=0xff;
DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;
kkk++;
if(kkk==2)
{kkk=0;}
}
void mjian()
{ num=num-60;
if(num<=0)
{num=86400+num;}
zhixing();
}
void mjia()
{ num=num+60;
if(num>=86400)
{num=num-86400;}
zhixing();
}
void hjian()
{ num=num-3600;
if(num<=0)
{num=86400+num;}
zhixing();
}
void hjia()
{ num=num+3600;
if(num>=86400)
{num=num-86400;}
zhixing();
}
void shaomiao(void)
{ if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
{
Ir_work();
}
}
}
void asd(unsigned char t)
{
num=t*3600 ;
zhixing();
}
void zhixing()
{
unsigned char i;
while(num>0)
{for(i=0;i<80;i++)
{
TempData[0]=dofly_DuanMa[num/36000];
TempData[1]=dofly_DuanMa[(num/3600)%10];
TempData[2]=0x40;
TempData[3]=dofly_DuanMa[(num%3600)/600];
TempData[4]=dofly_DuanMa[(num%600)/60];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[(num%60)/10];
TempData[7]=dofly_DuanMa[(num%60)%10];
Display();
}
shaomiao();
if(kkk==0)
{guang();}
num--;
}
jieshu();
}
void Delay(unsigned int t)
{
while(--t);
}
void Display()
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;
DataPort=dofly_WeiMa[i]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=TempData[i]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
Delay(80); // 掃描間隙延時,時間太長會閃爍,太短會造成重影
}
DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;
}
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于計數2個下降沿之間的時間
}
void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
i=0;
irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
void TIM0init(void)//定時器0初始化
{
TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00; //重載值
TL0=0x00; //初始化值
ET0=1; //開中斷
TR0=1;
}
void EX0init(void)
{
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
void Ir_work(void)//紅外鍵值散轉程序
{
switch(IRcord[2])//判斷第三個數碼值
{
case 0x0c:asd(1);break;//1
case 0x18:asd(2);break;//2
case 0x5e:asd(3);break;//3
case 0x08:asd(4);break;//4
case 0x1c:asd(5);break;//5
case 0x5a:asd(6);break;//6
case 0x42:asd(7);break;//7
case 0x52:asd(8);break;//8
case 0x4a:asd(9);break;//9
case 0x07:mjian();break;//9
case 0x15:mjia();break;//9
case 0x44:hjian();break;//9
case 0x40:hjia();break;//9
case 0x43:num=0;break;//9
case 0x09:kaiguan();break;//9
case 0x16:P1=0xff;;break;//9
default:break;
}
irpro_ok=0;//處理完成標志
}
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //處理4個字節
{
for(j=1;j<=8;j++) //處理1個字節8位
{
cord=irdata[k];
if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//處理完畢標志位置1
}
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //啟動總線
SendByte(AddWr); //發送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //發送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //發送非應位
Stop_I2c(); //結束總線
return(Val);
}
void Start_I2c()
{
SDA=1; //發送起始條件的數據信號
_Nop();
SCL=1;
_Nop(); //起始條件建立時間大于4.7us,延時
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //發送起始信號
_Nop(); //起始條件鎖定時間大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //鉗住I2C總線,準備發送或接收數據
_Nop();
_Nop();
}
void Stop_I2c()
{
SDA=0; //發送結束條件的數據信號
_Nop(); //發送結束條件的時鐘信號
SCL=1; //結束條件建立時間大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //發送I2C總線結束信號
_Nop();
_Nop();
_Nop();
_Nop();
}
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
{
if((c<<BitCnt)&0x80)SDA=1; //判斷發送位
else SDA=0;
_Nop();
SCL=1; //置時鐘線為高,通知被控器開始接收數據位
_Nop();
_Nop(); //保證時鐘高電平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位發送完后釋放數據線,準備接收應答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判斷是否接收到應答信號
SCL=0;
_Nop();
_Nop();
}
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; //置數據線為輸入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置時鐘線為低,準備接收數據位
_Nop();
_Nop(); //時鐘低電平周期大于4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置時鐘線為高使數據線上數據有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
void NoAck_I2c(void)
{
SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //時鐘低電平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收
_Nop();
_Nop();
}
void guang()
{
unsigned char num1=0; //主循環
{
num1=255-ReadADC(0);//值取差值,用于顯示光強越小,數值越小
if(num1 >=70)
{P1=0xff;}
else if(num1>=60)
{P1=0xfe;}
else if(num1>=50)
{P1=0xfc;}
else if(num1>=40)
{P1=0xf8;}
else if(num1>=30)
{P1=0xf0;}
else if(num1>=20)
{P1=0xe0;}
else if(num1>=10)
{P1=0xc0;}
else if(num1>=5)
{P1=0x80;}
else{P1=0x00;}
}
}
void main(void)
{
EX0init(); //初始化外部中斷
TIM0init();//初始化定時器
while(1)//主循環
{
if(kkk==0)
{guang();}
if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
{
Ir_work();
}
}
}
復制代碼
作者:
517949772
時間:
2018-1-16 14:19
厲害了
作者:
我解抒情
時間:
2018-1-16 17:03
學習了,厲害
作者:
nieqijuen
時間:
2018-1-18 08:56
這個燈是通過時間來控制開關的嗎?還是通過光感
作者:
yilinghai
時間:
2018-5-2 12:50
樓主,有沒有相關原理說明
作者:
時光ning
時間:
2018-12-13 09:38
有報告嗎?
作者:
gsdaigdhqwjkqwa
時間:
2019-1-14 15:11
厲害了老哥
作者:
gsdaigdhqwjkqwa
時間:
2019-1-14 15:14
有原理或者實現的功能介紹嗎?
作者:
Banner
時間:
2019-1-29 12:25
有具體的功能介紹嗎?我新手,還不知道怎么控制等多個單片機一起工作
作者:
a1027211708
時間:
2019-4-23 11:47
樓主厲害
作者:
a1027211708
時間:
2019-4-23 11:47
牛逼牛逼
作者:
易白鹿
時間:
2019-4-25 15:42
想問問都實現了什么功能?
作者:
lililili123456
時間:
2019-11-28 18:51
作者寫的特別好
作者:
lililili123456
時間:
2019-11-29 07:25
為社么圖下載不了?
作者:
1243785926
時間:
2019-11-29 12:03
不錯的資源
作者:
哈哈長老
時間:
2020-11-5 10:59
請問那個示波器怎么調波形
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1