目录
12 矩阵长按+精度配置+多字节读写(iic + onewire + ds1302)
01 独立按键控制
#include "stc15f2k60s2.h"
#define selec573(y,x) P0=x;P2=y; P2=0;
typedef unsigned char uchar;
typedef unsigned int uint;
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar countkey;
uchar trg,cnt;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
void serviceT0() interrupt 1
{
selec573(0x80,~(L[7]*64+L[6]*32+L[5]*16+L[4]*8));
++countkey;
}
void keyscan()
{
uchar readdat=P3^0xff,i=0;
trg=readdat&(readdat^cnt);
cnt=readdat;
if(trg&0x08)//s7按下(错 是s4
L[7]=1;
else if(trg&0x04)//s6按下
L[6]=1;
else if(trg&0x02)//s5按下?
L[5]=1;
else if(trg&0x01)//s4按下
L[4]=1;
if(!cnt)
for(i=0;i<8;i++)
L[i]=0;
}
void initsys()
{
P2=0x00;
selec573(0x80,0xff);
selec573(0xa0,0x00);
Timer0Init();
EA=1;
ET0=1;
}
void main()
{
initsys();
while(1)
{
if(countkey==10)
{
countkey=0;
keyscan();
}
}
}
02 矩阵键盘
#include "stc15f2k60s2.h"
#define selec573(y,x) P0=x;P2=y; P2=0;
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //从左到右com1~8
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar countkey;
uchar keyval,value; //弄成全局变量然后在主函数弄数码管
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
void serviceT0() interrupt 1
{
static uchar dspcom;
//注意中括号
selec573(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]*1));
selec573(0xc0,0x00);
selec573(0xe0,~t_display[smg[dspcom]]); //内容 eg.~t_display[smg[0]](smg[0]=6):第一位数码管显示6
selec573(0xc0,T_COM[dspcom]); //位选 eg.T_COM[0]:选中第一位数码管
if(++dspcom==8) //返回的是自增后的dspcom值
dspcom=0;
++countkey;
}
void keyscan()
{
uchar i;
static uchar keystat=0; //必须是静态变量
uchar keyx=0,keyy=0;
P3=0x0f;P4=0x00; //行赋高,列赋低
if(!P30) keyx=3;
else if(!P31) keyx=2;
else if(!P32) keyx=1;
else if(!P33) keyx=0;
P3=0xf0;P4=0xff; //行赋低,列赋高
if(!P34) keyy=4;
else if(!P35) keyy=3;
else if(!P42) keyy=2;
else if(!P44) keyy=1;
keyval=keyx+keyy*4;
/*
x y 1 2 3 4
3 7 11 15 19
2 6 10 14 18
1 5 9 13 17
0 4 8 12 16
*/
switch(keystat)
{
case 0:
if(keyval!=0) keystat=1;
else{ for(i=0;i<9;i++)
L[i]=0;}
break;
case 1:
if(keyval==0)
keystat=0; //这句不能少
else
{
keystat=2;
value = keyval; //这句不能少
switch(keyval)
{
case 4:
L[1]=L[2]=1;
break;
case 8:
L[3]=L[4]=1;;
break;
case 12:
L[5]=L[6]=1;
break;
case 16:
L[7]=L[8]=1;
break;
default: ;break;
}
}
break;
case 2:
if(keyval==0) keystat=0; //这两句都不能少
break;
}
}
void initsys()
{
P2=0x00;
selec573(0x80,0xff);
selec573(0xa0,0x00);
Timer0Init();
EA=1;
ET0=1;
}
void main()
{
initsys();
while(1)
{
if(keyval>9)
{
smg[6]=keyval/10;
smg[7]=keyval%10;
}
else if(keyval<10&&keyval>0)
{
smg[6]=16;
smg[7]=keyval%10;
}
else if(keyval==0)
{
smg[6]=16;
smg[7]=16;
}
if(countkey==10)
{
countkey=0;
keyscan();
}
//selec573(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]*1));
}
}
03 adc读取rb2电压(iic)
#include "stc15f2k60s2.h"
#include "iic.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec573(y,x) P0=x;P2=y;P2=0;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar countkey;
uint countadc;
uchar keyval;
uint value_adc;
uint value_guangming;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
void serviceT0() interrupt 1
{
static uchar dspcom=0;
selec573(0x80,0xff);
selec573(0xc0,0x00);
selec573(0xe0,~t_display[smg[dspcom]]);
selec573(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
++countadc;
}
void initsys()
{
selec573(0x80,0xff);
selec573(0xa0,0x00);
Timer0Init();
EA=ET0=1;
}
void keyscan()
{
}
void main()
{
uchar i;
initsys();
while(1)
{
if(countadc>199)
{
countadc=0;
value_adc=read_adc(0x03)*1.9607+0.5;//500/255=1.9607��Ҫ��int����
value_guangming=read_adc(0x01); //ע������ֵ��0~255��
}
for(i=3;i<5;i++)
{
smg[i]=16;
}
smg[0]=value_guangming/100;
smg[1]=value_guangming/10%10;
smg[2]=value_guangming%10;
smg[5]=value_adc/100+32;
smg[6]=value_adc/10%10;
smg[7]=value_adc%10;
if(countkey==10)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
unsigned char read_adc(unsigned char channel)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_SendByte(channel+64);
IIC_Start();
IIC_SendByte(0x91);
IIC_RecByte();
IIC_SendAck(0); //读两次,因为这个是取上一次的值,且要应答;
temp=IIC_RecByte();
IIC_SendByte(1); //最后不需要应答
IIC_Stop();
return temp;
}
#ifndef _IIC_H
#define _IIC_H
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);
unsigned char read_adc(unsigned char channel);
#endif
04 温度读取(onewire)
#include "stc15f2k60s2.h"
#include "onewire.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec573(y,x) P0=x;P2=y;P2=0;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar countkey;
uint counttemp;
uint valuetemp;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void serviceT0() interrupt 1
{
static uchar dspcom=0;
//selec573(0x80,0xff);
selec573(0xc0,0x00);
selec573(0xe0,~t_display[smg[dspcom]]);
selec573(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
// ++countkey;
++counttemp;
}
void initsys()
{
uchar i;
selec573(0x80,0xff);
selec573(0xa0,0x00);
for(i=0;i<70;i++)
{
valuetemp=rd_temperature()*100+0.5;
}
Timer0Init();
}
//void keyscan()
//{
//
//}
void main()
{
initsys();
while(1)
{
if(counttemp>749)
{
counttemp=0;
valuetemp=rd_temperature()*100+0.5;
}
smg[4]=valuetemp/1000;
smg[5]=valuetemp/100%10+32;
smg[6]=valuetemp/10%10;
smg[7]=valuetemp%10;
// if(countkey==10)
// {
// countkey=0;
// keyscan();
// }
}
}
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "reg52.h"
sbit 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<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;
}
float rd_temperature(void)
{
unsigned char lsb,msb;
float temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);//注意要先读低八位在读高八位;
Write_DS18B20(0xbe);
lsb=Read_DS18B20();
msb=Read_DS18B20();
temp=0.0625*(((unsigned int)msb<<8)|lsb);
return temp;
}
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
float rd_temperature(void); //; ;
bit init_ds18b20(void);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
#endif
05 开机次数存在eeprom(iic)
#include "stc15f2k60s2.h"
#include "iic.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec573(y,x) P0=x;P2=y;P2=0;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar countkey;
uint countop;
uint valueop=94;
void Delay6ms() //@12.000MHz
{
unsigned char i, j;
i = 71;
j = 6;
do
{
while (--j);
} while (--i);
}
void Delay300ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 14;
j = 174;
k = 224;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void serviceT0() interrupt 1
{
static uchar dspcom=0;
//selec573(0x80,0xff);
selec573(0xc0,0x00);
selec573(0xe0,~t_display[smg[dspcom]]);
selec573(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
++countop;
}
void initsys()
{
selec573(0x80,0xff);
selec573(0xa0,0x00);
Timer0Init();
}
void keyscan()
{
}
void main()
{
initsys();
Delay300ms(); //电源按键消抖;
valueop=read_24c02(0x00);
if(valueop>99)
{
valueop=94;
}
wirte_24c02(0x00,++valueop);
Delay6ms(); //连续写入需要加个延时。
while(1)
{
if(valueop>99)
smg[5]=valueop/100;
if (valueop>9)
{
smg[5]=16;
smg[6]=valueop/10%10;
}
else
{ smg[5]=16;
smg[6]=16;
}
smg[7]=valueop%10;
if(countkey==10)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
void wirte_24c02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_SendByte(dat);
IIC_Stop();
}
unsigned char read_24c02(unsigned char addr)
{
unsigned char val;
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
//IIC_SendByte(0x81);
//IIC_RecByte();
val=IIC_RecByte();
IIC_SendAck(0);
//IIC_SendAck(1);
IIC_Stop();
return val;
}
#ifndef _IIC_H
#define _IIC_H
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 wirte_24c02(unsigned char addr,unsigned char dat);
unsigned char read_24c02(unsigned char addr);
#endif
06 n555频率 有注释
#include "stc15f2k60s2.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec573(y,x) P0=x;P2=y;P2=0;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uint fre=0,fre2;
uint count;
void T0init()//定时器0工作在计数
{
AUXR |=0x80;
TMOD |=0x04;
TH0=0xff;
TL0=0xff;
TR0=1;
EA=1;
ET0=1;
}
void serviceT0() interrupt 1
{
fre++;
}
void T1init()//定时器1工作在定时
{
AUXR |= 0x40; //?????1T??
TMOD &= 0x0F; //???????
TL1 = 0x20; //???????
TH1 = 0xD1; //???????
TF1 = 0; //??TF1??
TR1 = 1; //???1????
ET1=1;
}
void serviceT1() interrupt 3
{
static uchar dspcom=0;
selec573(0xc0,0x00);
selec573(0xe0,~t_display[smg[dspcom]]);
selec573(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
if(++count>499)
{
count=0;
ET0=0;//停止计数
fre2= 2*fre;
fre=0;
ET0=1;//开始计数
}
}
void initsys()
{
selec573(0x80,0xff);
selec573(0xa0,0x00);
T0init();
T1init();
}
void main()
{
initsys();
while(1)
{
smg[3]=fre2/10000;//数码管显示示例
smg[4]=fre2/1000%10;
smg[5]=fre2/100%10;
smg[6]=fre2/10%10;
smg[7]=fre2%10;
}
}
07 pwm发生 有注释
#include <STC15F2K60S2.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2=y;P2=0;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar countkey;
uchar keyval;
uchar pwmval;
uchar countpwm;
uchar buzz,relay;
void Timer0Init(void) //100us@12.000MHz 定时器中断周期时间为100微秒也就是
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x50; //???????
TH0 = 0xFB; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
ET0=1;
EA=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
uchar temp;
if(++temp<pwmval)// pwmval就是用于控制占空比的变量
{
L[1]=L[2]=1;//控制该led灯的亮度
buzz=1;//蜂鸣器
}
else
{
L[1]=L[2]=0;
buzz=0;
}
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]*1))
selec(0xA0,buzz*64+relay*16)//蜂鸣器与继电器处理函数(十三届国赛还用到了电机引脚,是同理)
if(temp>9)
{
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,0x01<<dspcom);
if(++dspcom==8)
dspcom=0;
temp=0;
}
++countkey;
}
void keyscan()
{
static uchar keystat=0;
uchar keyx=0,keyy=0,i;
P3=0x0f;P4=0x00;
if(!P30) keyx=3;
else if(!P31) keyx=2;
else if(!P32) keyx=1;
else if(!P33) keyx=0;
P3=0xf0;P4=0xff;
if(!P34) keyy=4;
else if(!P35) keyy=3;
else if(!P42) keyy=2;
else if(!P44) keyy=1;
keyval= keyx+keyy*4;
switch(keystat)
{
case 0:if(keyval!=0)keystat=1;break;
case 1:
if(keyval==0)
keystat=0;
else
{
keystat=2;
switch(keyval)
{
case 4: pwmval+=1;break;//按键控制pwm波占空比
case 5: pwmval=2;break;
case 6: pwmval=9;break;
}
}
break;
case 2:
if(keyval==0)
{
keystat=0;
for(i=0;i<9;i++)
L[i]=0;
}
}
}
void main()
{
selec(0xa0,0x00);
Timer0Init();
while(1)
{
// if(countpwm<pwmval)
// {
// L[1]=L[2]=1;
// }
// else if(countpwm==10)
// {
// L[1]=L[2]=0;
// countpwm=0;
// }
//
smg[6]=pwmval;
smg[7]=0;
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
08 at24c02多字节读写(iic)
#include <STC15F2K60S2.H>
#include "iic.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar div[2];
uchar yy[9]={0,0};
uint count;
uchar countkey;
uchar flag;
uchar trg,cnt;
uint n=4333;
uchar y,z;
bit busy;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00)
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++count;
++countkey;
}
void UartInit(void) //4800bps@12.000MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x40; //?????1T??
AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x0F; //???????
TL1 = 0x8F; //???????
TH1 = 0xFD; //???????
ET1 = 0; //?????%d??
TR1 = 1; //???1????
ES=1;
}
void serviceuart() interrupt 4
{
if(TI)
{
TI=0;
busy=0;
}
}
void sendbyte(uchar dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void sendstring(char *dat)
{
while(*dat!='\0')
{
sendbyte(*dat++);
}
}
void keyscan()
{
uchar readdat=P3^0xff;
trg=readdat&(readdat^cnt);
cnt=readdat;
if(trg&0x08)
{
//sendbyte('6');
}
}
void initsys()
{
selec(0x80,0xff);
selec(0xa0,0x00);
Timer0Init();
}
void main()
{
uchar i;
initsys();
UartInit();
// div[0]=n;
// div[1]=n/256;
// writestr(0x10,div,2);
// readstr(0x10,div,2);
// n=(div[1]<<8)|div[0];
div[0]=n;
div[1]=n>>8;
writebyte(0x00,div[0]);
writebyte(0x01,div[1]);
div[0]=readbyte(0x00);
div[1]=readbyte(0x01);
n=div[1]*255+div[0];
while(1)
{
smg[3]=n/10000;
smg[4]=n/1000%10;
smg[5]=n/100%10;
smg[6]=n/10%10;
smg[7]=n%10;
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
void writestr(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0); //用指针指代数组的地址,24c02溢出了会自动后退吧?
IIC_SendByte(addr);
while(n--)
{
IIC_SendByte(*dat);
dat++;
}
IIC_Stop();
}
void readstr(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
while(--n)
{
*dat=IIC_RecByte();
IIC_SendAck(0);
dat++;
}
*dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
void writebyte(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0); //用指针指代数组的地址,24c02溢出了会自动后退吧?
IIC_SendByte(addr);
IIC_SendByte(dat);
IIC_Stop();
}
unsigned char readbyte(unsigned char addr)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return dat;
}
#ifndef _IIC_H
#define _IIC_H
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 writestr(unsigned char addr,unsigned char *dat,unsigned char n);
void readstr(unsigned char addr,unsigned char *dat,unsigned char n);
unsigned char readbyte(unsigned char addr);
void writebyte(unsigned char addr,unsigned char dat);
#endif
09 18b20精度配置(onewire)
#include <STC15F2K60S2.H>
#include "onewire.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uint counttemp;
uint temp;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00)
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++counttemp;
}
void initsys()
{
uchar i;
selec(0x80,0xff);
selec(0xa0,0x00);
for(i=0;i<70;i++)
readtemp(0x5f)*10+0.5;
Timer0Init();
}
void main()
{
uchar i;
initsys();
while(1)
{
if(counttemp>300)
{
counttemp=0;
temp=readtemp(0x5f)*10+0.5;
}
smg[5]=temp/100;
smg[6]=temp/10%10+32;
smg[7]=temp%10;
}
}
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "reg52.h"
void Delay_OneWire(unsigned int t);
sbit DQ = P1^4; //单总线接口
//单总线延时函数
//通过单总线向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;
}
float readtemp(unsigned char reg)
{
float temp;
unsigned char lsb,msb;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x4e);
Write_DS18B20(0x6f);
Write_DS18B20(0x00);
Write_DS18B20(reg);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(900);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
lsb=Read_DS18B20();
msb=Read_DS18B20();
temp=0.0625*((msb<<8)|lsb);
return temp;
}
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t *=12;
while(t--);
}
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
//unsigned char rd_temperature(void); //; ;
float readtemp(unsigned char reg);
//void jindu(unsigned char dat);
#endif
10 串口通信
#include <STC15F2K60S2.H>
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
typedef unsigned char uchar;
typedef unsigned int uint;
bit busy;
uchar uart;
uint counttime;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
++counttime;
}
//波特率发生
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x40; //?????1T??
AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x0F; //???????
TL1 = 0xC7; //???????
TH1 = 0xFE; //???????
ET1 = 0; //这个很重要
TR1 = 1; //???1????
ES=1;
EA=1; //总中断开关
}
void serviceuart() interrupt 4
{
if(TI==1)
{
busy=0;
TI=0;
}
else if(RI==1)
{
RI=0;
uart=SBUF;
}
}
void sendbyte(unsigned char dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void sendstring( char *dat)
{
while(*dat) //很重要,字符串最后一位是0;
{
sendbyte(*dat++);
}
}
void main()
{
uchar i=35;
selec(0x80,0xff);
selec(0xa0,0x00);
Timer0Init();
UartInit();
while(1)
{
// if(counttime>999)
// {
// counttime=0;
// sendstring("北京时间:");
// sendbyte((i/10)+0x30);
// sendbyte((i%10)+0x30);
// }
if(uart==0xa0)
{
selec(0x80,0xf8);
}
else
{
selec(0x80,0xff);
}
}
}
11 超声波
11-1 超声波测距 有注释
#include <STC15F2K60S2.H>
#include "intrins.h"//主要是软件延时的_nop_()需要此头文件
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
typedef unsigned char uchar;
typedef unsigned int uint;
sbit TX=P1^0;//这里很关键,要预定义。
sbit RX=P1^1;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uint distance;//注意变量类型
uchar countdis;
bit L1;
//======以下三个软件延时根据硬件误差情况选一个能用的,都不能用再试试14us,10us。==============
//======比赛直接用12us,都可以测距成功=============
//超声波测距需要占用一个定时器
void Delay12us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void Delay13us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 36;
while (--i);
}
void Delay11us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 30;
while (--i);
}
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1 //一套常规操作
{
static uchar dspcom=0;
//selec(0x80,~L1);
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countdis;
}
void sendwave()//发送超声波===========
{
uchar i;
for(i=0;i<16;i++)//每隔12us取一次反,发送八个周期的波形
{
TX=~TX;
Delay12us();
}
}
uint getdis()//接收波并计算距离的函数
{
uint distan=0;
TH1=TL1=0;//定时器清零
sendwave();//发送超声波
TR1=1;//开始计数
while((RX==1)&&(TF1==0));//计数溢出,或收到脉冲
TR1=0; //停止计数
if(TF1==0)//如果没有溢出
{
distan=(TH1<<8|TL1)*0.017+0.5;//0.017是根据音速等计算出来的参数。加0.5是为了补偿误差(其他地方同理)
}
else
{
TF1=0;
distan=999;
}
return distan;//注意返回值
}
void main()
{
selec(0x80,0xff);
selec(0xa0,0x00);
Timer0Init();
while(1)
{
if(countdis>199)//199ms采集一次
{
countdis=0;
distance=getdis();
if(distance<10)
L1=1;
else
L1=0;
smg[5]=distance/100;
smg[6]=distance/10%10;
smg[7]=distance%10;
}
}
}
11-2 超声波测距独立练习
#include <STC15F2K60S2.H>
#include "intrins.h"
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
typedef unsigned char uchar;
typedef unsigned int uint;
sbit TX=P1^0;
sbit RX=P1^1;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uint distance;
uchar countdis;
bit relay;
void Delay12us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void Delay13us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 36;
while (--i);
}
void Delay11us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 30;
while (--i);
}
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0xa0,relay*16);
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countdis;
}
void sendwave()
{
uchar i;
for(i=0;i<16;i++)
{
TX=~TX;
Delay12us();//用的软件延时 ,如果需要改成13us就把12改为13;
}
}
uint getdis()
{
uint distan;
TH1=TL1=0;
TF1=0;
sendwave();
TR1=1;
while(RX&&!TF1);
TR1=0; //停止计数读距离;
if(!TF1)
{
distan=((TH1<<8)|TL1)*0.017+0.5;
}
else
{
distan=999;
TF1=0;
}
return distan;
}
void main()
{
selec(0x80,0xff);
selec(0xa0,0x00);
Timer0Init();
while(1)
{
if(countdis>199)
{
countdis=0;
distance=getdis();
if(distance<10)
relay=1;
else
relay=0;
if(distance>99)
smg[5]=distance/100;
else
smg[5]=16;
if(distance>9)
smg[6]=distance/10%10;
else
{smg[6]=16;}
smg[7]=distance%10;
}
}
}
12 矩阵长按+精度配置+多字节读写(iic + onewire + ds1302)
#include <STC15F2K60S2.H>
#include <onewire.H>
#include <iic.H>
#include <ds1302.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
#define time 0
#define wendu 1
#define volt 2
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar countkey;
uchar counttemp;
uchar keyval;
uchar hor,min,sec;
uchar hor1,min1,sec1;
bit readstat;
uchar showvol;
uchar readadc1[10]={0,0,0,0,0,0,0,0,0,0};
uchar readeer[10]={0,0};
uint countadc;
uint countlong;
uint numb;
uint temp;
uchar numb2;
uchar smgstat;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]))
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
++counttemp;
++countadc;
}
void keyscan()
{
static uchar keystat=0;
uchar keyx=0,keyy=0;
P3=0x0f;P4=0x00;
if(!P30) keyx=3;
else if(!P31) keyx=2;
else if(!P32) keyx=1;
else if(!P33) keyx=0;
P3=0xf0;P4=0xff;
if(!P34) keyy=4;
else if(!P35) keyy=3;
else if(!P42) keyy=2;
else if(!P44) keyy=1;
keyval=keyx+keyy*4;
switch(keystat)
{
case 0:
if(keyval!=0) keystat=1;
break;
case 1:
if(keyval==0)
keystat=0;
else
{
keystat=2;
numb2=keyval;
}
break;
case 2:
if(keyval==0)
{
keystat=0;
if(numb2==8)
{
if(smgstat==time)
smgstat=wendu;
else if(smgstat==wendu)
smgstat=volt;
else if(smgstat==volt)
smgstat=time;
}
else if(numb2==9)
{
readstat=~readstat;
}
else if(numb2==10)
{
if(++showvol==10)
{
showvol=0;
}
}
}
break;
}
}
void main()
{
uchar i,j=0;
selec(0x80,0xff);
selec(0xa0,0x00);
smgstat=0;
hor=12;min=59;sec=56;
for(i=0;i<70;i++)
temp=readtemp()*10+0.5;
settime(hor,min,sec);
Timer0Init();
while(1)
{
if(readstat==0)
{
if(countadc>999)
{
countadc=0;
readadc1[j]=readadc(0x01);
j++;
}
L[8]=1;
}
else
{
L[8]=0;
write24c02(0x00,readadc1,10);
read24c02(0x00,readeer,10);
}
if(j==10)
{
j=0;
readstat=1;
}
if(counttemp>93)
{
counttemp=0;
temp=readtemp()*10+0.5;
hor1=Read_Ds1302_Byte(0x85);
hor1<<=3;
hor1>>=3;
min1=Read_Ds1302_Byte(0x83);
sec1=Read_Ds1302_Byte(0x81);
hor=hor1/16*10+hor1%16;
min=min1/16*10+min1%16;
sec=sec1/16*10+sec1%16;
}
if(smgstat==time)
{
smg[0]=hor/10;
smg[1]=hor%10;
smg[2]=17;
smg[3]=min/10;
smg[4]=min%10;
smg[5]=17;
smg[6]=sec/10;
smg[7]=sec%10;
}
else if(smgstat==wendu)
{
for(i=1;i<5;i++)
smg[i]=16;
smg[0]=12;
smg[5]=temp/100;
smg[6]=temp/10%10+32;
smg[7]=temp%10;
}
else if(smgstat==volt)
{
for(i=1;i<5;i++)
smg[i]=16;
smg[0]=5;
smg[6]=readeer[showvol]/10;
smg[7]=readeer[showvol]%10;
}
if(countkey>9)
{
countkey=0;
keyscan();
if(keyval)
{
if(++countlong>99)
{
countlong=0;
numb2=0;
if(keyval==8)
{
L[1]=1;
}
else if(keyval==9)
{
L[2]=1;
}
else if(keyval==10)
{
L[3]=1;
}
else if(keyval==11)
{
countlong=80;
numb++;
}
}
}
else
{
for(i=0;i<7;i++)
L[i]=0;
}
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
void writedac(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_SendByte(0x40);
IIC_SendByte(dat);
IIC_Stop();
}
unsigned char readadc(unsigned char channel)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_SendByte(channel);
IIC_Start();
IIC_SendByte(0x91);
IIC_RecByte();
IIC_SendAck(0);
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
void read24c02(unsigned char addr,unsigned char *dat,unsigned char length)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
while(--length)
{
*dat=IIC_RecByte();
IIC_SendAck(0);
dat++;
}
*dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
void write24c02(unsigned char addr,unsigned char *dat,unsigned char length)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
while(length--)
{
IIC_SendByte(*dat);
dat++;
}
IIC_Stop();
}
#ifndef _IIC_H ;
#define _IIC_H
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 writedac(unsigned char dat);
unsigned char readadc(unsigned char channel);
void read24c02(unsigned char addr,unsigned char *dat,unsigned char length);
void write24c02(unsigned char addr,unsigned char *dat,unsigned char length);
#endif
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "reg52.h"
sbit 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<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;
}
float readtemp()
{
float temp;
unsigned char lsb,msb;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x4e);
Write_DS18B20(0x5f);
Write_DS18B20(0x00);
Write_DS18B20(0x3f);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
lsb=Read_DS18B20();
msb=Read_DS18B20();
temp=0.0625*((msb<<8)|lsb);
return temp;
}
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
//unsigned char rd_temperature(void); //; ;
float readtemp();
#endif
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
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;
}
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);
}
void settime(unsigned char hor,unsigned char min,unsigned char sec)
{
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x84,(hor/10*16+hor%10)|0x80);
Write_Ds1302_Byte(0x82,min/10*16+min%10);
Write_Ds1302_Byte(0x80,sec/10*16+sec%10);
Write_Ds1302_Byte(0x8e,0x80);
}
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void settime(unsigned char hor,unsigned char min,unsigned char sec);
#endif
13 串口通信发送练习(?存在问题)
#include <STC15F2K60S2.H>
#include <intrins.H>
#include <stdio.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(x,y) P0=y;P2|=y;P2&=0x1f
uchar busy;
char x='1';
uchar y;
char str[80];
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x40; //?????1T??
AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x0F; //???????
TL1 = 0xC7; //???????
TH1 = 0xFE; //???????
ET1 = 0; //?????%d??
TR1 = 1; //???1????
ES=1;
EA=1;
}
void serviceuart() interrupt 4
{
if(TI==1)
{
TI=0;
busy=0;
}
else if(RI)
{
RI=0;
//此处衔接接受部分
}
}
void sendbyte(unsigned char dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void sendstring(char *s)
{
while(*s)
{
sendbyte(*s++);
}
}
void main()
{
selec(0x80,0xff);
selec(0xa0,0x00);
UartInit();
while(1)
{
// y=sprintf(str,"当前温度:");
// y+=sprintf(str+y,x);
// y+=sprintf(str+y,"℃ \r\n");
sendstring("当前温度:");
sendbyte(6+'0');
sendbyte(7+'0');
sendbyte('0');
sendbyte('-');
sendbyte(' ');
sendstring("℃�\\r\n");
Delay500ms();
}
}
14 串口通信接受练习
#include <STC15F2K60S2.H>
#include <string.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar rxbuff[10];
uchar code corbuff[7]="AAASSS\0";
uchar uart;
uchar busyt;
uchar flag;
bit flagsend;
uint countjudge;
bit flagjudge;
uchar countkey;
uchar n;
bit judge(uchar a[],uchar b[])
{
uchar i;
for(i=0;i<6;i++)
{
if(a[i]!=b[i])
return 0;
}
return 1;
}
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;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
if(flagjudge)
{
++countjudge;
}
}
void keyscan()
{
}
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x40; //?????1T??
AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x0F; //???????
TL1 = 0xC7; //???????
TH1 = 0xFE; //???????
ET1 = 0; //?????%d??
TR1 = 1; //???1????
ES=1;
EA=1;
}
uchar rxindex=0;
void uartservice() interrupt 4 using 1
{
if(RI)
{
RI = 0; //??RI?
// if(corbuff[rxindex]==SBUF)
// {
// rxindex++;
// }
// else
// {
// rxindex=0;
// }
rxbuff[rxindex++]=SBUF;
}
// if(rxbuff[rxindex]=='\0')
// rxindex=0;
// else
// {
// rxindex=0;
// }
if(TI)
{
TI = 0; //??TI?
busyt = 0; //????
}
}
void sendbyte(unsigned char dat)
{
while(busyt);
busyt=1;
SBUF=dat;
}
void sendstring(char *s)
{
while(*s)
{
sendbyte(*s++);
}
}
bit x;
void main()
{
uchar i;
selec(0xa0,0x00);
selec(0x80,0xff);
Timer0Init();
UartInit();
sendbyte('5');
while(1)
{
// if(rxindex>=6)
// {
// L[1]^=1;
// L[3]=0;
// }
// else
// {
// L[1]=0;
// L[3]=1;
// }
flag=strlen(corbuff);
smg[7]=flag;
// for(i=0;i<8;i++)
// smg[i]=16;
// for(i=0;i<9;i++)
// L[i]=0;
if(rxindex>0)
{
flagjudge=1;
if(countjudge>100)
{
countjudge=0;
flagjudge=0;//?
if(rxindex==6)
{
rxindex=0;
if(judge(rxbuff,corbuff))
{
flagsend=1;
}
for(i=0;i<6;i++)
rxbuff[i]=0;
}
else
{
rxindex=0;
}
}
}
if(flagsend)
{
flagsend=0;
sendstring(" ´ó´ÏÃ÷ \r\n");
}
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
15 数据记录器
#include <STC15F2K60S2.H>
#include <iic.H>
#include <intrins.H>
#include <string.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
sbit TX=P1^0;
sbit RX=P1^1;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar xyz[10]={1,2,3,4,5,6,7,8,9,0};
uchar smgstat=0;
uchar countkey;
uchar trg,cnt;
uchar index,disindex;
uint tempsave[10]={0,0,0,0,0,0,0,0,0,0};
uchar div[2];
uint distance;
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;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
}
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
//===³¬Éù²¨========
void Delay13us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 36;
while (--i);
}
void sendwave()
{
uchar i;
for(i=1;i<16;i++)
{
TX=~TX;
Delay13us();
}
}
uint getdis()
{
uint distan;
TH1=TL1=0;
sendwave();
TR1=1;
while(RX&&!TF1);
TR1=0;
if(!TF1)
{
distan=((TH1<<8)|TL1)*0.017+0.5;
}
else
{
distan=999;
TF1=0;
}
return distan;
}
void keyscan()
{
uchar readdat=P3^0xff,i=0,j;
trg=readdat&(readdat^cnt);
cnt=readdat;
if(trg&0x08) //s4
{
distance=getdis();
tempsave[index]=distance;
div[0]=tempsave[index];
div[1]=tempsave[index]>>8;
write24c02(0x00+index*2,div,2);
Delay10ms();
read24c02(0x00+index*2,div,2);
tempsave[index]=div[1]*256+div[0];
if(index++==10)
index=0;
}
else if(trg&0x04)
{
disindex++;
if(disindex==10)
disindex=0;
}
else if(trg&0x02)
{
L[1]^=1;
for(i=0;i<10;i++)
{
tempsave[i]=0;
div[0]=tempsave[i];
div[1]=tempsave[i]>>8;
write24c02(0x00+i*2,div,2);
Delay10ms();
read24c02(0x00+i*2,div,2);
tempsave[i]=div[1]*256+div[0];
}
index=0;
disindex=0;
}
}
void main()
{
uchar i;
selec(0x80,0xff);
selec(0xa0,0x00);
for(i=0;i<10;i++)
{
read24c02(0x00+i*2,div,2);
tempsave[i]=div[1]*256+div[0];
}
Timer0Init();
while(1)
{
smg[0]=(disindex+1)/10;
smg[1]=(disindex+1)%10;
for(i=2;i<5;i++)
smg[i]=16;
smg[5]=(tempsave[disindex])/100;
smg[6]=(tempsave[disindex])/10%10;
smg[7]=(tempsave[disindex])%10;
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
void write24c02(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
while(n--)
{
IIC_SendByte(*dat);
dat++;
}
IIC_Stop();
}
void read24c02(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
while(--n)
{
*dat=IIC_RecByte();
IIC_SendAck(0);
dat++;
}
*dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
#ifndef _IIC_H
#define _IIC_H
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 write24c02(unsigned char addr,unsigned char *dat,unsigned char n);
void read24c02(unsigned char addr,unsigned char *dat,unsigned char n);
#endif
16 记录器丢弃最早数据
#include <STC15F2K60S2.H>
#include <iic.H>
#include <intrins.H>
#include <string.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
sbit TX=P1^0;
sbit RX=P1^1;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
uchar xyz[10]={1,2,3,4,5,6,7,8,9,0};
uchar smgstat=0;
uchar countkey;
uchar trg,cnt;
uchar index,disindex;
uint tempsave[10]={0,0,0,0,0,0,0,0,0,0};
uchar div[2];
uint distance;
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;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
}
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
//===³¬Éù²¨========
void Delay13us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 36;
while (--i);
}
void sendwave()
{
uchar i;
for(i=1;i<16;i++)
{
TX=~TX;
Delay13us();
}
}
uint getdis()
{
uint distan;
TH1=TL1=0;
sendwave();
TR1=1;
while(RX&&!TF1);
TR1=0;
if(!TF1)
{
distan=((TH1<<8)|TL1)*0.017+0.5;
}
else
{
distan=999;
TF1=0;
}
return distan;
}
void keyscan()
{
uchar readdat=P3^0xff,i=0,j;
trg=readdat&(readdat^cnt);
cnt=readdat;
if(trg&0x08) //s4
{
distance=getdis();
tempsave[index]=distance;
div[0]=tempsave[index];
div[1]=tempsave[index]>>8;
write24c02(0x00+index*2,div,2);
Delay10ms();
read24c02(0x00+index*2,div,2);
tempsave[index]=div[1]*256+div[0];
if(index++==10)
index=0;
}
else if(trg&0x04)
{
disindex++;
if(disindex==10)
disindex=0;
}
else if(trg&0x02)
{
L[1]^=1;
for(i=0;i<10;i++)
{
tempsave[i]=0;
div[0]=tempsave[i];
div[1]=tempsave[i]>>8;
write24c02(0x00+i*2,div,2);
Delay10ms();
read24c02(0x00+i*2,div,2);
tempsave[i]=div[1]*256+div[0];
}
index=0;
disindex=0;
}
}
void main()
{
uchar i;
selec(0x80,0xff);
selec(0xa0,0x00);
for(i=0;i<10;i++)
{
read24c02(0x00+i*2,div,2);
tempsave[i]=div[1]*256+div[0];
}
Timer0Init();
while(1)
{
smg[0]=(disindex+1)/10;
smg[1]=(disindex+1)%10;
for(i=2;i<5;i++)
smg[i]=16;
smg[5]=(tempsave[disindex])/100;
smg[6]=(tempsave[disindex])/10%10;
smg[7]=(tempsave[disindex])%10;
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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<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;
IIC_WaitAck();
}
//从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;
}
void write24c02(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
while(n--)
{
IIC_SendByte(*dat);
dat++;
}
IIC_Stop();
}
void read24c02(unsigned char addr,unsigned char *dat,unsigned char n)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xa1);
while(--n)
{
*dat=IIC_RecByte();
IIC_SendAck(0);
dat++;
}
*dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
#ifndef _IIC_H
#define _IIC_H
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 write24c02(unsigned char addr,unsigned char *dat,unsigned char n);
void read24c02(unsigned char addr,unsigned char *dat,unsigned char n);
#endif
17 串口通信与一秒闪动(ds1302)
#include <STC15F2K60S2.H>
#include <ds1302.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar code corcode[7]="AAASSS";
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar countkey;
uchar smgstat;
uchar trg,cnt;
uchar hor,min,sec;
uchar hor1,min1,sec1;
bit busy;
uchar index;
bit flagsend;
uint count1s;
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //???????
TH0 = 0xD1; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=1;
ET0=1;
}
void servicet0() interrupt 1
{
static uchar dspcom=0;
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
++count1s;
}
//================´®¿Ú====================
void UartInit(void) //4800bps@12.000MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x01; //??1?????2???????
AUXR |= 0x04; //?????1T??
T2L = 0x8F; //???????
T2H = 0xFD; //???????
AUXR |= 0x10; //???2????
ES=1;
}
void uartservice() interrupt 4
{
if(TI)
{
TI=0;
busy=0;
}
if(RI)
{
RI=0;
if(corcode[index]==SBUF)
{
index++;
}
else
{
index=0;
flagsend=0;
}
}
}
void sendbyte(uchar dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void sendstring(char *s)
{
while(*s)
{
sendbyte(*s);
s++;
}
}
void keyscan()
{
uchar readdat=P3^0xff,i;
trg=readdat&(readdat^cnt);
cnt=readdat;
if(trg&0x08)
{
if(smgstat==0)
{
smgstat=1;
}
else if(smgstat==1)
{
smgstat=0;
}
}
else if(trg&0x04)
{
}
else if(trg&0x02)
{
}
}
void main()
{
uchar i;
selec(0x80,0xff);
selec(0xc0,0x00);
settime(23,59,55);
Timer0Init();
UartInit();
sendstring("Hello World! \r\n");
sendstring(corcode);
while(1)
{
if(TH0<0xf1)
{
hor1=Read_Ds1302_Byte(0x85);
min1=Read_Ds1302_Byte(0x83);
sec1=Read_Ds1302_Byte(0x81);
hor=hor1/16*10+hor1%16;
min=min1/16*10+min1%16;
sec=sec1/16*10+sec1%16;
}
if(smgstat==0)
{
smg[0]=hor/10;
smg[1]=hor%10;
smg[3]=min/10;
smg[4]=min%10;
smg[6]=sec/10;
smg[7]=sec%10;
if(sec%2==1)
{
smg[2]=smg[5]=17;
}
else
{
smg[2]=smg[5]=16;
}
}
else if(smgstat==1)
{
for(i=0;i<7;i++)
smg[i]=16;
smg[7]=15;
}
//=========´®¿Úͨ=========
if(index>=6)
{
index=0;
flagsend=1;
sendstring("wrong!");
}
if(flagsend)
{
if(count1s>999)
{
count1s=0;
sendstring("realy?\r\n");
}
}
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
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;
}
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);
}
void settime(unsigned char hor,unsigned char min,unsigned char sec)
{
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x84,hor/10*16+hor%10);
Write_Ds1302_Byte(0x82,min/10*16+min%10);
Write_Ds1302_Byte(0x80,sec/10*16+sec%10);
Write_Ds1302_Byte(0x8e,0x80);
}
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void settime(unsigned char hor,unsigned char min,unsigned char sec);
#endif
18 长按再练习两种
#include <STC15F2K60S2.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define selec(y,x) P0=x;P2|=y;P2&=0x1f;
uchar code t_display[]={ //????
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //??
uchar smg[8]={16,16,16,16,16,16,16,16};
uchar L[9]={0,0,0,0,0,0,0,0,0};
bit flag;
uchar countkey;
uchar trg,cnt;
uchar keep1;
uchar countlong;
uchar count=1;
uchar bitset;
bit flagdouble;
uint countdouble;
bit flagone;
bit flagsignl;
void Timer1Init(void) //1??@12.000MHz
{
AUXR |= 0x40; //?????1T??
TMOD &= 0x0F; //???????
TL1 = 0x20; //???????
TH1 = 0xD1; //???????
TF1 = 0; //??TF1??
TR1 = 1; //???1????
ET1=1;
EA=1;
}
void servicet1() interrupt 3
{
static uchar dspcom=0;
selec(0x80,~(L[8]*128+L[7]*64+L[6]*32+L[5]*16+L[4]*8+L[3]*4+L[2]*2+L[1]));
selec(0xc0,0x00);
selec(0xe0,~t_display[smg[dspcom]]);
selec(0xc0,T_COM[dspcom]);
if(++dspcom==8)
dspcom=0;
++countkey;
if(flagdouble)
{
if(++countdouble>300)
{
countdouble=0;
flagone=0;
flagdouble=0;
flagsignl=1;
}
}
}
void keyscan()
{
uchar readdat=P3^0xff,i=0;
trg=readdat&(readdat^cnt);
cnt=readdat;
//双击=======================
if(trg&0x08)
{
if(flagone==0)
{
flagone=1;
flagdouble=1;
}
else if(flagone)
{
flagdouble=0;
countdouble=0;
flagone=0;
L[1]^=1;
flagsignl=0;
}
}
//=============独立松开触发,切换状态的写法==========
// if(trg&0x08)
// {
// keep1=1;
// }
// if(cnt&0x08)
// {
// if(++countlong>100&&flag==0)
// {
//
// L[8]^=1;
// keep1=0;
// flag=1;
// }
// }
//
// if(!cnt)
// {
// if(keep1==1)
// {
// L[1]^=1;
// keep1=0;
// }
// countlong=0;
// flag=0;
// }
//====================================================
//====================独立按键 按下触发,长按快速加减==========
//if(trg&0x01)
//{
// if(++count>150)
// count=1;
//}
//if(cnt&0x01)
//{
// if(++countlong>100)
// {
// countlong=95;
// if(++count>150)
// count=1;
// }
//}
//if(!cnt)
//{
// countlong=0;
//}
//========================================================
}
void main()
{
uchar i;
selec(0x80,0xff);
selec(0xa0,0x00);
Timer1Init();
while(1)
{
if(flagsignl)
{
flagsignl=0;
L[8]^=1;
}
if(count>9)
{
smg[6]=count/10%10;
}
else
smg[6]=16;
if(count>99)
{
smg[5]=count/100;
}
else
smg[5]=16;
smg[7]=count%10;
if(countkey>9)
{
countkey=0;
keyscan();
}
}
}