代码pwm.docx
《代码pwm.docx》由会员分享,可在线阅读,更多相关《代码pwm.docx(9页珍藏版)》请在冰豆网上搜索。
代码pwm
//头文件
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineTHCO0xEE-------------------------------------------------------定时器赋初值
#defineTLCO0x3F--------------------------------------------------------定时器赋初值
#defineAD_CHANNEL0----------------------------------------------------AD通道
unsignedintvx=10;
unsignedcharcodeDuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};//段选码
unsignedcharData_Buffer[6]={0,0,0,0};----------------------------------------数据缓冲区
unsignedcharHour=7,Min=0,Sec=20;//时钟时间
unsignedintflag=0;---------------------------------------------------------------1分时间到标志
bitAD_flag=0;
bitSOS_flag=0;
chartp=0;
unsignedintv;
unsignedinttemp1=600;
unsignedcharMode=0;
unsignedcharK=1;
bitflag1=0;
//vx=5在用于12864LCD的LED背光调整时上电为半亮度状态,可根据自己的用途及要求任意设定
sbitKEY_H=P2^2;---------------------------------------------------------------定义按键
sbitKEY_L=P2^1;---------------------------------------------------------------定义按键
sbitMODE=P2^0;---------------------------------------------------------------定义按键
sbitP34=P3^4;-------------------------------------------------------------------定义按键
sbitP35=P3^5;-------------------------------------------------------------------定义按键
sbitP36=P3^6;-------------------------------------------------------------------定义按键
sbitP37=P3^7;-------------------------------------------------------------------定义按键
sbitP14=P1^4;-------------------------------------------------------------------定义按键
sbitP24=P2^4;-------------------------------------------------------------------定义按键
sbitP25=P2^5;-------------------------------------------------------------------定义按键
sbitP26=P2^6;-------------------------------------------------------------------定义按键
sbitP27=P2^7;-------------------------------------------------------------------定义按键
sbitP32=P3^2;-------------------------------------------------------------------定义按键
/*******************************************************************************/
voidPWM_init(void)
{//PWM初始化函数
CMOD=0x02;//设置PCA定时器系统时钟SYclk/2
CL=0x00;
CH=0x00;
CCAPM1=0x42;//PWM1设置PCA工作方式为PWM方式(01000010)8位pwm输出无中断
CCAP1L=0xff;//设置PWM1初始值与CCAP0H相同
CCAP1H=0xff;//PWM1初始时为0
//启动PCA定时器
}
/******************************************************************************/
voidPWM1_set(unsignedinta)
{//PWM1占空比设置函数
CCAP1L=a;//设置值直接写入CCAP1L
CCAP1H=a;//设置值直接写入CCAP1H
}
/*****************************************************************************/
voidDelayM(unsignedinta){//延时函数1mS/次(用于1T单片机)
unsignedcharn,i,j;
while(--a!
=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
}}
/****************************************************************************/
/******************************************************************************/
voidmanual_control()//手动控制
{PWM1_set(vx*25);----------------------------------------------------------数字24是配合vx调试取得的,此时vx的赋值范围约为1-10对应最暗-最亮
//--------减调整---------//
if(KEY_L==0){
DelayM(20);//延时20毫秒消抖动
if(KEY_L==0){//如果20SM后KEY_L还是0状态则确认下调键是按下的
vx--;
if(vx<1){vx=10;}
//如果设定vx=10,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
}
while(KEY_L==0);//等待键松开
}
//--------加调整---------//
if(KEY_H==0){
DelayM(20);
if(KEY_H==0)
{
vx++;
if(vx>=11){vx=1;}
}
while(KEY_H==0);
}
}
/******************************************************************************/
voiddispaly1()
{flag=0;
Data_Buffer[0]=0;
Data_Buffer[1]=vx;
Data_Buffer[2]=0;
Data_Buffer[3]=0;
}
/******************************************************************************/
voida1()
{
P34=0,P37=1,manual_control();dispaly1();CR=1;
}
/***********************************/
unsignedintAD_Sample(unsignedcharchannel)
{
uinti,q=0;
unsignedinttemp;
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=0x88|channel;//选择AD当前通道,并启动转换
while(!
tp)--------------------------------------------------------------------等待转换完毕
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
temp=(ADC_RES&0x03)*256+ADC_RESL;
q=q+temp;
}
temp=q/10;
returntemp;
}
////////////////////////////////////
voida2()
{if(flag1==1)
{flag1=0;
v=AD_Sample(AD_CHANNEL);
Data_Buffer[0]=v/1000;
Data_Buffer[1]=v/100%10;
Data_Buffer[2]=v/10%10;
Data_Buffer[3]=v%10;
}
if(v<500)
{PWM1_set(25);
}
if(v>510)
{PWM1_set(0xff);
}
}
voidAD_init()
{
P1M0=1;//P10设为A/D转换功以能
P1M1=1;
P1ASF=0X01;//通道选择
AUXR1|=0x04;
ADC_CONTR=0x80;//打开A/D转换器电源
}
/
/******************************/
voidSOS_LED()//呼吸灯子函数
{unsignedinti;
for(i=100;i<240;i=i+5)
{
PWM1_set(i);
DelayM(200);
}
for(i=240;i>100;i=i-5)
{
PWM1_set(i);
DelayM(200);
}
}
/**************************/
voidmain(void)
{
staticunsignedintflag1=0;
unsignedchari;
TMOD=0x11;//定时器0初始化
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
KEY_H=1;KEY_L=1;
PWM_init();
while
(1)
{if(MODE==0){
DelayM(20);//延时20毫秒消抖动
if(MODE==0){//如果20SM后KEY_L还是0状态则确认下调键是按下的
flag1++;
if(flag1>=4){flag1=0;}
//如果设定vx=10,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
}
while(MODE==0);//等待键松开
}
switch(flag1)
{
case0:
a1();break;
case1:
PWM_init();CR=1;P37=0;P36=1;SOS_LED();break;
case2:
CR=0,CL=0,CH=0;break;
case3:
AD_init();PWM_init();CR=1;a2();break;
}
}
}
voidtimer0()interrupt1
{staticunsignedcharcount=0;
staticunsignedcharAD_count=0;
staticunsignedcharBit=0;//静态变量,退出程序后,值保留
TH0=THCO;
TL0=TLCO;
if(flag==1)
count++;
if(count>=200)//秒计时,定时器定时5ms,计200次为一秒
{
count=0;
Sec--;}
if(Sec==0){Sec=20,CR=0,CCON=0;
CL=0;//复位PCA的计数器
CH=0;
flag=0;}
AD_count++;
if(AD_count>=100)//半S时间到
{
AD_count=0;
flag1=1;
}
Bit++;
if(Bit>=4)Bit=0;
P24=P25=P26=P27=1;//先关位码
P0=Duan[Data_Buffer[Bit]];//开段码
if(count<100&&Bit==1)P0|=0x80;//0.5S中间小数点亮,之后灭,不断循环
switch(Bit)//送位码
{
case0:
P24=0;break;
case1:
P25=0;break;
case2:
P26=0;break;
case3:
P27=0;break;
}
}