这一两个星期,自己围绕红外线,温度传感器,马达,液晶显示器以及PCF8591做了一系列实验,还有自己花血本买了些试验仪器,希望明年的上半年能够有所回报...深圳,等我来!!!
写此日志留个纪念,纪念那曾今走过的艰辛之路,也希望对看过此日志的人有所启发,不要枉度大学光阴....哦 ...
有三个视频和源代码。谢谢支持!!!
源代码如下:
AD&DA
#include
#include
#define uint unsigned int
#define uchar unsigned char
***it a=P2^2;
***it b=P2^3;
***it c=P2^4;
uchar store[4];
uchar code table[10]={
0x3f,~0xf9,0x5b,0x4f,
~0x99,0x6d,0x7d,0x07,
0x7f,0x6f};//共阴
void display();
void delay(uint t);//50us
void main()
{
uchar channel,DA_NUM=0x00,flag=0;
while(1)
{
if(flag==0)
{
DA_NUM=DA_NUM+1;
if(DA_NUM>=254)
{
DA_NUM=0x00;
flag=1;
}
}
else
{
DA_NUM=DA_NUM-1;
if(DA_NUM<=0x00)
flag=0;
}
switch(channel)
{
case 0:PCF_SENT_BYTE_COMM(0x90,0x41);
store[0]=PCF_RECEIVE_BYTE_COMM(0x90)*2;
break;
default:break;
}
delay(500);
channel++;
if(channel>4)
channel=0;
display();
}
}
void delay(uint t)//50us
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/************display()**************/
void display()
{
uchar j,j1,covt[4];
covt[0]=0;
covt[1]=store[0]/100;
covt[2]=(store[0]%100)/10;
covt[3]=store[0]%10;
for(j1=0;j1<4;j1++)
{
for(j=0;j<4;j++)
{
switch(j)
{
case 0:c=0;b=0;a=0;break;
case 1:c=0;b=0;a=1;break;
case 2:c=0;b=1;a=0;break;
case 3:c=0;b=1;a=1;break;
/* case 4:c=1;b=0;a=0;break;
case 5:c=1;b=0;a=1;break;
case 6:c=1;b=1;a=0;break;
case 7:c=1;b=1;a=1;break; */
}
P0=table[covt[j]];
delay(5);
P0=0x00;
}
}
}
/****************************************************************/
/********************此模块为IIC总线的驱动程序*******************/
/****************************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define NOP _nop_()
***it SDA=P2^0;
***it SCL=P2^1;
void IIC_START()
{
SDA=1;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SDA=0;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=0;
NOP;
NOP;
}
/*****************STOP****************/
void IIC_STOP()
{
SDA=0;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SDA=1;
NOP;
NOP;
}
/**********NOT_ACK**************/
void IIC_NOT_ACK()
{
SDA=1;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=0;
NOP;
NOP;
}
/***********SENT_BYTE***********/
void IIC_SENT_BYTE(uchar dat1)
{
uchar i;
SCL=0;
for(i=0;i<8;i++)
{
SDA=(bit)(dat1&0x80);
dat1=dat1<<1;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=0;
}
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=1;
while(SDA);
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=0;
}
/*********READ_IIC*************/
uchar IIC_READ()
{
uchar i,temp;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
temp=(temp<<1)|SDA;
}
SCL=0;
NOP;
NOP;
NOP;
NOP;
NOP;
SDA=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=1;
NOP;
NOP;
NOP;
NOP;
NOP;
SCL=0;
return temp;
}
/************************************************/
/*************此模块为PCF8591驱动模块************/
/************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
/********************************************************/
/***********************AD转换驱动模块*******************/
/********************************************************/
/*****************
单片机向pcf8591发送控制字节命令******************/
void PCF_SENT_BYTE_COMM(uchar dat2,uchar dat3)//发送控制字节命令
{
IIC_START();//启动IIC发送控制命令
IIC_SENT_BYTE(dat2);//发送器件地址和写命令
IIC_SENT_BYTE(dat3);
IIC_STOP();
}
/******** 单片机接受8591传来的数据********/
uchar PCF_RECEIVE_BYTE_COMM(uchar dat4)//字节写字节读
{
uchar temp_dat;
IIC_START();//启动IIC发送控制命令
IIC_SENT_BYTE(dat4+1);//发送器件地址和写命令
temp_dat=IIC_READ();
IIC_STOP();
return temp_dat;
}
/*********************************************************/
/**********************DA转换控制*************************/
/*********************************************************/
uchar PCF_DA_CONVERT(uchar dat5,uchar dat6,uchar dat7)
{
IIC_START();//启动IIC发送控制命令
IIC_SENT_BYTE(dat5);//发送器件地址和写命令0x90
IIC_SENT_BYTE(dat6);//发送控制命令 0x42 通道2控制
IIC_SENT_BYTE(dat7);//发送数据,转换成模拟信号
IIC_STOP();
}
#include
#define uint unsigned int
#define uchar unsigned char
extern void IIC_START();
extern void IIC_STOP();
extern void IIC_NOT_ACK();
extern void IIC_SENT_BYTE(uchar dat1);
extern uchar IIC_READ();
extern void PCF_SENT_BYTE_COMM(uchar dat2,uchar dat3);//发送控制字节命令
extern uchar PCF_RECEIVE_BYTE_COMM(uchar dat4);
extern uchar PCF_DA_CONVERT(uchar dat5,uchar dat6,uchar dat7);
红外线
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
***it beep=P1^5;
***it relay=P1^4;
***it IR=P3^2;
uchar IR_CONV[2],IR_STORE[4];
void init();
void beep_song();
void delay_IR(uchar i);
void beep_song();
uchar code table[10]={
~0x3f,0xf9,~0x5b,~0x4f,
0x99,~0x6d,~0x7d,~0x07,
~0x7f,~0x6f};//共阴
uchar code LCD_DISPLAY1[]={"fan: on"};
uchar code LCD_DISPLAY2[]={"fan:off"};
void main()
{
init();
lcd_init();
while(1);
}
void init()
{
EA=1;
EX0=1;
TCON|=1;//下降沿方式触发
IR=1;
beep=1;
}
void int1() interrupt 0 using 0
{
uchar i1,j1,num=0,num1;
EX0=0;//关中断
delay_IR(15);
while(!IR) //中断信号来临,等待IR等于1,通过1的长度来判断是先导码信号还是连发码
{ delay_IR(1);} //
for(i1=0;i1<4;i1++)
{
for(j1=0;j1<8;j1++)
{
while(IR)
{ delay_IR(1); }
while(!IR);
{ delay_IR(1); }
while(IR)
{
delay_IR(1);
num++;
if(num>=30)
{
EX0=1;
return;
}
}
IR_STORE[i1]=IR_STORE[i1]>>1;//低位在前
if(num>=8) {IR_STORE[i1]=IR_STORE[i1]|0X80;}//检查到是1就赋1
num=0;
}
} P2=0x00;
if((IR_STORE[2]!=~IR_STORE[3]))
{
EX0=1;
return;
}
IR_CONV[0]=IR_STORE[2]&0x0f;//低
IR_CONV[1]=IR_STORE[2]>>4;//高
if(IR_CONV[0]>9)
IR_CONV[0]=IR_CONV[0]+0x37;
else
IR_CONV[0]=IR_CONV[0]+0x30;
if(IR_CONV[1]>9)
IR_CONV[1]=IR_CONV[1]+0x37;
else
IR_CONV[1]=IR_CONV[1]+0x30;
if(IR_STORE[2]==0x0c)//开风扇
{
relay=0;
wri_comm(0x80+0x45);
for(num1=0;num1<7;num1++)
{
wri_data(LCD_DISPLAY1[num1]);
}
// wri_comm(0x01);
}
if(IR_STORE[2]==0x16)//关风扇
{
relay=1;
wri_comm(0x80+0x45);
for(num1=0;num1<7;num1++)
{
wri_data(LCD_DISPLAY2[num1]);
}
//wri_comm(0x01);
}
wri_comm(0x85);
wri_data(IR_CONV[1]);
wri_comm(0x86);
wri_data(IR_CONV[0]);
beep_song();
EX0=1;
}
void delay_IR(uchar i)
{
uchar j;
for(i;i>0;i--)
{ for(j=0;j<11;j++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void beep_song()
{
uchar i2;
for(i2=0;i2<2;i2++)
{
beep=~beep;
delay_IR(180);
}
beep=1;
}
#include
#include
#define uint unsigned int
#define uchar unsigned char
***it rs = P2^6;
***it rw = P2^5;
***it en = P2^7;
void wri_comm(uchar w);
void wri_data(uchar r);
uchar bf();
void dlcd(uint d);
void lcd_init()
{
wri_comm(0x38);//00110000,不解释
_nop_();
wri_comm(0x0c);//00001111
_nop_();
wri_comm(0x06);//00000110
_nop_();
wri_comm(0x01);//00000001
_nop_();
}
/***************write command*********************/
void wri_comm(uchar w)
{
while(bf()==0x80);//检查bf是否繁忙,为1繁忙,0不忙
en=0;
rs=0;
rw=0;
_nop_();
_nop_();
P0=w;
dlcd(4);
en=1;
dlcd(4);
en=0;
}
/******************bf检测**************************/
uchar bf()// 为1,忙....
{
uchar fed;//反馈信号
rs=0; //写命令
rw=1;
en=1;
dlcd(4);
fed=(P0&0x80);//显示为________-----------__________
en=0;
return(fed);
}
/*********************read_command********************/
void wri_data(uchar r)
{
while(bf()==0x80);//检查bf是否繁忙,为1繁忙,0不忙
rs=1;//写数据到CGRAM啦
rw=0;
en=0;
_nop_();
P0=r;
dlcd(4);
en=1;
dlcd(4);
en=0;
}
void dlcd(uint d)
{
for(d;d>0;d--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*****************************/
/**********公共模块***********/
/*****************************/
#define uint unsigned int
#define uchar unsigned char
extern void lcd_init();
extern void wri_comm(uchar w);
extern void wri_data(uchar r);
谢谢采访!!!