/********************************************************************/
//宏觀聲明
#include
#include
#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
/*
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
/********************************************************************/
//EEPROM 聲明文件
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83
/********************************************************************/
//紅外學習聲明
uchar data IRcode[4],IRcode2[4];
uchar CodeTemp;
uchar i,j,k,p,studyi,num;
uchar IRS_STATE=0;
uchar idata key_ircode[30][4];
sbit IRsignal=P3^2;
sbit LED1=P1^6;
sbit LED2=P1^7;
/********************************************************************
sbit Skey=P2^7;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit key5=P2^4;
/********************************************************************/
//I2C聲明文件
sbit SDA=P3^3;
sbit SCL=P3^7;
/********************************************************************/
uchar data keynum;
/********************************************************************/
//-----------------------------------------------------
//static bit OP; //紅外發射管的亮滅
//static unsigned int count; //延時計數器
//static unsigned int endcount; //終止延時計數
static unsigned char Flag; //紅外發送標志
char iraddr1; //十六位地址的第一個字節
char iraddr2; //十六位地址的第二個字節
sbit IR_SEND=P1^3;
uchar cnt;
uint value;
//------------------------------------------------------------
#define FOSC 11059200
#define T38KHz (FOSC / 4 / 37900)
/********************************************************************/
void Delay0_9ms(void)//0.9毫秒延遲
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 10;
j = 170;
do
{
while (--j);
} while (--i);
}
void Delay1ms(void)//1毫秒延遲
{
/*********************************************************************/
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
/********************************************************************/
void Delay4ms(void)//4毫秒延遲
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 44;
j = 3;
do
{
while (--j);
} while (--i);
}
/********************************************************************
void Delay500us()//0.5毫秒延遲 //@11.0592MHz
{
unsigned char i, j;
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
********************************************************************/
void Delay(void)// 普通延遲
{
uchar i,j,k;
for(i=200;i>0;i--)
for(j=200;j>0;j--)
for(k=3;k>0;k--);
}
/*****************************************************************/
void putchar(unsigned char data1)//字符發送函數
{
SBUF = data1; //將待發送的字符送入發送緩沖器
while(TI == 0); //等待發送完成
TI = 0; //發送中斷標志請0
}
/*****************************************************************/
void putstring(unsigned char *dat)//字符串發送函數
{
for(i=0;i<4;i++) //判斷字符串是否發送完畢
{
putchar(*dat); //發送單個字符
dat++; //字符地址加1,指向先下一個字符
}
}
/****************************************************************/
void initUart(void)//串口初始化
{
TMOD=0x20; //用定時器設置串口波特率
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //開啟總中斷
ES=1;
}
/****************************************************************/
void IRinit()//紅外學習聲明初始化
{
IT0=1;
EX0=0;
EA=1;
CodeTemp=0;
}
void IICinitSteve()//I2C從總線初始化
{
IT1=0;
EX1=1;
EA=1;
}
/****************************************************************/
void PCAinit()//PCA定時器0初始化
{
CCON = 0; //Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x02; //Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
value = T38KHz;
CCAP0L = value; //P1.3 output 100KHz square wave
CCAP0H = value >> 8; //Initial PCA module-0
value += T38KHz; //Initial PCA module-0
CCAPM0 = 0x4d; //PCA module-0 work in 16-bit timer mode and enable PCA interrupt, toggle the output pin CEX0(P1.3)
CR = 0; //PCA timer start run
EA = 1;
cnt = 0;
}
/****************************************************************/
void T0init()
{
Flag = 0;
P3_4 = 1;
EA = 1; //允許CPU中斷
TMOD |= 0x01; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許
}
/****************************************************************/
void IapIdle()//EEPROM初始化
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
/****************************************************************/
uchar IapReadByte(uint addr)//EEPROM讀取命令
{
uchar dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
nop();
dat=IAP_DATA;
IapIdle();
return dat;
}
/****************************************************************/
void IapProgramByte(uint addr,uchar dat)//EEPROM 寫入命令
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
nop();
IapIdle();
}
/****************************************************************/
void IapEraseSector(uint addr)//EEPROM清除命令
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
nop();
IapIdle();
}
/****************************************************************
void keycan()
{
if(key1==0)
{
Delay();
if(key1==0)
{
while(key1==0);
keynum=0;
}
}
else if(key2==0)
{
Delay();
if(key2==0)
{
while(key2==0);
keynum=1;
}
}
else if(key3==0)
{
Delay();
if(key3==0)
{
while(key3==0);
keynum=2;
}
}
else if(key4==0)
{
Delay();
if(key4==0)
{
while(key4==0);
keynum=3;
}
}
else if(key5==0)
{
Delay();
if(key5==0)
{
while(key5==0);
keynum=4;
}
}
}
/****************************************************************/
void int0(void) interrupt 0 using 2//紅外學習命令
{
EA=0;
for(k=0;k<10;k++)
{
Delay0_9ms();
if(IRsignal==1)
{
k=10;break;
}
else if(k==9)
{
while(IRsignal==0);
Delay4ms();
Delay1ms();
// Delay500us();
for(i=0;i<4;i++)
{
for(j=1;j<=8;j++)
{
while(IRsignal==0);
Delay0_9ms();
if(IRsignal==1)
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;
}
IRcode[i]=CodeTemp;
CodeTemp=0;
}
Delay();
studyi++;
}
}
if(studyi==1)
{
for(i=0;i<4;i++)
{
IRcode2[i]=IRcode[i];
}
}
if(studyi==2)
{
for(i=0;i<4;i++)
{
if(IRcode2[i]!=IRcode[i])
{
studyi=0;
break;
}
if(i==3)
{
for(i=0;i<4;i++)
{
key_ircode[keynum][i]=IRcode[i];
}
EX0=0;
LED2=1;
}
}
studyi=0;
}
EA=1;
}
void SendIRdata(uchar IR[])
{
int i;
char irdata;
//---發紅外碼
CR = 1;
//發送9ms的起始碼
TH0 = 0xDF;
TL0 = 0x98; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;//開始計數
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
//發送4.5ms的結果碼
TH0 = 0xEF;
TL0 = 0xcb; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;//開始計數
Flag=1;
P3_4=1;
do{}while(Flag!=0);
//發送十六位地址的前八位
irdata=IR[0];
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
CR=1;
TH0 = 0xfd;
TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
TH0 = 0xf9;
TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //1為寬的高電平
}
else
{
TH0 = 0xfd;
TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //0為窄的高電平
}
Flag=1;
P3_4=1;
do{}while(Flag!=0);
irdata=irdata>>1;
}
//發送十六位地址的后八位
irdata=IR[1];
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
CR=1;
TH0 = 0xfd;
TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
TH0 = 0xf9;
TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //1為寬的高電平
}
else
{
TH0 = 0xfd;
TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //0為窄的高電平
}
Flag=1;
P3_4=1;
do{}while(Flag!=0);
irdata=irdata>>1;
}
//發送八位數據
irdata=IR[2];
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
CR=1;
TH0 = 0xfd;
TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
TH0 = 0xf9;
TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //1為寬的高電平
}
else
{
TH0 = 0xfd;
TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //0為窄的高電平
}
Flag=1;
P3_4=1;
do{}while(Flag!=0);
irdata=irdata>>1;
}
//發送八位數據的反碼
irdata=IR[3];
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
CR=1;
TH0 = 0xfd;
TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
TH0 = 0xf9;
TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //1為寬的高電平
}
else
{
TH0 = 0xfd;
TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1; //0為窄的高電平
}
Flag=1;
P3_4=1;
do{}while(Flag!=0);
irdata=irdata>>1;
}
CR=1;
TH0 = 0xfd;
TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;
Flag=1;
P3_4=0;
do{}while(Flag!=0);
CR=0;
IR_SEND=1;
P3_4=1;
Flag=0;
}
/****************************************************************/
bit iic_start_decide()////IIC 開始判斷
{
while(SCL==0);////開始不滿足條件
while((SCL==1)&&(SDA==1));///開始條件
if((SCL==1)&&(SDA==0))////開始
{
while(SCL==1);///等待到時鐘開始低跳變
return 1;
}
else
return 0;
}
/****************************************************************/
bit iic_stop_decide()////IIC 結束判斷
{
while(SCL==0);////結束不滿足條件
if((SCL==1)&&(0==SDA))////結束
{
while(SDA==0);///等待到數據開始高跳變
return 1;
}
else
{
return 0;}
}
/****************************************************************/
uchar iic_receive()
{
uchar i;
uchar rdata='0';
SDA=1;
for(i=0;i<8;i++)
{
rdata<<=1;
while(SCL==0);///當時鐘為低時,數據無效,等待
if(SDA==1)
rdata++;
while(SCL==1);///防止在一個高電平時讀8次
}
return (rdata);
}
/****************************************************************/
bit iic_ack_decide()
{
bit ack_flag;///局部變量
SDA=0;////8位發送完畢,釋放數據線SDA,準備接收應答位
while(SCL==0);///等待SCL變高電平
//ack_flag=0;
while(SCL==1);///等待SCL變高電平
SDA=1;
ack_flag=1;
return(ack_flag);
}
void keynum_receive()
{
iic_start_decide();
iic_receive();
iic_ack_decide();
iic_receive();
iic_ack_decide();
keynum=iic_receive();
iic_ack_decide();
iic_stop_decide();
}
/****************************************************************/
void main()//主程序
{
/*******************************************************************/
//初始化動作
studyi=0; //紅外學習狀態
initUart(); //串口初始化
IRinit(); //紅外學習初始化
IICinitSteve();
PCAinit();
T0init();
keynum=0xff; //按鍵初始化
/********************************************************************/
for(p=0;p<30;p++)
{
for(i=0;i<4;i++)
{
key_ircode[p][i]=IapReadByte(0x0000+(p*4)+i);
}
}
/*******************************************************************/
while(1)
{
// keycan();
while(keynum==0xff);
if(IRS_STATE==0)//遙控狀態
{
/********************************************************************
if(Skey==0)//觸發學習鍵
{
Delay();
if(Skey==0);
{
while(Skey==0);
LED1=0;
IRS_STATE=1;
}
}
/********************************************************************/
if(keynum==16)//觸發學習鍵
{
LED1=0;
IRS_STATE=1;
}
else if(keynum!=0xff)
{
putstring(key_ircode[keynum]);
SendIRdata(key_ircode[keynum]);
}
}
else if(IRS_STATE==1)//學習狀態
{
/********************************************************************/
if((keynum!=0xff)&&(keynum!=16))
{
EX0=1;
LED2=0;
while(LED2==0);
}
/********************************************************************/
if(keynum==16)//觸發學習鍵
{
LED1=1;
LED2=1;
EX0=0;
IapEraseSector(0x0000);
for(p=0;p<30;p++)
{
for(i=0;i<4;i++)
{
IapProgramByte((0x0000+(p*4)+i), key_ircode[p][i]);
}
}
IRS_STATE=0;
}
}
keynum=0xff;
}
}
/****************************************************************/
void ser() interrupt 4 //串口中斷
{
RI=0;
num=1;
}
void PCA_isr() interrupt 7 using 1
{
CCF0 = 0; //Clear interrupt flag
CCAP0L = value;
CCAP0H = value >> 8; //Update compare value
value += T38KHz; //Clear interrupt flag
}
void timeint(void) interrupt 1
{
Flag=0;
TR0=0;
}
void II2C_INT1(void) interrupt 2
{
EX1=0;
keynum_receive();
EX1=1;
}
上一篇:I2C模擬程序----匯編語言格式
下一篇:最后一頁
推薦閱讀
史海拾趣
義隆電子一直注重人才培養和團隊建設。公司積極引進國內外各知名學府的優秀人才,并提供完善的在職培訓和優厚的福利待遇。同時,公司還建立了高效的團隊協作機制,鼓勵員工之間的交流和合作。這種注重人才培養和團隊建設的策略使得義隆電子能夠保持持續的創新能力和市場競爭力。
隨著公司的發展,義隆電子不斷加大研發投入,致力于技術創新和產品多元化。公司擁有一支高素質的研發團隊,擁有多項自主知識產權和核心技術。通過不斷的技術創新和產品升級,義隆電子成功推出了微控制器、個人計算機外設芯片、數字顯示器芯片等一系列具有市場競爭力的產品。同時,公司還積極拓展智能型人機接口技術之應用芯片等新興領域,為未來的發展奠定了堅實的基礎。
在21世紀初,Freeport Resources作為一家歷史悠久的礦業公司,開始意識到電子材料市場的巨大潛力。公司決定利用其豐富的礦產資源和勘探經驗,轉向對電子級金屬材料的探索與開發。通過深入研究和市場調研,Freeport Resources成功定位了高純度銅、鈷等金屬在半導體、電路板等電子領域的應用,并逐步建立了從礦產開采到電子材料加工的完整產業鏈。這一轉型不僅為公司帶來了新的增長點,也使其在電子行業中嶄露頭角。
隨著公司業務的不斷發展,芯邦開始積極布局UWB(超寬帶通信)產品線。UWB技術以其高速率、高精度和低功耗的特點,在智能家居、物聯網等領域展現出巨大的應用潛力。芯邦通過研發UWB等信息傳輸技術及產品,致力于從移動存儲及智能家電市場出發,以手機及移動智能設備、車規及汽車周邊產品應用、智能家居及物聯網領域為目標市場,打造多系列產品線格局,提升公司的市場競爭力。
隨著技術實力的不斷提升,鈺創科技開始積極拓展國際市場。公司憑借高品質的產品和專業的技術服務,成功打入歐美等發達國家市場。在國際市場上,鈺創科技面臨著更加激烈的競爭和更高的品質要求。然而,公司始終堅持以客戶為中心的經營理念,不斷提升產品和服務質量,贏得了越來越多客戶的信賴和支持。
在激烈的市場競爭中,BELLING LEE公司始終堅持品質至上的原則。公司從原材料采購、生產制造到售后服務都嚴格把關,確保每一款產品都能達到高品質標準。這種對品質的執著追求贏得了客戶的信任和好評,也為公司贏得了良好的口碑和品牌形象。
請哪位高手指導一下,如何看下面的定義: #ifndef NULL #define NULL ((void *) 0) #endif 主要是“ ((void *) 0) ”,為什么這么復雜?… 查看全部問答∨ |
|
我現在有個新茂的SM5964C40P 0909C N11952CMN 型單片機,由于不想編程,想直接把里面的程序燒出來,那位大俠能告訴我這個型號的能燒出來嗎,… 查看全部問答∨ |
|
我插上2.4GRF無線鼠標,可以使用,但是我想知道它加載的什么驅動,怎么辦?插上和拔下串口都無打印信息,用驅動調試助手查看加載的驅動,停用相關的都沒發現,幫幫我?!? 查看全部問答∨ |
【散分】:昨天、今天跑通了51+12864液晶字符、圖形顯示程序! 液晶型號CA12864A(帶字庫,7920控制器),C51單片機。程序C、ASM的都有。兩個早上,所有問題迎刃而解,高興中!… 查看全部問答∨ |
我用Protel99畫的板子,做出來焊接之后發現有問題,用萬用表量的好辛苦才發現有個引腳焊短路了,不知道有什么工具可以檢測板子焊接的是否跟原理圖一致呢? 不怕花錢,2萬以下的設備公司還是能承受的… 查看全部問答∨ |
作了一個串口發送。仿真出現負值。頂層模塊為——module read_txd(clkin,addr_read//,num2 );input clkin;output [ 7:0] addr_read;//output [4:0]num2;reg &nbs ...… 查看全部問答∨ |
大家好,最近在看并網發電的知識,請教一下大家,我們在做理論分析時,拿什么元器件或電路來代替電網? [ 本帖最后由 secondlife110 于 2012-8-28 11:43 編輯 ]… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 艾邁斯歐司朗進一步優化紅外激光產品 滿足極高要求3D傳感應用需求
- 大聯大詮鼎集團推出基于立锜科技產品的140W電源適配器方案
- Vicor將在2025中國國際低空經濟產業創新發展大會上展示eVTOL 800V平臺DC-DC解決方案
- 研華「Edge Computing & WISE-Edge in Action」主題論壇隆重登場
- 研華攜手高通 加速推動AIoT物聯網邊緣智慧創新
- 英飛凌攜手優優綠能,助力電能轉換效率新突破
- 邊緣 AI:物聯網實施新標桿
- 全局快門圖像傳感器技術的改進提升了機器視覺效率
- 聯想自研5nm芯片SS1101跑分曝光:對標第二代驍龍8
- Arm 與微軟合作,為基于 Arm 架構的 PC 和移動設備應用提供超強 AI 體驗