第十一届蓝桥杯单片机设计省一代码分享
话不多说,代码如下:
(有疑问评论解答)
#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;
}