概述
一,代码部分
1,iic.c
#include "reg52.h"
#include "intrins.h"
sbit SDA = P2^1;
sbit SCL = P2^0;
#define DELAY_TIME 5
//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//I2C总线启动信号
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//I2C总线停止信号
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;
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;
}
2,smgshow.c
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日
期: 2011-8-9
*/
#include "reg52.h"
sbit DQ = P1^4;
//单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t)
//STC89C52RC
{
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//从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(50);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
3,ds1302.c
#include <reg52.h>
#include <intrins.h>
sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;
//写字节
void Write_Ds1302(unsigned
char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1;
_nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
4,main.c
#include "reg52.h"
#include "ds1302.h"
#include "iic.h"
#include "smgshow.h"
#include "onewire.h"
unsigned char hour=0x16,min=0x59,sec=0x50;//初始时间为 16:59:50
unsigned int tempture;//温度显示变量
unsigned char stat_dat=0;//数据界面切换标志位
unsigned char stat_set=0;//参数界面切换标志位
unsigned int u_rb1=0;//光敏电阻显示电压变量
unsigned char led_stat=0xff;//LED变量
unsigned char hour_t=0;//字符型小时变量
char set_hour=17;//参数界面显示变量
char set_tempture=25;
char set_led=4;
char set_hour_t=17;//参数界面显示变量
char set_tempture_t=25;
char set_led_t=4;
bit bod=0;//bright or dark
bit dat_set=0;//参数显示与数据显示切换标志位
0:数据界面
1:参数界面
bit mode3=0;//LED3亮暗标志位
sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
void Init_T0()//初始化定时器0,定时30ms,16为自动重装模式
{
TMOD &=0xf0;
TMOD |=0x01;
TH0=(65535-30000)/256;
TL0=(65535-30000)%256;
EA=1;
ET0=1;
TR0=1;
}
unsigned int count=0;
void Service_T0() interrupt 1
{
TH0=(65535-30000)/256;
TL0=(65535-30000)%256;
if(bod==1)
{
count++;
if(count>100)//3秒
{
mode3=1;
}
}
else
{
count=0;
mode3=0;
}
}
void Init_1302()
{
Write_Ds1302_Byte(0x8e,0x00);//关闭写保护
Write_Ds1302_Byte(0x80,sec);//写入初始时间
Write_Ds1302_Byte(0x82,min);
Write_Ds1302_Byte(0x84,hour);
Write_Ds1302_Byte(0x8e,0x80);//关闭写保护
}
void Read_1302()//更新时间
{
sec=Read_Ds1302_Byte(0x81);
min=Read_Ds1302_Byte(0x83);
hour=Read_Ds1302_Byte(0x85);
}
void Convert_18b20()//DS18B20开始温度转化
{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
void Read_18b20()//读取DS18B20温度
{
int t;
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
t=(MSB << 8) | LSB;
tempture=t/16.0*10;
}
void Read_rd1()//读取光敏电阻电压
{
unsigned char t;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x41);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
t=IIC_RecByte();//读取0~255
IIC_SendAck(1);
IIC_Stop();
u_rb1=t/51.0*100;
if(t>65)//亮暗判断
{
bod=0;
}
else
{
bod=1;
}
}
void Dat_SMGWork()
{
switch(stat_dat)
{
case 0://时间数据
Display_SMG(0,smgnotdotduanma[hour/16]);
Display_SMG(1,smgnotdotduanma[hour%16]);
Display_SMG(2,~0x40);
Display_SMG(3,smgnotdotduanma[min/16]);
Display_SMG(4,smgnotdotduanma[min%16]);
Display_SMG(5,~0x40);
Display_SMG(6,smgnotdotduanma[sec/16]);
Display_SMG(7,smgnotdotduanma[sec%16]);
break;
case 1://温度数据
Display_SMG(0,0xc6);
Display_SMG(5,smgnotdotduanma[tempture/100]);
Display_SMG(6,smgdotduanma[tempture/10%10]);
Display_SMG(7,smgnotdotduanma[tempture%10]);
break;
case 2://亮,暗状态显示
Display_SMG(0,0x86);
Display_SMG(2,smgdotduanma[u_rb1/100]);
Display_SMG(3,smgnotdotduanma[u_rb1/10%10]);
Display_SMG(4,smgnotdotduanma[u_rb1%10]);
Display_SMG(7,smgnotdotduanma[bod]);
break;
}
}
void Set_SMGWork()//参数显示界面
{
switch(stat_set)
{
case 0:
Display_SMG(0,0x8c);
Display_SMG(1,smgnotdotduanma[1]);
Display_SMG(6,smgnotdotduanma[set_hour_t/10]);
Display_SMG(7,smgnotdotduanma[set_hour_t%10]);
break;
case 1:
Display_SMG(0,0x8c);
Display_SMG(1,smgnotdotduanma[2]);
Display_SMG(6,smgnotdotduanma[set_tempture_t/10]);
Display_SMG(7,smgnotdotduanma[set_tempture_t%10]);
break;
case 2:
Display_SMG(0,0x8c);
Display_SMG(1,smgnotdotduanma[3]);
Display_SMG(7,smgnotdotduanma[set_led_t]);
break;
}
}
void Scan_KBD()
{
//扫描S4
R2=0;
R1=C1=C2=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
if(dat_set==0)
{
dat_set=1;
stat_set=0;
}
else
{
dat_set=0;
stat_dat=0;
set_hour=set_hour_t;
set_tempture=set_tempture_t;
set_led=set_led_t;
}
while(C1==0)
{
if(dat_set==0)
{
Dat_SMGWork();
}
else
{
Set_SMGWork();
}
}
}
}
//扫描S5
R1=0;
R2=C1=C2=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
if(dat_set==0)//在数据显示界面下的状态切换
{
if(stat_dat==0)
{
stat_dat=1;
}
else if(stat_dat==1)
{
stat_dat=2;
}
else
{
stat_dat=0;
}
}
if(dat_set==1)//在参数显示界面下的状态切换
{
if(stat_set==0)
{
set_hour=set_hour_t;
stat_set=1;
}
else if(stat_set==1)
{
set_tempture=set_tempture_t;
stat_set=2;
}
else
{
set_led=set_led_t;
stat_set=0;
}
}
while(C1==0)
{
if(dat_set==0)
{
Dat_SMGWork();
}
else
{
Set_SMGWork();
}
}
}
}
//扫描S8
R2=0;
R1=C1=C2=1;
if(C2==0)
{
Delay(500);
if(C2==0)
{
if(dat_set==1)//在参数界面才能执行
{
if(stat_set==0)//在时间参数界面
{
set_hour_t--;
if(set_hour_t<0)
{
set_hour_t=23;
}
}
if(stat_set==1)//温度参数界面
{
set_tempture_t--;
if(set_tempture_t<0)
{
set_tempture_t=99;
}
}
if(stat_set==2)//指示灯参数界面
{
set_led_t--;
if(set_led_t<4)
{
set_led_t=8;
}
}
}
while(C2==0)
{
if(dat_set==0)
{
Dat_SMGWork();
}
else
{
Set_SMGWork();
}
}
}
}
//扫描S9
R1=0;
R2=C1=C2=1;
if(C2==0)
{
Delay(500);
if(C2==0)
{
if(dat_set==1)//在参数界面才能执行
{
if(stat_set==0)//在时间参数界面
{
set_hour_t++;
if(set_hour_t>23)
{
set_hour_t=0;
}
}
if(stat_set==1)//温度参数界面
{
set_tempture_t++;
if(set_tempture_t>99)
{
set_tempture_t=0;
}
}
if(stat_set==2)//指示灯参数界面
{
set_led_t++;
if(set_led_t>8)
{
set_led_t=4;
}
}
}
while(C2==0)
{
if(dat_set==0)
{
Dat_SMGWork();
}
else
{
Set_SMGWork();
}
}
}
}
}
void LED_Working()//LED工作函数
{
hour_t=hour/16*10+hour%16;
if(set_hour>hour_t)
//L1工作
{
led_stat &= ~0x01;
HC573(4,led_stat);
}
else
{
led_stat |= 0x01;
HC573(4,led_stat);
}
if(tempture<set_tempture*10)//L2工作
{
led_stat &= ~0x02;
HC573(4,led_stat);
}
else
{
led_stat |= 0x02;
HC573(4,led_stat);
}
if(mode3==1)//当前为暗
L3工作
{
led_stat &= ~0x04;
HC573(4,led_stat);
}
else
{
led_stat |= 0x04;
HC573(4,led_stat);
}
if(bod==1)
{
if(set_led==4)//L4工作
{
led_stat &= ~0x08;
HC573(4,led_stat);
}
else
{
led_stat |= 0x08;
HC573(4,led_stat);
}
if(set_led==5)//L5工作
{
led_stat &= ~0x10;
HC573(4,led_stat);
}
else
{
led_stat |= 0x10;
HC573(4,led_stat);
}
if(set_led==6)//L6工作
{
led_stat &= ~0x20;
HC573(4,led_stat);
}
else
{
led_stat |= 0x20;
HC573(4,led_stat);
}
if(set_led==7)//L7工作
{
led_stat &= ~0x40;
HC573(4,led_stat);
}
else
{
led_stat |= 0x40;
HC573(4,led_stat);
}
if(set_led==8)//L8工作
{
led_stat &= ~0x80;
HC573(4,led_stat);
}
else
{
led_stat |= 0x80;
HC573(4,led_stat);
}
}
else
{
led_stat |= 0xf8;
HC573(4,led_stat);
}
}
void Init_system()
{
HC573(4,0xff);
HC573(5,0x00);
Init_1302();
Init_T0();
}
void main()
{
Init_system();
while(1)
{
Scan_KBD();
Read_rd1();
Convert_18b20();
Read_18b20();
Read_1302();
LED_Working();
if(dat_set==0)
{
Dat_SMGWork();
}
else
{
Set_SMGWork();
}
}
}
二,总结
国赛加油
最后
以上就是正直眼睛为你收集整理的蓝桥杯国赛十一届的全部内容,希望文章能够帮你解决蓝桥杯国赛十一届所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复