蓝桥杯单片机第十届省赛(未完成DAC输出)

                           仔细看题

蓝桥杯单片机第十届省赛(未完成DAC输出)_第1张图片
蓝桥杯单片机第十届省赛(未完成DAC输出)_第2张图片蓝桥杯单片机第十届省赛(未完成DAC输出)_第3张图片蓝桥杯单片机第十届省赛(未完成DAC输出)_第4张图片
注意DAC输出未完成,代码有BUG(LED部分)

main.c

#include "stc15f2k60s2.h"
#include "system.h"
uint dat_u,dat_f;

void main()
{
	close_fucker();
	init_timer1();
	init_timer0();
	while(1)
	{
		if(flag_ad==1 && flag_da==0) //未做DAC ,有bug
		{
			flag_ad=0;
			dat_u=read_pcf3();
			dat_u = dat_u/255.0f*500; //先除后乘,追最大值可到500 
		}
		else if(flag_da==1)
		{
			flag_da=0;
			dat_u=200;
			out_pcf3(dat_u);
		}	
		if(flag_f==1)
		{
			flag_f=0;
			TR0=0;
			dat_f=TH0*256+TL0;
			TH0=0;
			TL0=0;
			TR0=1;
		}
		if(flag_da==1) dat_led &=0xef;	  //L5 ,有bug
		else if(flag_da==0)dat_led |=0x10;
		
		if (dat_u<150)  dat_led &=0xfb;	 //L3
		else if(dat_u<250) dat_led |=0x04;
		else if(dat_u<350) dat_led &=0xfb;
		else  dat_led |=0x04;

		if (dat_f<1000)  dat_led &=0xf7;	 //L4
		else if(dat_f<5000) dat_led |=0x08;
		else if(dat_f<10000) dat_led &=0xf7;
		else  dat_led |=0x08;

	   show_num();
	   key_driver();
	}
}


system.h

#ifndef _SYSTEM_H
#define _SYSTEM_H

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.h"

#define uchar unsigned char
#define uint unsigned int

sbit key_int_1=P3^3;
sbit key_int_2=P3^2;
sbit key_int_3=P3^1;
sbit key_int_4=P3^0;

//init
void hc573(uchar n);
void close_fucker();
void init_timer1();
void init_timer0();

//display
void show_num();
void show_led(uchar temp);
void display();

//key
void key_scan();
void key_action(uchar key_value);
void key_driver();

//变量设置	
extern uint dat_u,dat_f;//全局变量在头文件中声明(加extern关键字),在c文件中还要定义
extern bit flag_f,flag_ad,flag_da,flag_smg,flag_led,mode;
extern uchar dat_led;
#endif


display.c

#include "system.h"

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x7f,0xc1,0x8e};
uchar smg_buff[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};


void show_num()
{
	if(flag_smg==1)
	{
		if(mode==0)
		{
			smg_buff[0]=table[12];
			smg_buff[1]=table[10];
			smg_buff[2]=table[10];
			smg_buff[3]=table[10];
			smg_buff[4]=table[10];
			smg_buff[5]=table[dat_u/100] & table[11]; //小数点的显示问题
			smg_buff[6]=table[dat_u/10%10];
			smg_buff[7]=table[dat_u%10];
		}
		else if(mode==1)
		{
			smg_buff[0]=table[13];
			smg_buff[1]=table[10];

			if(dat_f>99999)
			smg_buff[2]=table[dat_f/100000];
			else
			smg_buff[2]=table[10];
		
			if(dat_f>9999)
			smg_buff[3]=table[dat_f/10000%10];
			else
			smg_buff[3]=table[10];

			if(dat_f>999)
			smg_buff[4]=table[dat_f/1000%10];
			else
			smg_buff[4]=table[10];

			if(dat_f>99)
			smg_buff[5]=table[dat_f/100%10];
			else
			smg_buff[5]=table[10];

			if(dat_f>9)
			smg_buff[6]=table[dat_f/10%10];
			else
			smg_buff[6]=table[10];

			smg_buff[7]=table[dat_f%10];
		}
	}
	else 
	{
		smg_buff[0]=table[10];
		smg_buff[1]=table[10];
		smg_buff[2]=table[10];
		smg_buff[3]=table[10];
		smg_buff[4]=table[10];
		smg_buff[5]=table[10];
		smg_buff[6]=table[10];
		smg_buff[7]=table[10];	
	}
}

void display()
{
	static uchar index=0;

	hc573(7);
	P0=0xff;
	P2=P2 & 0X1F;

	hc573(6);
	P0=0x01<<index;
	P2=P2 & 0X1F;

	hc573(7);
	P0=smg_buff[index];
	P2=P2 & 0X1F;

	if(index<7)
		index++;
	else
		index=0;
}

