main.c程序
#include
#include "iic.h"
#include "onewire.h"
#define uchar unsigned char //定义无符号字符类型uchar
#define uint unsigned int //定义无符号整型类型uint
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xbf,0xff,0xC6,0X8C,0X88};
uchar yi,er,san,si,wu,liu,qi,ba; //定义字符型变量yi,er,san,si,wu,liu,qi,ba,当作数码管显示控制变量
uchar YeMian;
uchar CanShu = 25;
uint wendu_disp;
bit AD_Out_Mode = 0;
uint AD_Out_Value,AD_Out_Value1;
float wendu;
void delayms(int ms); //延时函数
void allinit(); //初始化函数
void keyscan16(); //矩阵按键函数
void display1(uchar yi,uchar er); //第一、二段数码管函数
void display2(uchar san,uchar si); //第三、四段数码管函数
void display3(uchar wu,uchar liu); //第五、六段数码管函数
void display4(uchar qi,uchar ba); //第七、八段数码管函数
void AdOut_Proc(void);
void main()//主函数
{
allinit(); //初始化函数
while(1)
{
wendu_disp = (Tempget()/16.0)*100;
wendu = Tempget()/16.0;
AD_Out_Value1 = (AD_Out_Value/51.0)*1000;
if(YeMian==0)
{
yi=22;er=21;san=21;si=21;wu=wendu_disp/1000;liu=wendu_disp%1000/100+10;qi=wendu_disp%100/10;ba=wendu_disp%10;
}
else if(YeMian==1)
{
yi=23;er=21;san=21;si=21;wu=21;liu=21;qi=CanShu/10;ba=CanShu%10;
}
else if(YeMian==2)
{
if(AD_Out_Mode==0)
{yi=24;er=21;san=21;si=21;wu=21;liu=(AD_Out_Value/51*100)/100+10;qi=(((AD_Out_Value/51)*100)%100)/10;ba=((AD_Out_Value/51)*100)%10;}
else
{yi=24;er=21;san=21;si=21;wu=21;liu=AD_Out_Value1/1000+10;qi=AD_Out_Value1%1000/100;ba=AD_Out_Value1%100/10;}
}
if(AD_Out_Mode==0){P2=0X80;P0&=0XFE;}
else {P2=0X80;P0|=0X01;}
switch(YeMian)
{
case 0:P2=0X80;P0|=0X0E;P0&=0XFD;break;
case 1:P2=0X80;P0|=0X0E;P0&=0XFB;break;
case 2:P2=0X80;P0|=0X0E;P0&=0XF7;break;
}
AdOut_Proc();
keyscan16(); //矩阵按键函数
display1(yi,er); //第一、二段数码管函数
display2(san,si); //第三、四段数码管函数
display3(wu,liu); //第五、六段数码管函数
display4(qi,ba); //第七、八段数码管函数
}
}
void keyscan16()//矩阵按键函数
{
uchar temp; //定义一个无符号变量temp
P44=0;P42=1;P3=0x7f; //让第一列按键为低电平
temp=P3; //把P3的值赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
if(temp!=0x0f) //判断第一列是否有按键按下
{
delayms(5); //延时5ms,用来按键消抖
temp=P3; //把P3的值重新赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
if(temp!=0x0f) //再次判断第一列是否有按键按下
{
temp=P3; //把P3的值重新赋给temp
switch(temp)
{
case 0x7b:
AD_Out_Mode ^= 1;
break; //第一列第三个按键按下
case 0x77:
if(YeMian==0)YeMian = 1;
else if(YeMian==1)YeMian = 2;
else if(YeMian==2)YeMian = 0;
break; //第一列第四个按键按下
}
while(temp!=0x0f) //无按键按下则进入循环
{
temp=P3; //把P3的值重新赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
}
}
}
P44=1;P42=0;P3=0xbf; //让第二列按键为低电平
temp=P3; //把P3的值赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
if(temp!=0x0f) //判断第一列是否有按键按下
{
delayms(5); //延时5ms,用来按键消抖
temp=P3; //把P3的值重新赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
if(temp!=0x0f) //再次判断第一列是否有按键按下
{
temp=P3; //把P3的值重新赋给temp
switch(temp)
{
case 0xbb:
if(YeMian == 1)
{
CanShu++;
if(CanShu==100)CanShu=99;
}
break; //第二列第三个按键按下
case 0xb7:
if(YeMian == 1)
{
CanShu--;
if(CanShu==255)CanShu=0;
}
break; //第二列第四个按键按下
}
while(temp!=0x0f) //无按键按下则进入循环
{
temp=P3; //把P3的值重新赋给temp
temp=temp&0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
}
}
}
}
void AdOut_Proc(void)
{
if(AD_Out_Mode==0)
{
if(wenduAD_Out_Value=0;
else
AD_Out_Value=255;
}
else
{
if(wendu AD_Out_Value=51;
else if((wendu>20)&&(wendu AD_Out_Value=(7.65*wendu)-102;
else
AD_Out_Value=204;
}
AD_Write(AD_Out_Value);
}
void delayms(int ms)//延时函数
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函数
{
P2=0XA0;P0=0X00; //关闭蜂鸣器继电器
P2=0X80;P0=0XFF; //关闭所有LED灯
P2=0XC0;P0=0XFF; //选中所有数码管段选
P2=0XFF;P0=0XFF; //关闭所有数码管
}
void display1(uchar yi,uchar er)//第一、二段数码管函数
{
P2=0XC0;P0=0X01; //选中第一个数码管位选
P2=0XFF;P0=tab[yi]; //让第一个数码管显示yi指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X02; //选中第二个数码管位选
P2=0XFF;P0=tab[er]; //让第一个数码管显示er指向的值
delayms(1); //延时1ms
}
void display2(uchar san,uchar si)//第三、四段数码管函数
{
P2=0XC0;P0=0X04; //选中第s三个数码管位选
P2=0XFF;P0=tab[san]; //让第一个数码管显示san指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X08; //选中第四个数码管位选
P2=0XFF;P0=tab[si]; //让第一个数码管显示si指向的值
delayms(1); //延时1ms
}
void display3(uchar wu,uchar liu)//第五、六段数码管函数
{
P2=0XC0;P0=0X10; //选中第五个数码管位选
P2=0XFF;P0=tab[wu]; //让第一个数码管显示wu指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X20; //选中第六个数码管位选
P2=0XFF;P0=tab[liu]; //让第一个数码管显示liu指向的值
delayms(1); //延时1ms
}
void display4(uchar qi,uchar ba)//第七、八段数码管函数
{
P2=0XC0;P0=0X40; //选中第七个数码管位选
P2=0XFF;P0=tab[qi]; //让第一个数码管显示qi指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X80; //选中第八个数码管位选
P2=0XFF;P0=tab[ba]; //让第一个数码管显示ba指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X80; //选中第八个数码管位选
P2=0XFF;P0=0XFF; //让第八个数码管熄灭
}
onewire.c程序
#include "onewire.h"
bit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t*=12;
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;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 {
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 int Tempget(void)
{
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(20);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
return (high}
iic.c程序
#include "iic.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; // 0:应答,1:非应答
// 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 {
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
从I2C总线上接收数据
//unsigned char IIC_RecByte(void)
//{
// unsigned char i, da;
// for(i=0; i// {
// SCL = 1;
// IIC_Delay(DELAY_TIME);
// da // if(SDA) da |= 1;
// SCL = 0;
// IIC_Delay(DELAY_TIME);
// }
// return da;
//}
void AD_Write(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
onewire.h程序
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#include
unsigned char rd_temperature(void); //; ;
unsigned int Tempget(void);
#endif
iic.h程序
#ifndef _IIC_H
#define _IIC_H
#include
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);
void AD_Write(unsigned char dat);
#endif
第十二届蓝桥杯单片机省赛作品演示(第一场)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net