第十二届蓝桥杯单片机省赛(第二场)

main.c文件

 

 

 

 main.c文件

#include <STC15F2K60S2.H>
#include "iic.h"
#define Latch(x,y) {P0=y;P2=x;P2=0;}
void Timer1Init(void);
unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x8e,0xc8,0xc1};
unsigned char smg_1[8]={12,11,11,11,11,11,11,11};
unsigned char smg_2[8]={13,11,11,11,11,11,11,11};
unsigned char smg_3[8]={14,10,11,11,11,11,11,11};
unsigned int count_f,freq,tt,n,volt,Rd1,volt_c,freq_c,Rd1_c;
bit mode=0,LED_kai=1;
unsigned char interface=0,Trg,Cnt,count_key,count_adc;
unsigned char L1,L2,L3,L4,L5;
void Display_smg()
{
	static unsigned char dspcom;
	Latch(0xc0,0);
	if(interface==0)Latch(0xe0,smgduan[smg_1[dspcom]]);
	if(interface==1)Latch(0xe0,smgduan[smg_2[dspcom]]);
	if(interface==2){if(dspcom==5){Latch(0xe0,smgduan[smg_3[dspcom]]&0x7f);}else Latch(0xe0,smgduan[smg_3[dspcom]]);}
	Latch(0xc0,1<<dspcom);
	if(++dspcom==8)dspcom=0;
}
void Delay5ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}
void KeyScan()
{
	static unsigned char count=0;
	unsigned char ReadData=P3^0xff;
	Trg=ReadData&(ReadData^Cnt);
	Cnt=ReadData;
	if(Trg&0x08)
	{
		if(interface==0)interface=1;
		else if(interface==1)interface=2;
		else if(interface==2)interface=0;
	}
	else if(Trg&0x04)
	{
		mode=~mode;
	}
	else if(Trg&0x02)
	{
		EEPROM_Write(0x00,volt/256);Delay5ms();
		EEPROM_Write(0x01,volt%256);Delay5ms();
		EEPROM_Write(0x04,Rd1/256);Delay5ms();
		EEPROM_Write(0x05,Rd1%256);Delay5ms();
	}
	else if(Trg&0x01)
	{
		count=0;
		EEPROM_Write(0x02,freq/256);Delay5ms();
		EEPROM_Write(0x03,freq%256);Delay5ms();
	}
	else if(Cnt&0x01)
	{
		if(++count==100)
		{
			count=0;
			LED_kai=~LED_kai;
		}
	}
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD |= 0x06;		//这个地方一定要设置计数器模式!!!!!!!!!!!!!!!!!!
	TH0=TL0=0xff;
	TR0 = 1;		//定时器0开始计时
	ET0=1;
}
void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x20;		//设置定时初始值
	TH1 = 0xD1;		//设置定时初始值
	TR1 = 1;		//定时器1开始计时
	ET1=1;
	EA=1;
}

void Timer0() interrupt 1
{
	++count_f;
}
void Timer1() interrupt 3
{

	if(count_key>=10)   //10ms扫描一次键盘,长按键键盘扫描必须放在定时器里!!!!!
		{
			count_key=0;
			KeyScan();
		}	
	if(++tt==1000)
		{
			ET0=0;
			tt=0;
			freq=count_f;
			count_f=0;
			ET0=1;
		}
	Latch(0x80,~(L1+L2*2+L3*4+L4*8+L5*16));
	Display_smg();
	++count_key;
	++count_adc;
}
void InitSystem()
{
	char i=0;
	Latch(0x80,0xff);
	Latch(0xa0,0x00);
	Latch(0xc0,0xff);
	Latch(0xe0,0xff);
	Timer0Init();	
	Timer1Init();
	if(mode==0)
	{
		for(i=0;i<5;i++)
		{
			volt=Read_Adc(0x03)*1.96+0.5;
		}
	}
	else if(mode==1)
	{
		for(i=0;i<5;i++)
		{
			Rd1=Read_Adc(0x01)*1.96+0.5;
		}
	}
}

void main()
{
	InitSystem();
	volt_c=EEPROM_Read(0x00)<<8 | EEPROM_Read(0x01);
	freq_c=EEPROM_Read(0x02)<<8 | EEPROM_Read(0x03);
	Rd1_c=EEPROM_Read(0x04)<<8 | EEPROM_Read(0x05);
	while(1)
	{
		
		if(interface==0)
		{
			if(freq>9999)smg_1[3]=freq/10000;
			else smg_1[3]=11;
			if(freq>999)smg_1[4]=freq%10000/1000;
			else smg_1[4]=11;
			if(freq>99)smg_1[5]=freq%1000/100;
			else smg_1[5]=11;
			if(freq>9)smg_1[6]=freq%100/10;
			else smg_1[6]=11;
			smg_1[7]=freq%10;
			if(LED_kai==1)
			{
				L3=1;L4=L5=L1=0;
				if(freq>freq_c){L2=1;}
				else if(freq<=freq_c){L2=0;}
			}	
			else if(LED_kai==0){L1=L2=L3=L4=L5=0;}
		}
		else if(interface==1)
		{
			n=1*100000/freq;
			if(n>999)smg_2[4]=n/1000;
			else smg_2[4]=11;
			if(n>99)smg_2[5]=n%1000/100;
			else smg_2[5]=11;
			if(n>9)smg_2[6]=n%100/10;
			else smg_2[6]=11;
			smg_2[7]=n%10;
			if(LED_kai==1){L4=1;L3=L5=L1=L2=0;}
			else if(LED_kai==0){L1=L2=L3=L4=L5=0;}
		}
		else if(interface==2)
		{
			if((LED_kai==1) && (mode==0))
			{
				L5=1;L3=L4=L2=0;
				if(volt>volt_c){L1=1;}
				else if(volt<=volt_c){L1=0;}
			}
			else if((LED_kai==0) || (mode==1)){L1=L2=L3=L4=L5=0;}
			if(count_adc>199)
			{
				count_adc=0;
				if(mode==0)
				{
					EA=0;volt=Read_Adc(0x03)*1.96+0.5;EA=1;
					smg_3[2]=3;
					smg_3[5]=volt/100;
					smg_3[6]=volt%100/10;
					smg_3[7]=volt%10;
				}
				else if(mode==1)
				{
					EA=0;Rd1=Read_Adc(0x01)*1.96+0.5;EA=1;
					smg_3[2]=1;
					smg_3[5]=Rd1/100;
					smg_3[6]=Rd1%100/10;
					smg_3[7]=Rd1%10;
				}
			}
		}
	}
}

iic.c文件



#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//×ÜÏßÒý½Å¶¨Òå
sbit SDA = P2^1;  /* Êý¾ÝÏß */
sbit SCL = P2^0;  /* ʱÖÓÏß */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//×ÜÏßÆô¶¯Ìõ¼þ
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//×ÜÏßÍ£Ö¹Ìõ¼þ
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//·¢ËÍÓ¦´ð
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 1为非应答 0为应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//µÈ´ýÓ¦´ð
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//ͨ¹ýI2C×ÜÏß·¢ËÍÊý¾Ý
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//´ÓI2C×ÜÏßÉϽÓÊÕÊý¾Ý
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}
unsigned char Read_Adc(unsigned char addr)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}
void EEPROM_Write(unsigned char addr,dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}
unsigned char EEPROM_Read(unsigned char addr)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}

iic.h文件

#ifndef _IIC_H
#define _IIC_H

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
unsigned char Read_Adc(unsigned char addr);
void EEPROM_Write(unsigned char addr,dat);
unsigned char EEPROM_Read(unsigned char addr);
#endif

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值