第十一届蓝桥杯单片机设计省一代码分享

第十一届蓝桥杯单片机设计省一代码分享

话不多说,代码如下:
(有疑问评论解答)

#include "reg52.h"
#include "iic.h"
#include "onewire.h"

sfr AUXR = 0X8E;

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;


#define Y4C P2 = (P2 & 0X1F) | 0X80
#define Y5C P2 = (P2 & 0X1F) | 0XA0
#define Y6C P2 = (P2 & 0X1F) | 0XC0 
#define Y7C P2 = (P2 & 0X1F) | 0XE0
#define Y0C P2 = (P2 & 0X1F) | 0X00


typedef unsigned char u8;
typedef unsigned int u16;


u8 Temp = 0;           //温度     
u8 S5_sele = 0;        //参数选择
u8 Temp_count = 0;     //温度范围判断
bit S4_View = 0;       //界面切换标志位
bit error_flag = 0;    //设置错误标志位
int TMax = 30;         //温度上限
int TMin = 20;         //温度下限
int max = 0;           //温度上限调整中间变量
int min = 0;           //温度下限调整中间变量

u8 Seg_buff[8] = {0};   //数据储存数组
u8 code wale[8]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位选
u8 code dula[13]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xC6,0x8C};
                //   0    1    2    3    4    5    6    7    8    9   关    C    P

void Delay10ms();              
void Close_All();                   //关闭无用外设
void Key_scanf();                   //按键输入
void LED_process();                 //LED控制
void Key_process();                 //按键功能处理
void DAC_process();                 //DAC控制
void Temp_process();                //温度采集
void Segment_Display();             //动态数码管扫描
void Seg_Dis_Buff(u8 d0,d1,d2,d3,d4,d5,d6,d7);  //数码管显示缓冲区

/********  定时器0配置   **********/

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初值
	TH0 = 0xD1;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}

/********  10ms延时  **********/

void Delay10ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 117;
	j = 184;
	do
	{
		while (--j);
	} while (--i);
}

/********  主函数   **********/

void main()
{
	Close_All();
	Timer0Init();
	while(1)
	{
		Key_scanf();
		Temp_process();
        Key_process();
		DAC_process();
		LED_process();
	}
	
}

/********  定时器0服务函数   **********/

void Timer0_service()interrupt 1
{
	Segment_Display();
}

/********  数码管显示缓冲区函数  **********/

void Seg_Dis_Buff(u8 d0,d1,d2,d3,d4,d5,d6,d7)
{
	Seg_buff[0] = d0;
	Seg_buff[1] = d1;
	Seg_buff[2] = d2;
	Seg_buff[3] = d3;
	Seg_buff[4] = d4;
	Seg_buff[5] = d5;
	Seg_buff[6] = d6;
	Seg_buff[7] = d7;	
}

/********  动态数码管扫描  **********/

void Segment_Display()
{
	static u8 num = 0;
	Y7C;P0 = 0XFF;Y0C;
	Y6C;P0 = wale[num];Y0C;
	Y7C;P0 = dula[Seg_buff[num]];Y0C;
	if(++num == 8)num = 0;
}

/********  关闭外设初始化  **********/

void Close_All()
{
	Y4C;P0 = 0XFF;Y0C;
	Y5C;P0 = 0X00;Y0C;
	Y6C;P0 = 0XFF;Y0C;
	Y7C;P0 = 0XFF;Y0C;
}

/********  按键扫描   **********/

void Key_scanf()
{
	if(S7 == 0)
	{
		Delay10ms();
		if(S7 == 0)
		{
			if(S4_View == 1)
			{
				switch(S5_sele)
				{
					case 0:min-- ;break;
					case 1:max -- ;break;
				}
				if((min<0)|(max<0)|(max<min)|(max>99)|(min>99))
				{
					error_flag = 1;
				}
				else 
				{
					error_flag = 0;
				}
			}
		}while(!S7);
	}
	if(S6 == 0)
	{
		Delay10ms();
		if(S6 == 0)
		{
			if(S4_View == 1)
			{
				switch(S5_sele)
				{
					case 0:min ++ ;break;
					case 1:max ++ ;break;
				}
				if((min<0)|(max<0)|(max<min)|(max>99)|(min>99))
				{
				  error_flag = 1;
				}
				else 
				{
			  	error_flag = 0;
				}	
			}
		}while(!S6);
	}
	if(S5 == 0)
	{
		Delay10ms();
		if(S5 == 0)
		{
			if(S5_sele == 0)S5_sele = 1;
			else if(S5_sele == 1)S5_sele = 0;
		}while(!S5);
	}
	if(S4 == 0)
	{
		Delay10ms();
		if(S4 == 0)
		{
			if(S4_View == 0)
			{
				min = TMin;
	     	    max = TMax;
				S4_View = 1;
				S5_sele = 0;
			}
			else if(S4_View == 1)
			{
				S4_View = 0;		
				if((min<0)|(max<0)|(max<min)|(max>99)|(min>99))
				{
					min = TMin;
	      	        max = TMax;
					error_flag = 0;
				}
				else
				{
					TMax = max;
			    TMin = min;
				}
			}
		}while(!S4);
	}
}

/********  按键功能处理  **********/

void Key_process()
{
	if(S4_View == 0)
	{
		Seg_Dis_Buff(11,10,10,10,10,10,Temp/10,Temp%10);
	}
	else if(S4_View == 1)
	{		
		Seg_Dis_Buff(12,10,10,max/10,max%10,10,min/10,min%10);
	}
}

/********  温度采集   **********/

void Temp_process()
{
	Temp = rd_temperature();
	if(Temp < TMin)
	{
		Temp_count = 1;
	}
	else if((Temp >= TMin)&&(Temp <= TMax))
	{
		Temp_count = 2;
	}
	else if(Temp > TMax)
	{
		Temp_count = 3;
	}
}

/********  DAC处理  **********/

void DAC_process()
{
	switch(Temp_count)
	{
		case 1:PCF8591_DAC(102);break;
		case 2:PCF8591_DAC(153);break;
	    case 3:PCF8591_DAC(204);break;
	}
}

/********  LED处理   **********/

void LED_process()
{
	if(error_flag == 0)
	{
		switch(Temp_count)
		{
			case 1:Y4C;P0=0XFB;Y0C;break;
			case 2:Y4C;P0=0XFD;Y0C;break;
			case 3:Y4C;P0=0XFE;Y0C;break;
		}
	}
	if(error_flag == 1)
	{
		switch(Temp_count)
		{
			case 1:Y4C;P0=0XF3;Y0C;break;
			case 2:Y4C;P0=0XF5;Y0C;break;
			case 3:Y4C;P0=0XF6;Y0C;break;
		}
	}
}

icc.c代码

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

#include "iic.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);
}

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;  
}

void PCF8591_DAC(unsigned char dat)
{
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(0x40);
    IIC_WaitAck();
    IIC_SendByte(dat);
    IIC_WaitAck();
    IIC_Stop();
}

onewire.c代码

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "onewire.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	unsigned char i = 0;
	while(t--)
	{
		for(i=0 ;i<12 ;i++);
	}
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

unsigned char rd_temperature(void)
{
	unsigned char Temp,TmH,TmL;
	
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0X44);
	
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);
	TmL = Read_DS18B20();
	TmH = Read_DS18B20();
	
	Temp = (TmH<<4)|(TmL>>4);
	
	return Temp;
}






  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值