📄 main.c
字号:
#include <c8051f350.h>
#include <intrins.h>
#include "adc.h"
#include "I2C.h"
#include "menu.h"
#include "math.h"
#include "variable.h"
sbit SRCLK =P0^0;
sbit SER =P0^2;
sbit SDA =P0^6;
sbit SCL =P0^7;
sbit RCK0 =P1^1;
sbit RCK1 =P1^2;
sbit RCK2 =P1^3;
sbit RCK3 =P1^4;
sbit RCK4 =P1^5;
sbit KR =P1^6;
void wait(unsigned char del);
void IO_init(void);
void Timer_init(void);
void Inter_init(void);
/**********************************************
*/
void AlarmOut()
{
unsigned char i;
//ACC = val;
for (i=8;i>0;i--)
{
SRCLK=0;//拉低74HC595时钟
SER=0;//crol(ACC,1);// CY;//发送74HC595一位串行数据
//_nop_();//wait(1);
SRCLK=1;//拉高74HC595时钟
//_nop_();//wait(1);//延时
}
RCK2=0;
_nop_();//wait(2);//延时
RCK2=1;
_nop_();//wait(2);
RCK2=0;
}
void main(void)
{
//系统时钟设置
//PCA0MD &= ~0x40;//禁止看门狗
PCA0MD = 0x00;
Inter_init();
Timer_init();
//端口初始化
IO_init();
//ADC初始化
Adc_init();
//DAC初始化
Dac_init();
//SMBus初始化
SMbus_init();
EA=1;
//显示参数初始化
timer_cnt=0;
disp_sta=0x80;
disp_cnt=0x08;
//RCK0=0;
//RCK1=0;
//RCK2=0;
//RCK3=0;
//RCK4=0;
//SER=1;
//SRCLK=1;
Dac_hdl(24);
//SMbus_24c02_read(2);
AlarmOut();
dem_flag=0;
pin_flag=0;
load_ref();//加载参数
while(1)
{
if(ref_table[ref_sn]<rt_start)//判断当前设置的是阻型还是偶型
{
pin_flag=0; //偶型
}
else
{
pin_flag=1; //阻型
}
//AD采样
if(pin_flag)
ad_value=Adc0_hdl(0x67);//阻
else
ad_value=Adc0_hdl(0x45);//偶
//选择精度范围
if(!dem_flag)
choose_range();
//温度数据处理
if(!menu_flag)
{
temp_process();
switch(led_degree) //led_degree为计算出来的温度值
{
case degree_brok:
renew_page_high(Itm_brok);
break;
case degree_overflow:
renew_page_high(Itm_overflow);
break;
//case sc_overflow:
// renew_page_high(Itm_1sc);
// break;
default:
dis_flag=1;
if(pin_flag)
point_pos=2;
display_num(led_degree);
}
}
//wait(200);
//wait(200);
//wait(200);
//wait(200);
//菜单处理
menu_hdl();
//标定操作时显示标定值
if(dem_flag)
{
if(pin_flag)
ref_table[ref_buffer+volt_range1-counter]=Adc0_hdl_f(0x67);
else
ref_table[ref_buffer+volt_range1-counter]=Adc0_hdl_f(0x45);
point_pos=point_pos_1;
dis_flag=0;
display_num(ref_table[ref_buffer+volt_range1-counter]);
}
}
}
/*******************************************
中断初始化
*******************************************/
void Inter_init(void)
{
EIE1= 0x01;//中断允许
IE = 0x20;
EIP1= 0x01;//中断优先
}
/*******************************************
定时器初始化
*******************************************/
void Timer_init(void)
{
CLKSEL =0;//选择内部时钟
OSCICN =0x80;//内部时钟使能,8分频
TCON =0x10;
TMOD =0x02;//T0作为波特率发生器
SMB0CF =0x00;
CKCON =0x01;
TH0 =0xda;
TL0 =0xda;
//CKCON =0x10;
TMR2CN =0x04;//T2显示键盘中断定时
TMR2RLL =0x00;
TMR2RLH =0x00;
TMR2L =0x00;
TMR2H =0x00;
}
/*******************************************
端口初始化
*******************************************/
void IO_init(void)
{
XBR0 =0x05;//I2C,UART使能
XBR1 =0x40;//交叉开关使能
P0MDIN =0xff;//数字输入
P0MDOUT =0;
P0SKIP =0x0f;//???
P1MDIN =0xff;//数字输入
P1MDOUT =0;
P1SKIP =0x80;//交叉开关跳过DA1输出脚
}
/********************************************
函数名: Display_LED
功能: 用数码管显示显示缓冲区内容,并检测键盘
形式参数:无
返回值:无
********************************************/
void Display_LED(void) interrupt 5
{
unsigned char i,j,sta1,cod,key;
timer_cnt++;
if(timer_cnt==50)
{
timer_cnt=0;
key=0;
//for(k=8;k>0;k--)
//{
if(disp_cnt==0)
disp_cnt=0x08;
disp_cnt--;
cod=display[disp_cnt];
sta1=~disp_sta;
for(j=8;j>0;j--)
{
sta1<<=1;
SRCLK=0;//拉低74HC595时钟
SER=CY;//发送74HC595一位串行数据
//wait(1);//延时
SRCLK=1;//拉高74HC595时钟
//wait(1);//延时
}
for(i=8;i>0;i--)
{
cod<<=1;
SRCLK=0;//拉低74HC595时钟
SER=CY;//发送74HC595一位串行数据
//wait(1);//延时
SRCLK=1;//拉高74HC595时钟
//wait(1);//延时
}
RCK0=0;
RCK1=0;
_nop_();
RCK0=1;
RCK1=1;
_nop_();
RCK0=0;
RCK1=0;
if(KR==0) //检测键盘
{
curkey|=disp_sta;
curkey&=0x0f;
}
//else
// curkey=0;
disp_sta>>=1;//显示下一位
if(disp_sta==0)
{
disp_sta=0x80;
if(lastkey==curkey)
{
if(curkey==0)
{//无键按下
keyval=0;
keycount=0;
key_mov=1;
keycnt=0;
}
else
{//有键按下
keycnt++;
if(keycnt==1)
{
keycnt=0;
keyval=curkey;
keycount++;
if(keycount==100)
{
keycount=0;
key_mov*=10;
if(key_mov>100)key_mov=100;
}
}
}
}
else
lastkey=curkey;
curkey=0;
}
}
}
/********************************************
函数名: SMbus_ISR
功能: SMbus中断服务,
形式参数:无
返回值:无
********************************************/
void SMbus_ISR(void)interrupt 7
{
switch (SMB0CN & 0xF0)
{
case 0xe0:
SMB0DAT=Slave;
SMB0DAT |=SMB_RW;
STA=0;
//wait(1);
break;
case 0xc0:
if(ACK)
{
if(RW_flag==1)//读操作
{
if(Ack1==0)
{
Ack1=1;
SMB0DAT=Dat_addr;
}
else if(Ack2==0)
{
Ack2=1;
SMB_RW=1;
STA=1;
}
else
break;
}
else //写操作
{
if(Ack1==0)
{
Ack1=1;
SMB0DAT=Dat_addr;
}
else if(Ack2==0)
{
Ack2=1;
SMB0DAT=Dat_val;
}
else
{
SMB_BUSY=0;
STO = 1;
}
}
}
else
STA=1;
break;
case 0x80:
Dat_24C02= SMB0DAT;
SMB_BUSY = 0;
ACK = 0;
STO = 1;
break;
default:
SMB0CN &= ~0x40;
SMB0CN |= 0x40;
SMB_BUSY = 0;
}
SI=0;
}
/********************************************
函数名: wait
功能: 延时
形式参数:del--延时长度
返回值:无
*********************************************/
void wait(unsigned char del)
{
unsigned char l;
for(l=0;l<del;l++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -