1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
同求,怎么做?????
|
|
|
|
我操,你们这是典型的伸手党啊
|
|
|
|
/*
************************************************************************************************************* * (c) Copyright 2014-, LanWei Company * All Rights Reserved * 文件名:main.c * 描 述:工程主文件已完成 * 功 能:PWM信号控制灯的亮灭程度OK * 用定时器0 和 定时器1,模拟PWM(Pulse Width Modulation) * 作者:MADE BY DA HE TAO * Q Q :597627977 * 版本号:1.0.2(2015.2.17) ************************************************************************************************************* */ #include"reg52.h" /* *描述:数据类型定义 */ typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; /* *描述:位声明 */ ***it ADDR0 = P1^0; ***it ADDR1 = P1^1; ***it ADDR2 = P1^2; ***it ADDR3 = P1^3; ***it ENLED = P1^4; ***it IR_INPUT = P3^3; /* *描述:全局变量定义 */ bit irflag = 0; uint8 IrCode[4]; uint32 PeriodCnt = 0;//周期计数值 uint8 HighRH = 0; uint8 HighRL = 0; uint8 LowRH = 0; uint8 LowRL = 0; /* *描述:函数前置声明 */ //void delay_ms(uint16 n); void InitInfrared(void); void ConfigPWM(uint16 frq,uint8 dc); uint16 GetHighTime(void); uint16 GetLowTime(void); void ClosePWM(void); void IrCodeAction(void); /* *描述:主函数 */ void main(void) { EA = 1; ENLED = 0; ADDR3 = 1; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; InitInfrared(); while(1) { if(irflag) { irflag = 0; IrCodeAction(); } } } /* *描述:延时函数 */ //void delay_ms(uint16 n) //{ // uint8 m = 120; // // while(n--) // while(m--); //} void IrCodeAction(void) { static uint8 a = 0; if((IrCode[2] == 0x11) && a == 0) { ConfigPWM(100,99); a++; } else if((IrCode[2] == 0x11) && a == 1) { ConfigPWM(100,50); a++; } else if((IrCode[2] == 0x11) && a == 2) { ConfigPWM(100,1); a++; } else if((IrCode[2] == 0x11) && a == 3) { ClosePWM(); a = 0; } } /* *描述:红外初始化函数 */ void InitInfrared(void) { IR_INPUT = 1; TMOD &= 0X0F; TMOD |= 0X10; TR1 = 0; ET1 = 0; IT1 = 1; EX1 = 1; } /* *描述:PWM配置函数 */ void ConfigPWM(uint16 frq,uint8 dc) { uint16 High,Low; PeriodCnt = (11059200 / 12) / frq;//周期计数次数 High = (PeriodCnt * dc) / 100;//高电平的计数次数 Low = PeriodCnt - High;//低电平的计数次数 HighRH = (65536 - High + 12) / 256; HighRL = (65536 - High + 12) % 256; LowRH = (65536 - Low + 12) / 256; LowRL = (65536 - Low + 12) % 256; TMOD &= 0XF0; TMOD |= 0X01; TH0 = HighRH; TL0 = HighRL; TR0 = 1; ET0 = 1; P0 = 0XFF; } /* *描述:高电平获取函数 */ uint16 GetHighTime(void) { TH1 = 0; TL1 = 0; TR1 = 1; while(IR_INPUT) { if(TH1 >= 0X40) { break; } } TR1 = 0; return (TH1 * 256 + TL1); } /* *描述:低电平获取函数 */ uint16 GetLowTime(void) { TH1 = 0; TL1 = 0; TR1 = 1; while(!IR_INPUT) { if(TH1 >= 0X40) { break; } } TR1 = 0; return (TH1 * 256 + TL1); } /* *描述:关闭PWM */ void ClosePWM(void) { TR0 = 0; ET0 = 0; P0 = 0XFF; } /* *描述:外部中断1解码函数 */ void EXINT1_ISR() interrupt 2 { uint8 i,j; uint8 byt; uint16 time; time = GetLowTime(); if((time < 7833) || (time > 8755)) { IE1 = 0; return; } time = GetHighTime(); if((time < 3866)||(time > 4608)) { IE1 = 0; return; } for(i = 0;i < 4; i++) { for(j = 0; j < 8; j++) { time = GetLowTime(); if((time < 313) || (time > 718)) { IE1 = 0; return; } time = GetHighTime(); if((time > 313) && (time < 718))///// { byt >>= 1; } else if((time > 1345) && (time < 1751)) { byt >>= 1; byt |= 0x80; } else { IE1 = 0; return; } } IrCode[i] = byt; } irflag = 1; IE1 = 0; } /* *描述:定时器0中断 */ void TIM0_IRQ_Handler() interrupt 1 { if(P0 == 0XFF) { TH0 = LowRH; TL0 = LowRL; P0 = 0XC0; } else if(P0 == 0XC0) { TH0 = HighRH; TL0 = HighRL; P0 = 0XFF; } } /******************* (C) COPYRIGHT 2015 蓝为电子科技 *****END OF FILE****/ |
|
|
|
/*
************************************************************************************************************* * (c) Copyright 2014-, LanWei Company * All Rights Reserved * 文件名:main.c * 描 述:工程主文件已完成 * 功 能:PWM信号控制灯的亮灭程度OK * 用定时器0 和 定时器1,模拟PWM(Pulse Width Modulation) * 作者:MADE BY DA HE TAO * Q Q :597627977 * 版本号:1.0.2(2015.2.17) ************************************************************************************************************* */ #include"reg52.h" /* *描述:数据类型定义 */ typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; /* *描述:位声明 */ ***it ADDR0 = P1^0; ***it ADDR1 = P1^1; ***it ADDR2 = P1^2; ***it ADDR3 = P1^3; ***it ENLED = P1^4; ***it IR_INPUT = P3^3; /* *描述:全局变量定义 */ bit irflag = 0; uint8 IrCode[4]; uint32 PeriodCnt = 0;//周期计数值 uint8 HighRH = 0; uint8 HighRL = 0; uint8 LowRH = 0; uint8 LowRL = 0; /* *描述:函数前置声明 */ //void delay_ms(uint16 n); void InitInfrared(void); void ConfigPWM(uint16 frq,uint8 dc); uint16 GetHighTime(void); uint16 GetLowTime(void); void ClosePWM(void); void IrCodeAction(void); /* *描述:主函数 */ void main(void) { EA = 1; ENLED = 0; ADDR3 = 1; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; InitInfrared(); while(1) { if(irflag) { irflag = 0; IrCodeAction(); } } } /* *描述:延时函数 */ //void delay_ms(uint16 n) //{ // uint8 m = 120; // // while(n--) // while(m--); //} void IrCodeAction(void) { static uint8 a = 0; if((IrCode[2] == 0x11) && a == 0) { ConfigPWM(100,99); a++; } else if((IrCode[2] == 0x11) && a == 1) { ConfigPWM(100,50); a++; } else if((IrCode[2] == 0x11) && a == 2) { ConfigPWM(100,1); a++; } else if((IrCode[2] == 0x11) && a == 3) { ClosePWM(); a = 0; } } /* *描述:红外初始化函数 */ void InitInfrared(void) { IR_INPUT = 1; TMOD &= 0X0F; TMOD |= 0X10; TR1 = 0; ET1 = 0; IT1 = 1; EX1 = 1; } /* *描述:PWM配置函数 */ void ConfigPWM(uint16 frq,uint8 dc) { uint16 High,Low; PeriodCnt = (11059200 / 12) / frq;//周期计数次数 High = (PeriodCnt * dc) / 100;//高电平的计数次数 Low = PeriodCnt - High;//低电平的计数次数 HighRH = (65536 - High + 12) / 256; HighRL = (65536 - High + 12) % 256; LowRH = (65536 - Low + 12) / 256; LowRL = (65536 - Low + 12) % 256; TMOD &= 0XF0; TMOD |= 0X01; TH0 = HighRH; TL0 = HighRL; TR0 = 1; ET0 = 1; P0 = 0XFF; } /* *描述:高电平获取函数 */ uint16 GetHighTime(void) { TH1 = 0; TL1 = 0; TR1 = 1; while(IR_INPUT) { if(TH1 >= 0X40) { break; } } TR1 = 0; return (TH1 * 256 + TL1); } /* *描述:低电平获取函数 */ uint16 GetLowTime(void) { TH1 = 0; TL1 = 0; TR1 = 1; while(!IR_INPUT) { if(TH1 >= 0X40) { break; } } TR1 = 0; return (TH1 * 256 + TL1); } /* *描述:关闭PWM */ void ClosePWM(void) { TR0 = 0; ET0 = 0; P0 = 0XFF; } /* *描述:外部中断1解码函数 */ void EXINT1_ISR() interrupt 2 { uint8 i,j; uint8 byt; uint16 time; time = GetLowTime(); if((time < 7833) || (time > 8755)) { IE1 = 0; return; } time = GetHighTime(); if((time < 3866)||(time > 4608)) { IE1 = 0; return; } for(i = 0;i < 4; i++) { for(j = 0; j < 8; j++) { time = GetLowTime(); if((time < 313) || (time > 718)) { IE1 = 0; return; } time = GetHighTime(); if((time > 313) && (time < 718))///// { byt >>= 1; } else if((time > 1345) && (time < 1751)) { byt >>= 1; byt |= 0x80; } else { IE1 = 0; return; } } IrCode[i] = byt; } irflag = 1; IE1 = 0; } /* *描述:定时器0中断 */ void TIM0_IRQ_Handler() interrupt 1 { if(P0 == 0XFF) { TH0 = LowRH; TL0 = LowRL; P0 = 0XC0; } else if(P0 == 0XC0) { TH0 = HighRH; TL0 = HighRL; P0 = 0XFF; } } /******************* (C) COPYRIGHT 2015 蓝为电子科技 *****END OF FILE****/ |
|
|
|
PWM定频调宽,大体思路是可以实现,具体程序建议自己写写。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:20 , Processed in 0.646274 second(s), Total 49, Slave 43 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号