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

📄 main.c

📁 这是一种温度变送器的源代码
💻 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 + -