📄 数控电源.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 + -