完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
从网上DOWN了程序,优化了一下,主要想调整NEC编码的占空比(不是38K载波的占空比),但是实际测试输出LEAD波形时并不按设计的走(地址码与数据码都未发现有问题),如,695次调用tiMER0中断,输出延时是对的,但是900次调用中断后就不对了,感觉哪里有东西打断了进程?也尝试在不同的地方加中断、计数使能,但是总有问题。 我用的是STC12C5202AD单片机,用KEIL 5编译,已经将芯片导入到KEIL里,使用外部12M晶振。 代码如下: ------------------------自定义头文件---------------------------- #ifndef _C51_ZY_H_ #define _C51_ZY_H_ void UartInit(); void delay_us(int i); void IR_transfer(char iraddr1,char iraddr2,char p_irdat); void timer0_int_13us(void); void delay_100ms(int k) ; #endif ---------------主程序----------------------------------------- #include #include ***it P1_1=P1^1; // LED char iraddr1=0x44; //the first byte of the hex address char iraddr2=0x9b; //the second byte of the hex address char p_irdata=0x12; //IR DATA void main(void) { P1_1=0; AUXR |= 0x80; //SET TIMER0 1T MODE P1M1 &= 0xF7; P1M0 |= 0x08; //SET P1_3 PUSH-PULL MODE //UartInit(); IR_transfer(iraddr1,iraddr2,p_irdata); //delay_us(10); } ----------------------TIMER0初始化----------------------------- #include #include void timer0_int_13us(void) { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 ET0 = 1; TL0 = 0x64; //设置定时初值 TH0 = 0xFF; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } -----------------------延时子程序-------------------------- void delay_100ms(int k) { int i,j; for(k;k>0;k--) { for(i=0;i<150;i++) { for(j=0;j<400;j++); } } } --------------------发射程序--------------------------- #define uchar unsigned char //just for convenience #define uint unsigned int #define ulong unsigned long #include //the standard head file #include static bit OP; //the turn on or off of the IR led int count; //delay count int endcount; //terminate count unsigned char flag; //the flag of IR emission ***it P1_3=P1^3; // IR pin extern char iraddr1; //the first byte of the hex address extern char iraddr2; //the second byte of the hex address extern char p_irdata; //IR DATA int test_mode;//0 mean constant period,1 mean constant duty cycle int logic_high; int logic0_low; int logic1_low; int lead_high; int lead_low; void SendIRdata(); void IR_transfer(char iraddr1,char iraddr2,char p_irdata); //void delay_us(int i); //void timer0_int_13us(void); void IR_transfer(char iraddr1,char iraddr2,char p_irdata) { count=0; flag=0; OP=0; P1_3=0; EA = 1; // permit cpu interrupt timer0_int_13us(); //TMOD = 0x11; //set timer0&1 to the HEX mode of 1 //ET0 = 1; //permit timer0 interrupt //TH0 = 0xFF; //TL0 = 0x7d; //set timer0 have a interrup per 13us(38k/2) //TR0 = 1; //start count test_mode=0; //0 mean constant period,1 mean constant duty cycle logic_high=43; //43=0%;34=-20%,52=+20%;21=-50%,65=+50% lead_high=903; //625(-10%),556(-20%),486(-30%),417(-40%),347(-50%) //695(0%) //764(+10%),834(+20%),903(+30%),973(+40%),1000(+45%) if(test_mode==0) { lead_low=350;//1045 is standard, logic1_low=173-logic_high; //173 is standard, logic0_low=87-logic_high; //87 is standard, } else { lead_low=lead_high/2+1; //+1 为了补偿中断子程序中取反操作与赋值操作的时间差 logic0_low=logic_high+1; logic1_low=logic_high*3+1; } do{ //ET0=0; //TR0=1; //EA=1; SendIRdata(); //TR0=0; //ET0=0; //EA=0; delay_100ms(5); } while(1); } void SendIRdata() { int i; char irdata; //---------------send the starting code of 9ms--------------------- endcount=lead_high; //690 is standard, flag=1; count=0; //ET0=1;TR0=1; do{}while(count //---------------send the ending code of 4.5ms-------------------- //ET0=0;TR0=0; endcount=lead_low; // flag=0; count=0; //ET0=1;TR0=1; do{}while(count //ET0=0;TR0=0; //-----------------send the first 8 bit of the address---------------- irdata=iraddr1; for(i=0;i<8;i++) { //---------------first,send 0.56ms ir wave(38k),voltage high----------- //ET0=1;TR0=1; endcount=logic_high; flag=1; count=0; do{}while(count //----------------stop send ir wave,voltage low----------------- if(irdata-(irdata/2)*2) //judge the last binary bit is 1 or 0 { endcount=logic1_low; //1 mean wide low level } else { endcount=logic0_low; //0 mean narrow low level } flag=0; count=0; do{}while(count irdata=irdata>>1; } //-------------send the last 8 bit of the HEX address----------------- irdata=iraddr2; for(i=0;i<8;i++) { endcount=logic_high; flag=1; count=0; do{}while(count if(irdata-(irdata/2)*2) {endcount=logic1_low;} else {endcount=logic0_low;} flag=0; count=0; do{}while(count irdata=irdata>>1; } //------------------send 8 bit data--------------------- irdata=p_irdata; for(i=0;i<8;i++) { endcount=logic_high; flag=1; count=0; do{}while(count if(irdata-(irdata/2)*2) {endcount=logic1_low;} else {endcount=logic0_low;} flag=0; count=0; do{}while(count irdata=irdata>>1; } //---------------------send the 8 bit complement data---------------------- irdata=~p_irdata; for(i=0;i<8;i++) { endcount=logic_high; flag=1; count=0; do{}while(count if(irdata-(irdata/2)*2) {endcount=logic1_low;} else {endcount=logic0_low;} flag=0; count=0; do{}while(count irdata=irdata>>1; } endcount=logic_high; flag=1; count=0; do{}while(count flag=0; P1_3=0; //ET0 = 0; } //*********************************************************************************** //timer0 execute interrupt void timeint(void) interrupt 1 using 1 { //ET0=0; TH0=0xFF; TL0=0x7E; TR0=0; count++; if (flag==1) { OP=~OP; } else {OP = 0;} P1_3 = OP; //ET0=1; TR0=1; } ------------------------------- |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
725 浏览 0 评论
1126 浏览 1 评论
2508 浏览 5 评论
2841 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2688 浏览 6 评论
681浏览 7评论
新手求助makefile交叉编译生成文件不能移植到板子上运行咋办
251浏览 3评论
180浏览 3评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
993浏览 3评论
248浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 07:02 , Processed in 1.098873 second(s), Total 83, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号