⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数控电源.txt

📁 完整的PIC16F873A控制的数控电源设计程序
💻 TXT
字号:
#include	<pic.h>
#include 		<math.h>
#include 		<stdio.h>
unsigned int  i;
unsigned char data,COUNTW;  
const	char	table0[10]={0x80,0xf2,0x48,0x60,0x32,0x24,0x04,0xf0,0x00,0x20};	//带小数的显示段码
const	char	table[10]={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21};  //不带小数的显示段码
bank1  unsigned	 char s[3];		
bank1  unsigned  char k[3];	
bank1  int  addata,uo;
//*****************************************************************
//A/D转化初始化子程序
void		 adinitial()
{
	ADCON0=0x41;			//选择A/D通道为RA0,打开A/D转换器
		     				//在工作状态,且使A/D转换时钟为8tosc
	ADCON1=0X0E;			//转换结果右移,及ADRESH寄存器的高6位为"0"
	                 		//且把RA1口设置为模拟量输入方式
	ADIE=1;				//A/D转换中断允许
	PEIE=1;				//外围中断允许
	TRISA0=1;				//设置RA1为输入方式
}
//***********************************************************
//TMR0初始化子程序
void	tmint()
{
	T0CS=0;				//TMR0工作于定时器方式
	PSA=1;					//TMR0不用分频
	TMR0=0x00;		//定时器1清0
	T0IF=0;					//清除TMR0的中断标志
	T0IE=1;					//TMR0中断允许
}
//*************************************************************
void	sfz()
{	
	s[0]=k[2];
	s[1]=k[1];
	s[2]=k[0];
	
}
//*************INITIAL SPI***********************************
void 	SPIINIT()
{
	PIR1=0;
	SSPCON=0x30;
	SSPSTAT=0xC0;
	TRISC=0xD1;				
	TRISA5=0;					
}
//initial pwm
void pwmint()
{
 	CCPR1L=0XBF;
 	CCP1CON=0X3C;	//设置CCP1模块为PWM工作方式,且其工作
	CCPR2L=0x0FC;
	CCP2CON=0X3C;   //循环的低2位为11,高8位为01111111=7F*/
 	INTCON=0X00;	//禁止总中断和外围中断*/
 	PR2=0XFF;	//设置PWM的工作周期*/
 	TRISC=0XD1;	//设置CCP1\CCP2引脚为输出方式*/ 
}

//***************SPI传送数据子程序********************************
void  spiled(unsigned char Sdata)
{
	SSPBUF=Sdata;	//启动发送
	do{  ;	}while(SSPIF==0); SSPIF=0;
}
//****************************************************************
//显示子程序
void	display()
{
  	SPIINIT();
	sfz();
 	RA5=0;	 //准备锁存
	for(COUNTW=0;COUNTW<3;COUNTW++)
	{
		data=s[COUNTW];
		data=data&0X0F;
		if(COUNTW==0)	
			data=table0[data];  //第二位需要显示小数点
		else
			data=table[data];
		spiled(data);		   //发送显示段码
	} 
 	RA5=1;	//最后给一个锁存信号,代表显示任务完成
}
//*****************************************************************
//软件延时子程序
void 	DELAY()
 {
	for(i = 6553; --i; ) continue;
	
}
//*****************************************************************
void   pwmout()
{
	T2CON=0X04;
	if(CCPR1L<0x7F)
	{
		CCPR2L=0x7F;
	}
	else
	{
		CCPR2L=0x0FC;
	} 
}
//*****************************************************************
void	KEY()
{
 di();	//关中断
	if(RB1==0)
	  {
	  	DELAY();
	  	DELAY();
	  	di();
	  	while(RB1==0)
	  	{;}
	  	CCPR1L=CCPR1L+12;	  
	  	pwmout();	   
	  }	
	if(RB0==0)
	  {
	  	DELAY();
	  	DELAY();
	  	di();
	  	while(RB0==0)
	  	{;}
	  	CCPR1L=CCPR1L-12;
	  	pwmout();
	  } 
	if(RB2==0)
	 {
	 	DELAY();
	 	DELAY();
	  	di();
	  	while(RB2==0)
	  	{;}
	  	CCPR1L=CCPR1L+1;
	  	pwmout();
	 } 
 ei(); //开中断
}
//***************************************************************
//a/d中断服务程序
void	interrupt  adint(void)
{
	ADGO=0;
	ADIF=0;				//清除中断标志
	di();
	DELAY();
///	adresult.adre[0]=ADRESL;
///	adresult.adre[1]=ADRESH;	//读取并存储A/D转换结果,A/D转换的结果通过共
					//用体的形式放入了变量y1中   
	addata=ADRESH;		 //adresult.y1;
 	addata=(double)addata;
 	addata=addata*10;	 //为了保证显示的小数点的精度,先对电压值乘以10
	uo=(int)addata;		 //强制把U转换成有符号整型量
 	sprintf(k,"%3d",uo);
	if(uo<1000)
	{
		k[2]=k[1];
		k[1]=k[0];
		k[0]=0;
	}
	display();
	DELAY();
	ADGO=1;
}  
//********************************主程序***********************************
main()
{	
	tmint();
	SPIINIT();
	pwmint();
	PORTB=0X00;
	TRISB=0X0F;
	adinitial();
	pwmout();
	ei();
	while(1)
	{
 		ADGO=1;
 		KEY();	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -