51与光敏电阻经典编辑程序.docx
- 文档编号:29778157
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:13
- 大小:16.63KB
51与光敏电阻经典编辑程序.docx
《51与光敏电阻经典编辑程序.docx》由会员分享,可在线阅读,更多相关《51与光敏电阻经典编辑程序.docx(13页珍藏版)》请在冰豆网上搜索。
51与光敏电阻经典编辑程序
本程序是利用光敏电阻和51单片机来控制led灯亮灭
#include
#include
#include
#defineAddWr0x90//写数据地址
#defineAddRd0x91//读数据地址
sbitRST=P2^4;//时钟加上后可以关掉DS1302芯片输出
sbitSda=P2^0;//定义总线连接端口
sbitScl=P2^1;
sbitdula=P2^6;
sbitwela=P2^7;
bitADFlag;//定义AD采样标志位
unsignedcharcodeDatatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
dataunsignedcharDisplay[8];//定义临时存放数码管数值
/*------------------------------------------------延时程序------------------------------------------------*/
voidmDelay(unsignedcharj)
{
unsignedinti;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/*------------------------------------------------初始化定时器1------------------------------------------------*/
voidInit_Timer1(void)
{
TMOD|=0x10;
TH1=0xff;/*Initvalue*/
TL1=0x00;
//PT1=1;/*优先级*/
EA=1;/*interuptenable*/
ET1=1;/*enabletimer1interrupt*/
TR1=1;
}
/*------------------------------------------------启动IIC总线------------------------------------------------*/
voidStart(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*------------------------------------------------停止IIC总线------------------------------------------------*/
voidStop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*------------------------------------------------应答IIC总线------------------------------------------------*/
voidAck(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------非应答IIC总线------------------------------------------------*/
voidNoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------发送一个字节------------------------------------------------*/
voidSend(unsignedcharData)
{
unsignedcharBitCounter=8;
unsignedchartemp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------读入一个字节并返------------------------------------------------*/
unsignedcharRead(void)
{
unsignedchartemp=0;
unsignedchartemp1=0;
unsignedcharBitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------写入DA数模转换------------------------------------------------*/
voidDAC(unsignedcharData)
{
Start();
Send(AddWr);//写入芯片地址
Ack();
Send(0x40);//写入控制位,使能DAC输出
Ack();
Send(Data);//写数据
Ack();
Stop();
}
/*------------------------------------------------读取AD模数转换------------------------------------------------*/
unsignedcharReadADC(unsignedcharChl)
{
unsignedcharData;
Start();//写入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Chl的值分别为0、1、2、3,分别代表1-4通道
Ack();
Start();
Send(AddRd);//读入地址
Ack();
Data=Read();//读数据
Scl=0;
NoAck();
Stop();
returnData;//返回值
}
voidcmg(void)//数码管锁存函数关时钟DS1302
{
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0x00;
wela=0;
RST=0;//关时钟DS1302
}
/*------------------------------------------------主程序------------------------------------------------*/
voidmain()
{
unsignedcharnum;//DA数模输出变量
unsignedcharADtemp;//定义中间变量
InitLcd();
mDelay(20);
Init_Timer1();
cmg();//数码管锁存
while
(1)
{
ADtemp=ReadADC
(2);
if(ADtemp>=250)
{
P1=0X00;
}
elseif(ADtemp<=250&&ADtemp>=210)
{
P1=0X80;
}
elseif(ADtemp<=210&&ADtemp>=180)
{
P1=0Xc0;
}
elseif(ADtemp<=180&&ADtemp>=150)
{
P1=0Xe0;
}
elseif(ADtemp<=150&&ADtemp>=120)
{
P1=0Xf0;
}
elseif(ADtemp<=120&&ADtemp>=90)
{
P1=0Xf8;
}
elseif(ADtemp<=90&&ADtemp>=60)
{
P1=0Xfc;
}
elseif(ADtemp<=60&&ADtemp>=30)
{
P1=0Xfe;
}
}
}
/*------------------------------------------------定时器中断程序------------------------------------------------*/
voidTimer1_isr(void)interrupt3using1//定时器1执行数码管动态扫描
{
staticunsignedintj;
TH1=0xfb;//重新赋值
TL1=0x00;
j++;
if(j==200)
{j=0;ADFlag=1;}//定时置位AD采样标志位
}
#include
#include
#include
sbitRS=P3^5;//Pin4
sbitRW=P3^6;//Pin5
sbitE=P3^4;//Pin6
#defineDataP0//数据端口
unsignedcharTempData[8];
unsignedcharSecondLine[]="";
unsignedcharFirstLine[]="";
voidDelayUs(unsignedcharus)//delayus
{
unsignedcharuscnt;
uscnt=us>>1;/*Crystalfrequencyin12MHz*/
while(--uscnt);
}
voidDelayMs(unsignedcharms)//delayMs
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
voidWriteCommand(unsignedcharc)
{
DelayMs(5);//shortdelaybeforeoperation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
voidWriteData(unsignedcharc)
{
DelayMs(5);//shortdelaybeforeoperation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
voidShowChar(unsignedcharpos,unsignedcharc)
{
unsignedcharp;
if(pos>=0x10)
p=pos+0xb0;//是第二行则命令代码高4位为0xc
else
p=pos+0x80;//是第二行则命令代码高4位为0x8
WriteCommand(p);//writecommand
WriteData(c);//writedata
}
voidShowString(unsignedcharline,char*ptr)
{
unsignedcharl,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));//循环显示16个字符
}
voidInitLcd()
{
DelayMs(15);
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x06);//显示光标移动位置
WriteCommand(0x0c);//显示开及光标设置
WriteCommand(0x01);//显示清屏
}
voiddisp(void)
{
FirstLine[2]='0'+TempData[0];
FirstLine[4]='0'+TempData[1];
FirstLine[3]='.';
FirstLine[6]='V';
FirstLine[9]='0'+TempData[2];
FirstLine[11]='0'+TempData[3];
FirstLine[10]='.';
FirstLine[13]='V';
SecondLine[2]='0'+TempData[4];
SecondLine[4]='0'+TempData[5];
SecondLine[3]='.';
SecondLine[6]='V';
SecondLine[9]='0'+TempData[6];
SecondLine[11]='0'+TempData[7];
SecondLine[10]='.';
SecondLine[13]='V';
ShowString(0,FirstLine);
ShowString(1,SecondLine);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 光敏 电阻 经典 编辑 程序