完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include "STC12C5620AD.h"
#include /***************************大量宏定义区,便于代码移植**************************************/ #define UINT8 unsigned char #define UINT16 unsigned int #define FOSC 18432000L #define BAUD 9600 #define MODE 1T #ifdef MODE 1T #define T1MS (65536-FOSC/1000) /*1T模式下的1ms定时*/ #else #define T1MS (65536-FOSC/12/1000) /*12T模式下的1ms定时*/ #endif /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC power control bit #define ADC_FLAG 0x10 //ADC complete flag #define ADC_START 0x08 //ADC start control bit #define ADC_SPEEDLL 0x00 //420 clocks #define ADC_SPEEDL 0x20 //280 clocks #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks UINT16 count, comm; UINT8 temp,value; UINT8 ch; /*AD通道*/ UINT8 data IRcode[4]; //定义一个4字节的数组用来存储代码 UINT8 CodeTemp,charsend,i,j,k; //编码字节缓存变量 UINT8 Adust=0; bit flag; bit GotoIRcontrol; ***it SM0038 = P3^2; /**************************子函数声明区********************************************/ void USART_Init(void); void ADC_Init(void); void PWM_Init(void); void SendData(UINT8 dat); UINT8 ReceivData(void); UINT8 GetADCResult(UINT8 ch); void PWMSet(UINT8 a); void Delay(UINT16 n); void PWM_AdustLight(void); void TIMER0_Init(void); void IR_AdustLight(void); void EXT0_Init(void); void delay2ms(void); void delay140us(void); void delay8ms(void); /**********************************主函数*****************************************/ void main(void) { EXT0_Init(); USART_Init(); ADC_Init(); PWM_Init(); // TIMER0_Init(); EA = 1; //开总中断 while(1) { if(Adust==1) { ES=1; //允许串口中断 if(comm==0x7a) { value=GetADCResult(3); /*P1.3作为AD模拟模拟输入,即第3频道*/ PWMSet(value); SendData(value); /*将value发送到上位机软件显示*/ Delay(3); /*此延时为S*/ } // //PWM_AdustLight(); /*根据value的值调整PWM的输出*/ } if(GotoIRcontrol==1) { GotoIRcontrol=0; IR_AdustLight(); /*红外遥控调光*/ } } } /************************************************************************************** *函数名称:void USART_Init()(void) *输 入:无 *输 出:无 *功 能:串口初始化,波特率为9600bsp **************************************************************************************/ void USART_Init(void) { #ifdef MODE 1T AUXR=0xC0; /*AUXR寄存器中T0x12与T1x12决定,本程序中T0,T1都为1T模式*/ #endif SCON=0x5a; /*工作模式1、REN接收使能位为1*/ TMOD=0x21; TL1=TH1=-(FOSC/32/BAUD); TR1=1; } /************************************************************************************** *函数名称:void SendData() *输 入:串口要发送的数值 *输 出:无 *功 能:串口发送一个字节 **************************************************************************************/ void SendData(UINT8 dat) { while(!TI); TI=0; SBUF=dat; } ///************************************************************************************** //*函数名称:void ReceivData() //*输 入:无 //*输 出:返回接收值 //*功 能:串口接收一个字节 //**************************************************************************************/ //UINT8 ReceivData(void) // { // while(!RI); // RI=0; // dat=SBUF; // return dat; // // } /************************************************************************************** *函数名称:void UartIRQ(void) *输 入:无 *输 出:无 *功 能:串口中断函数 **************************************************************************************/ void UartIRQ(void) interrupt 4 { if(RI) //检测RI接收置 1 RI=0; //软件给RI 清零 comm=SBUF; //读取接收到的数据 if(comm == 0x63) //上位机自动查找采集器是否在线 { comm = 0; SendData(0x63); //发送CP的ASCII码 SendData(0x70); } } /************************************************************************************** *函数名称:void ADC_Init() *输 入:无 *输 出:无 *功 能:ADC初始化 **************************************************************************************/ /*void ADC_Init(void) { P1=P1M0=P1M1=0xFF; ADC_DATA=0; ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); } /************************************************************************************** *函数名称:UINT8 GetADCResult() *输 入:频道ch *输 出:频道ch的AD值 *功 能:获得频道ch的的AD值 **************************************************************************************/ /*UINT8 GetADCResult(UINT8 ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_DATA; /*转化的为8位数值的结果,如果要12位的则返回ADC_LOW2*/ // } /************************************************************************************** *函数名称:void Delay(UINT16 n) *输 入:n *输 出:无 *功 能:延时函数 **************************************************************************************/ void Delay(UINT16 n) { UINT16 i; while(n--) { i=5000; while(i--); } } /************************************************************************************** *函数名称:void PWM_Init() *输 入:无 *输 出:无 *功 能:PWM0初始化(P3.7) **************************************************************************************/ void PWM_Init(void) { CCON=0; CL=0; /*PCA计数器低八位置0*/ CH=0; /*PCA计数器高八位置0*/ CMOD=0x02; /*PCA工作模式*/ CCAPM0=0x42; /*设置PWM0输出*/ CCAP0L=0x00; /*初始化设置占空比为0%*/ CCAP0H=0x00; CR=1; /*打开PCA定时器*/ } /************************************************************************************** *函数名称:void PWMSet(UINT8 a) *输 入:所设PWM占空比的数值(0~FFH) *输 出:无 *功 能:设置PWM的占空比 **************************************************************************************/ void PWMSet(UINT8 a) { CCAP0L=a; CCAP0H=a; } /************************************************************************************** *函数名称:void PWM_AdustLight(void) *输 入:无 *输 出:无 *功 能:PWM调光函数 *备 注: **************************************************************************************/ void PWM_AdustLight(void) { if(value>=0xC0) PWMSet(0xE6); /*占空比95%*/ else if(value>=0x80&&value<=0xC0) PWMSet(0x80); /*占空比50%*/ else if(value>=0x40&&value<=0x80) PWMSet(0x40); /*占空比25%*/ else PWMSet(0x00); /*占空比0%*/ } /************************************************************************************** *函数名称:void TIMER0_Init() *输 入:无 *输 出:无 *功 能:定时器0初始化 **************************************************************************************/ void TIMER0_Init(void) { //TMOD=0x01; /*在USART_Init()中已打开*/ TL0=T1MS; /*不用求余*/ TH0=T1MS>>8; TR0=1; ET0=1; //EA=1; /*在USART_Init()中已打开*/ count=0; } /************************************************************************************** *函数名称:void Timer0_isr() *输 入:无 *输 出:无 *功 能:定时器0中断函数 **************************************************************************************/ void Timer0_isr() interrupt 1 { TL0=T1MS; TH0=T1MS>>8; if(count-- ==0) { count=1000; /*5ms的定时*/ flag=1; } } /************************************************************************************** *函数名称:void EXT0_Init() *输 入:无 *输 出:无 *功 能:定时器0初始化 **************************************************************************************/ void EXT0_Init(void) { EX0= 1;//开外部中断1 IT0 = 1;//外部中断1负边沿触发 } /************************************************************************************** *函数名称:void EXT0_isr(void) *输 入:无 *输 出:无 *功 能:外部中断0函数 **************************************************************************************/ void EXT0_isr(void) interrupt 0 using 0 { UINT8 N = 0; ES=0; //关闭串口中断,减少对红外解码的影响 EX0 = 0; delay2ms(); if(SM0038 == 1) { EX0 =1; return; } //确认IR信号出现 while(!SM0038); //跳过9ms低电平 while(SM0038);//跳过4.5ms高电平 for(i = 0;i < 4;i ++) // 分别读取4个字节 { for(j = 0;j < 8;j ++) //每个字节8个bit的判断 { while(SM0038 == 0);//等待上升沿 while(SM0038) { delay140us(); N ++; //此处N用来计数 if(N>=30) { EX0 = 1; //0.14ms计数过长自动离开。 return; } } CodeTemp = CodeTemp >> 1; if(N >= 8) { CodeTemp = CodeTemp | 0x80; } N = 0; } IRcode[i] = CodeTemp; CodeTemp = 0; } if (IRcode[2]!=~IRcode[3]) { EX0=1; return; } EX0 = 1; GotoIRcontrol=1; /*红外调光显示标志*/ } /************************************************************************************** *函数名称:void delay2ms(void) *输 入:无 *输 出:无 *功 能:延时函数 **************************************************************************************/ void delay2ms(void) //误差 0us { unsigned char a,b,c; for(c=5;c>0;c--) for(b=68;b>0;b--) for(a=31;a>0;a--); } /************************************************************************************** *函数名称:void delay140us(void) *输 入:无 *输 出:无 *功 能:延时函数 **************************************************************************************/ void delay140us(void) //误差 -0.026041666667us { unsigned char a,b; for(b=103;b>0;b--) for(a=6;a>0;a--); } /************************************************************************************** *函数名称:void delay8ms(void) *输 入:无 *输 出:无 *功 能:延时函数 **************************************************************************************/ void delay8ms(void) //误差 -0.054253472222us { unsigned char a,b,c; for(c=90;c>0;c--) for(b=196;b>0;b--) for(a=1;a>0;a--); } /************************************************************************************** *函数名称:void IR_AdustLight(void) *输 入:无 *输 出:无 *功 能:PWM调光函数 *备 注:先进行分档式调光 **************************************************************************************/ void IR_AdustLight(void) { temp = IRcode[2]; if(temp==0x0C) { delay8ms(); if(temp==0x0C) /*1*/ { PWMSet(0xE6); } } if(temp==0x18) { delay8ms(); if(temp==0x18) /*2*/ { PWMSet(0xBC); } } if(temp==0x5E) { delay8ms(); if(temp==0x5E) /*3*/ { PWMSet(0x80); } } if(temp==0x08) { delay8ms(); if(temp==0x08) /*4*/ { PWMSet(0x4E); } } if(temp==0x1C) { delay8ms(); if(temp==0x1C) /*5*/ { PWMSet(0x3E); } } if(temp==0x19) { delay8ms(); if(temp==0x19) /*6用100+代替*/ { PWMSet(0x1E); } } if(temp==0x42) { delay8ms(); if(temp==0x42) /*7*/ { PWMSet(0x14); } } if(temp==0x52) { delay8ms(); if(temp==0x52) /*8*/ { PWMSet(0x0A); } } if(temp==0x0D) { delay8ms(); if(temp==0x0D) /*9用200+代替*/ { PWMSet(0x03); } } if(temp==0x45) { delay8ms(); if(temp==0x45) /*开灯*/ { PWMSet(0x10); } } if(temp==0x46) { delay8ms(); if(temp==0x46) /*关灯*/ { PWMSet(0xff); } } if(temp==0x09) { delay8ms(); if(temp==0x09) /*控制是红外还是自适应调光*/ { Adust=!Adust; } } } |
|
|
|
求问这个程序里用什么控制的占空比
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
751 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
1330 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1184 浏览 0 评论
899 浏览 0 评论
947 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11864 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 10:05 , Processed in 0.558573 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号