/******************************************************************************
*File: main.c
*功能:向LCD输出计数值
********************************************************************************/
#include "config.h"
#define rs(1<<9)
#define rw(1<<10)
#define en(1<<11)
#define busy(1<<7)
#define ke 2
#define kec 2.5
uint8 e,ec;
fp32 ectemp,prelevel,etemp;
uint8 temp=0;
uint8 fuzzycode[21][11]=
{
{5,5,5,5,5,5,4,3,2,1,1},
{5,5,5,5,5,5,4,2,2,1,1},
{5,5,5,5,5,5,4,2,2,1,1},
{5,5,5,5,5,5,4,2,1,1,1},
{5,5,5,5,5,5,4,2,1,1,1},
{5,5,5,5,5,5,4,2,1,1,1},
{5,5,5,4,4,4,3,2,1,1,1},
{5,5,5,4,4,4,3,2,1,1,1},
{5,5,4,4,4,3,2,2,1,0,0},
{5,5,4,4,3,2,1,1,1,0,0},
{4,4,3,3,2,1,1,1,0,0,0},
{3,3,2,2,1,1,1,0,0,0,0},
{2,2,2,2,1,1,1,0,0,0,0},
{2,2,2,1,1,0,0,0,0,0,0},
{2,2,2,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,0}
};
uint8 BCD[7]; //10位二进制的显示码分别是千、百、十、个位的显示
uint32 ADC_Data;
void ShowInt(uint8 addr,uint16 num);
void ShowByte(uint8 addr,uint16 num);
uint32 AD_Convert(void);
void fuzzy(void);
void PWM0(void);
void PWM1(void);
void PWM2(void);
void PWM3(void);
void PWM4(void);
void PWM5(void);
/*****************************************************
*File: main()
*功能:显示计数值
*****************************************************/
int main(void)
{
PINSEL0=0x00020000;
PINSEL1=0x00000000;
IO0DIR=0x00cfffff; //设置为输出
IO0CLR=0xeff;
TargetInit(); //目标板初始化
ShowByte(0x80,0); //显示字符
ShowByte(0xc0,0);
fuzzy();
return(0);
}
/***********************************************************
*File:delay()
*功能:延时
***********************************************************/
void delay(uint32 dly)
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<500;i++);
}
/*************************************************************
*File: timer0_init
*功能:定时器0初始化
*************************************************************/
void timer0_init(void)
{
//定时器计数器0设置,晶振为12MHz,1s要运行1000000个周期
T0PR=0; //预分频寄存器
T0MR0=Fpclk/20; //匹配值
T0MCR=0x00000003; //开放匹配0中断
T0TCR=0x00000003; //T0PC和T0TC复位
T0TCR=0x00000001; //T0PC和T0TC复位
}
void timer1_init(void)
{
//定时器计数器1设置,晶振为12MHz,1s要运行1000000个周期
T1PR=0; //预分频寄存器
T1MR0=Fpclk/20; //匹配值
T1MCR=0x00000003; //开放匹配0中断
T1TCR=0x00000003; //T0PC和T0TC复位
T1TCR=0x00000001; //T0PC和T0TC复位
}
/*************************************************************
*File:timer0Int
*功能:定时器0中断处理程序
*************************************************************/
void _irq timer0Int(void)
{
uint32 d;
d=AD_Convert();
ShowInt(0x86,d);
VICVectAddr=0;
T0IR=0x00000001;
}
/*********************************************************************
*File:timer1Int
*功能:定时器1中断处理程序
********************************************************************/
void _irq timer1Int(void)
{
fuzzy();
VICVectAddr=0;
T0IR=0x00000001;
}
/***********************************************************************
*File:int_init()
*功能:中断初始化
************************************************************************/
void int_init(void)
{
VICIntSelect=0x00000000;
VICIntEnable=0x00000030;
VICVectCntl0=0x00000024;
VICVectAddr0=(int)timer0Int;
VICVectCntl1=0x00000025;
VICVectAddr1=(int)timer1Int;
}
/***********************************************************************
*File:ChkBusy()
*功能:检查总线是否忙
************************************************************************/
void ChkBusy()
{
IO0DIR=0xe00;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN&busy))break;
IO0CLR=en;
}
}
/***********************************************************************
*File:WrOp()
*功能:开显示函数
************************************************************************/
void WrOp(uint8 dat)
{
ChkBusy();
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再传数
IO0SET=en;
IO0CLR=en;
}
/***********************************************************************
*File:WrDat()
*功能:数据输出函数
************************************************************************/
void WrDat(uint8 dat)
{
ChkBusy();
IO0SET=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再传数
IO0SET=en;
IO0CLR=en;
}
/***********************************************************************
*File:lcd_init()
*功能:lcd初始化函数
************************************************************************/
void lcd_init(void)
{
WrOp(0x38);
WrOp(0x06); //光标加1
WrOp(0x0c); //显示
}
/***********************************************************************
*File:DisText()
*功能:显示文本函数
************************************************************************/
void DisText(uint8 addr,uint8 *p)
{
WrOp(addr);
while(*p!='\0')WrDat(*(p++));
}
/***********************************************************************
*File:DisInt()
*功能:显示文本函数
************************************************************************/
void ShowInt(uint8 addr,uint16 num) //在addr处显示数字num
{ //将num转化成5个BCD码存放在全局数组BCD【5】中
uint8 i;
for(i=5;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uint8)(num%10+0x30); //取出最低位
num/=10;
}
i=0;
while(BCD[i]==0x30&&i<4)BCD[i++]=''; //NUM转化成数组存放,没有加上小数点
BCD[5]='\0';
DisText(addr,BCD);
}
void ShowByte(uint8 addr,uint16 num) //在addr
{ //将num转化成5个BCD码存放在全局数组BCD[5]中
uint8 str1[]="MeasT:";
uint8 str2[]="SetT:";
if(addr==0x80){DisText(addr,str1);}
if(addr==0xc0){DisText(addr,str2);}
}
uint32 AD_Convert(void)
{
uint32 data;
//进行ADC模块设置,其中x<<n表示第N位设置为x(若x超过一位,则向高位顺延)
ADCR=(1<<0) | //SEL=1,选择通道0
((Fpclk/1000000-1)<<8) | //CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz
(0<<16) | //BURST=0,软件控制转换操作
(0<<17) | //CLKS=0,使用11clock转换
(1<<21) | //PDN=1,正常工作模式(非掉电转换模式)
(0<<22) | //TEST1:0=00,正常工作模式(非测试模式)
(1<<24) | //START=1,直接启动ADC转换
(0<<27); //EDGE=0(CAP/MAT引脚下降沿触发ADC转换)
delay(10);
ADC_Data=ADDR; //读取ADC结果,并清除DONE标志位
while(1)
{
ADCR=(ADCR&0x00ffff00)|0x01|(1<<24); //设置通道1,并进行第一次转换
while((ADDR&0x80000000)==0); //等待转换结束
ADCR=ADCR|(1<<24); //再次启动转换
while((ADDR&0x80000000)==0); //等待转换结束
ADC_Data=ADDR; //读取ADC结果
ADC_Data=(ADC_DATA>>6)&0x3ff; //提取A/D转换值
ADC_Data=ADC_Data*100/1024; //数值转换
data=ADC_Data;
return(data);
}
}
void PWM0(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=0; //设置PWM占空比
PWMLER=0x11;
}
void PWM1(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=Fpclk/50; //设置PWM占空比
PWMLER=0x11;
}
void PWM2(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=Fpclk/10; //设置PWM占空比
PWMLER=0x11;
}
void PWM3(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=Fpclk/10; //设置PWM占空比
PWMLER=0x11;
}
void PWM4(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=Fpclk/3.3; //设置PWM占空比
PWMLER=0x11;
}
void PWM5(void)
{
IO0DIR=1<<23;
IO0SET=1<<23;
PWMMR0=Fpclk/2.5; //设置PWM周期
PWMMR4=Fpclk/3.3; //设置PWM占空比
PWMLER=0x11;
}
void fuzzy(void)
{
uint8 U;
uint8 setlevel;
fp32 nowlevelc;
IO0DIR=1<<23;
while(1) //温度设定值
{
if((IO0PIN&0x00300000)!=0x00300000)
delay(10);
if((IO0PIN&0x00300000)!=0x0030
kongwen.rar_arm7 proteus_cpu temperature_控温
版权申诉
180 浏览量
2022-09-24
15:50:42
上传
评论
收藏 37KB RAR 举报
朱moyimi
- 粉丝: 65
- 资源: 1万+