ATMEGA8单片机基于TC1的脉宽调制器设计源码及仿真.zip
时间:10-30 16:54
查看:1031次
下载:162次
简介:
本资料为ATMEGA8单片机基于TC1的脉宽调制器设计源码及仿真等。
#include <iom16v.h>
#include <macros.h>
/********************************************************************
数据类型定义
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
数码管段码定义0123456789
*********************************************************************/
//数码管字型表,对应0,1,2,3,4,5,6,7,8,9,E//
uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};
uchar Data1[4]={0,0,0,0}; //定义初始值
uint PWM=500; //定义初始方波占空比:50%
uchar Key1_Flag,Key2_Flag; //加减按键标识
/**********************************************************************
MS级延时函数程序,参数i 延时时间
**********************************************************************/
void DelayMs(uint i) //Ms级延时,参数i为延时时间
{uint j;
for(;i!=0;i--)
{for(j=8000;j!=0;j--) {;}}
}
/**********************************************************************
显示函数
注意:使用开发板时sel=0xef;
**********************************************************************/
void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
{uchar i,sel=0x01;
for(i=0;i<4;i++)
{PORTC=sel; //选通最右边的数码管
PORTA=~Table[p[i]]; //送字型码
DelayMs(1); //显示延时
sel=sel<<1; //移位以显示前一位
}
}
/**********************************************************************
按键处理函数
**********************************************************************/
void Key_Process()
{while((PINB&0x01)==0) {Display(Data1);Key1_Flag=1;} //加标识位
while((PINB&0x02)==0) {Display(Data1);Key2_Flag=1;} //减标识位
if(Key1_Flag==1)
{
if(PWM<=1020)//设定最大值
PWM=PWM+10;
Key1_Flag=0;}
if(Key2_Flag==1)
{
if(PWM>=0) //设定最小值
PWM=PWM-10;
Key2_Flag=0;}
}
/**********************************************************************
设置输出比较寄存器值
**********************************************************************/
void Set_Process(uchar *p)
{uint i;
p[0]=PWM/1000; //求千位
p[1]=PWM%1000/100; //求百位
p[2]=PWM%100/10; //求十位
p[3]=PWM%10; //求个位
i=PWM;
OCR1AH=i>>8; //寄存器求值
OCR1AL=i&0x00ff; //寄存器求值
}
/**********************************************************************
初始化I/O口
**********************************************************************/
void Init_IO(void) //初始化I/O口
{DDRA=0xff; //设置A口为推挽1输出
PORTA=0xff;
DDRC=0xff; //设置C口为推挽1输出
PORTC=0xff;
DDRB=0x00; //设置B口为三态输入
PORTB=0x00;
DDRD=0xff; //设置D口为推挽1输出
PORTD=0xff;
}
/**********************************************************************
主函数
**********************************************************************/
void main(void)
{uchar i;
Init_IO(); //初始化I/O口
TCCR1A=0xc3; //10位PWM,向上计数清除OC1A,向下计数置位OC1A
TCCR1B=0x02; //时钟8分频,最小频率1M/2046=500Hz
while(1)
{Key_Process(); //按键处理
Set_Process(Data1); //PWM占空比
Display(Data1); //显示函数
}
}
/**********************************************************************
结束
**********************************************************************/