void show_led(uchar temp)//有形参,对temp运算来控制led灯
{
	hc573(4);
	P0=~temp;
	P2=P2 & 0X1F;
}

init.c

#include "system.h"
bit flag_f=0,flag_ad=0;
void hc573(uchar n)
{
	switch(n)
	{
		case 4:P2=(P2 & 0X1F) | 0X80;break;
		case 5:P2=(P2 & 0X1F) | 0Xa0;break;
		case 6:P2=(P2 & 0X1F) | 0Xc0;break;
		case 7:P2=(P2 & 0X1F) | 0Xe0;break;
	}
}

void close_fucker()
{
	hc573(4);
	P0=0XFF;
	P2=P2 & 0X1F;

	hc573(5);
	P0=0XaF;
	P2=P2 & 0X1F;
}


void init_timer1()
{
   	AUXR |= 0x40;	
	TMOD &= 0x0F;	
	TL1 = 0x40;		
	TH1 = 0xA2;	
	EA=1;
	ET1=1;	
	TF1 = 0;	
	TR1 = 1;	
}

void serivce_timer1() interrupt 3
{
	static uint t_f=0,t_u=0;

	if(++t_f>=250)
	{
		t_f=0;
		flag_f=1;
	}	
    if(++t_u>=200)
	{
		t_u=0;
		flag_ad=1;
	}

	if(flag_led==0)
	{
		show_led(dat_led);
	}	
	else 
	{
		show_led(0x00);
	}
			
	display();
	key_scan();

}

void init_timer0()
{
	TMOD=0x04;
	TH0=0;
	TL0=0;
	TR0=1;
}


key.c

#include "system.h"

uchar key_state[4]={1,1,1,1};
uchar key_value_map[4]={1,2,3,4};
bit flag_da=1,flag_smg=1,mode=0,flag_led=0;
uchar dat_led=0x01;
void key_scan()
{
   uchar i;
   static uchar key_buff[4]={0xff,0xff,0xff,0xff,};

   key_buff[0]=(key_buff[0] <<1) |key_int_1;
   key_buff[1]=(key_buff[1] <<1) |key_int_2;
   key_buff[2]=(key_buff[2] <<1) |key_int_3;
   key_buff[3]=(key_buff[3] <<1) |key_int_4;
   
   for(i=0;i<4;i++)
   {
   		if(key_buff[i]==0xff)
		{
			key_state[i]=1;
		}
		else if(key_buff[i]==0x00)
		{
			key_state[i]=0;
		}
		else
		{
			;
		}
   } 
}

void key_action(uchar key_value)
{
	 if(key_value==1)
	 {
	 	mode=~mode;
		if(mode==0)
		{
			dat_led |=0x01;	
			dat_led &=0xfd;
		}	
		else if(mode==1)
		{
			dat_led |=0x02;	
			dat_led &=0xfe;
		}
	 }
	 else if(key_value==2)
	 {
	 	flag_da=~flag_da;
	 }
	 else if(key_value==3)
	 {
	 	 flag_led=~flag_led;
	 }
	 else if(key_value==4)
	 {
	 	flag_smg=~flag_smg;
	 }

}

void key_driver()
{
	 uchar i;
	 static uchar key_back[4]={1,1,1,1};

	 for(i=0;i<4;i++)
	 {
	 	if(key_state[i]!=key_back[i])
		{
			if(key_state[i]==1)
			{
				key_action(key_value_map[i]);
			}
			key_back[i]=key_state[i];
		}
	 }
}

iic.h

#ifndef _IIC_H
#define _IIC_H

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "system.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

//函数声明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(unsigned char ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void);
unsigned char read_pcf3(void);
void out_pcf3(unsigned char dat_u);

#endif


iic.c

/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(12MHz)
  日    期: 2011-8-9
*/

#include "iic.h"
#include "system.h"

//总线启动条件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}

//应答位控制
void IIC_Ack(unsigned char ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop;
	SCL = 1;
	somenop;
	SCL = 0;
	SDA = 1; 
	somenop;
}

//等待应答
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}

unsigned char read_pcf3(void) //temp=pcf_3();调用的正确用法
{
	uchar u;

	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	u=IIC_RecByte(); 
	IIC_Ack(0); 
	IIC_Stop();

	return u; //调用此函数时是该函数名赋值给另一个变量
				  //不是直接用这个返回值的变量
} 

void out_pcf3(uchar dat_u)	//将读取的数字量给pcf输出模拟量信号
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);	//发送控制字节,0100 0000在7位,00通道输入,out引脚输出(在J3第二个针),
	IIC_WaitAck();
	IIC_SendByte(dat_u);
	IIC_WaitAck();
	IIC_Stop();
}


你可能感兴趣的:(蓝桥杯单片机)