C8051F320红外发射接收程序
基于C8051F系列单片机的无线收发电路设计

1.1 发射电路 监测终端与探测节点的硬件电路相似,监测终端通过液晶显示探测节点的编号、所传输的数据等信息并通过5 V开关电源供电。而探测节点则没有液晶显示器,通过2节普通干电池构成3 V电源供电。发射电路使用单片机PCA寄存器产生3 MHz的振荡频率,直接控制LC谐振线圈进行振荡。C8051F330D单片机具有睡眠模式,可降低节点电路的功耗,其内部的编程计数器阵列(PCA0)提供增强的定时器功能,与标准8051的计数器/定时器相比,不占用额外的CPU资源。使用PCA0产生3 MHz的载波频率,以推挽方式输出,增大后级谐振回路的发射功率。1.2 接收放大电路设计 使用AD8656双运放芯片组成接收放大电路。该运放适合+2.7~+5.5 V电源电压供电,是具有低噪声性能的精密双运算放大器。AD8656型CMOS放大器在满共模电压(VCM)范围内提供250 mV精密失调电压最大值,且在10 kHz处提供低电压噪声谱密度和0.008%的低真,无需外部三极管增益级或多个并行的放大器以减小系统噪声。通过干电池提供3V单电源供电,接收放大电路。放大电路由AD8656进行两级放大,抵消线圈所感应到的信号电压幅值因距离的增加而产生的衰减,放大所接收到的微弱信号,增加无线传输距离。系统接收电路经D8656放大后的输出电压输至单片机进行A/D转换,对数据进行编解码,而未采用检波解调电路,可有效简化电路结构。
采用软件编程实现ASK调制功能节点向监测终端发送数据,当监测终端液晶屏指示“接收成功”时,表明在该距离下可以进行通信,不断增大节点线圈与终端线圈之间的距离直到不能正常接收数据为止。测试表明,有效通信距离可以达到24 cm。在探测节点通过桥接的方式与监测终端正常通信时,测得桥接节点的平均功耗约为102 mW,而探测节点间的平均桥接距离约为20 cm。 与传统无线收发模块相比。在需要大规模、密集型部署、近距离无线通信,并且电路体积、功耗、成本受限制的场合,基于C8051F系列单片机的无线收发电路有广阏的应用前景。
基于51单片机红外发射与接收C程序(word文档良心出品)

sbit LED=P1^0; //发射指示灯
sbit out=P3^7;
uchar i,a,num1;
void init()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
void delay(uchar aa)
{
uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(num1=8;num1>0;num1--) //原来用的是a后来出错,肯定在这里!
{
khz(40);
if(num&0x01)
delayms(93);//delay 1.5ms
else
delayms(65);//delay 1ms
num=num>>1;
}
khz(20);
}
void tishi()
if(key1==0)
{
while(!key1);
fashu(0xf3);
tishi();
}
}
if(key2==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key2==0)
{
while(!key2);
fashu(0x3f);
while(1)
{
keyscan();
}
}
红外接收程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
红外发射接收程序

红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。
(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。
红外接收程序讲解

红外接收程序讲解 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
下面,我们将使用下面两种设备:另外,使用51单片机进行解码。
2、原理图从原理图看出,IR的data脚与51的PD2相连。
2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。
a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码()组成。
下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。
b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。
下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”。
3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(+)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。
用8051单片机接收红外遥控的实现

用8051单片机接收红外遥控的实现
赵瑛琪
【期刊名称】《电脑知识与技术》
【年(卷),期】2006(000)001
【摘要】μPD6121,6122是用NEC传输格式的红外线遥控发射芯片,目前广泛的用在电视,录像机,音响,空调等设备上.8051系列单片机是目前应用最为广泛的8位机,其内核由美国因特公司设计.本文介绍如何用8051单片机准确接收红外遥控信号,并写出高效的代码.
【总页数】2页(P193-194)
【作者】赵瑛琪
【作者单位】湖南城建职业技术学院信息工程系,湖南,湘潭,411101
【正文语种】中文
【中图分类】TP368
【相关文献】
1.IRM81XY系列红外遥控接收微型组件及红外遥控发射,接收电路 [J], 杜雪芳
2.基于PS/2接口红外遥控接收装置的设计与实现 [J], 李乐
3.嵌入式红外遥控键盘接收端和USB闪存的整合实现 [J], 李中政;闫鹤;李娜;乔贵春
4.智能型红外遥控器中信号接收与压缩方法 [J], 李慧静;金晓民;井雅;张博尧
5.红外遥控接收放大器的解码特性 [J], 陈巍;
因版权原因,仅展示原文概要,查看原文内容请购买。
C8051F320驱动金鹏2x8C-5液晶C程序

C8051F320驱动金鹏2x8C-5液晶C程序程序师从网上找的,稍加修改,用c8051f320的开发板驱动,能显示字符汉字点阵图形,下面是程序:/*c语言实例st7920标签:无标签ST7920驱动的12864(并行工作方式)*//******************************************************************************Copyright 2007All rights reserved.文件名: .c模块名称:st7920 并行方式驱动12864液晶驱动功能概要:st7920显示驱动取代版本:0.0.1修改人:pulan完成日期:2007.07.08升级说明:createCPU: stc89c58 主频:11.0592M液晶型号:生产厂家:驱动芯片:st7920******************************************************************************///#include <reg52.h> 2009年6月10日修改,用于C8051F320单片机,主频12MH, #include <C8051F320.h> // 两行液晶模块。
HYL修改。
#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit RS = P2^1; //H=data; L="command";sbit RW = P2^2; //H=read; L="write";sbit E = P2^4; //input enable;sbit PSB= P2^5; //H=并口; L="串口";sbit RST= P2^3; //Reset Signal 低电平有效sbit busy=P0^7; //lcd busy bitvoid wr_lcd (uchar dat_comm,uchar content);void chk_busy (void);void delay (uint us);void delay1 (uint ms);uchar code tab1[]={"本系列中文模块内""置二级字库,可在"};uchar code tab2[]={"任意位置反白显示""使用更方便更灵活"};uchar code tab31[]={"保定市宇恒科技荣""誉出品为您服务!!"//"金鹏科技有限公司"//"Golden Palm TECH"};/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*/ /*-- 宽度x高度=128x32 --*/uchar code tab33[]={0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab32[]={/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab5[]={/*-- 调入了一幅图像:F:\梁\画图\COCK.bmp --*//*-- 宽度x高度=128x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x43,0x01,0x80,0x00,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xFF,0x07,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xFC,0x1E,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xBF,0xFF,0xFC,0x00,0x7F,0xFC,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,0x00,0xFF,0xC0,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xDF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xFF,0xE0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x1F,0xFF,0xF0,0x03,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xC0,0x7C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xF0,0x00,0x3F,0xFF,0xFF,0xF8,0x1E,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0xFE,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,0x87,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x83,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xC3,0x88,0x00,0x00,00x00,0x00,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF3,0x08,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xF2,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xF0,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/******************************************************************************************* 函数名称:* 功能描述:液晶初始化* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void init_lcd (void){RST = 1;PSB = 1;wr_lcd(comm,0x30); /*30---基本指令动作*/wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/wr_lcd(comm,0x06); /*光标的移动方向*/wr_lcd(comm,0x0c); /*开显示,关游标*/}/******************************************************************/void SysClkInit(void)//配置系统时钟 C8051F320初始化{OSCICN=0x81;RSTSRC=0x04;}/**********************************************************************/void SystemInit(void)//系统配置 C8051F320初始化{CA0MD&=~0x40;//禁止看门狗定时器EA=1;ES0=1;}/************************************************************/void PortInit(void)//端口配置 C8051F320初始化{//P2MDIN = 0x0F;P2MDOUT = 0xff;//P0MDOUT = 0x7f;// XBR0 = 0x07;XBR1 = 0x40;}/******************************************************************************************* 函数名称:chn_disp* 功能描述:显示汉字或字符* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void chn_disp(uchar code *chn){uchar i,j;wr_lcd(comm,0x34);wr_lcd(comm,0x05); //第二行反白显示wr_lcd(comm,0x30);wr_lcd(comm,0x80);for(j=0;j<4;j++){if(j==1) //{wr_lcd(comm,0x90);} //修改后可用二行液晶显示,源程序是四行液晶for(i=0;i<16;i++)wr_lcd(dat,chn[j*16+i]);}}/******************************************************************************************* 函数名称:chn_disp1* 功能描述:上半屏显示汉字或字符,此函数可直接用于二行液晶。
红外收发程序

#include "reg51.h"#define uchar unsigned char#define uint unsignedint//用单片机来模拟发送SAA3010数据码//作者:全立波,quanlibo@ucharsendstart=3; //起始位2位+控制位1位+系统位6位=8位,其中起始两位为1,其它各为均为0ucharsenddatas=1; //数据位为6位,这里只用该字节的前6位uchar count=0;sbit P1_0=P1^0; //用来控制红外发光二极管来发送数据bit sendflag=0; //发送数据的标志量void Init();void sendData();uchardatas[28];void main(void){Init();while(1){if(sendflag==1){//串口不允许中断ET1=0;TR1=0;ES=0;//一个周期是26.32us,那么一个周期的一半应该是13us,所有的错误全部都在这里(看来网上发表的文章也是一些理论没有真正实践过)//12MHZ,38KHZ//TH1=0xf3;//TL1=0xf3;//11.0592MHZ ,38KHZTH1=0xf4;TL1=0xf4;sendflag=0;sendData();}};}//这里定义1位的时间为在 1.651ms,那么半位的时间为1.651ms/2=0.8255ms=825.5us//事先准备要发送的数void sendData(){uchar c=0;uint b=0;//待发送的数据uchar s=0;sendstart=3;//起始码for(c=0;c<8;c++){if(senddatas-(senddatas/2)*2){//为1b=b|1;}else{//为0b=b|0;}if(c<7){b=b<<1;}senddatas=senddatas>>1;}b=b<<8>>2;//做起来真是精细,还要搞掉后面没有被占掉的值,否则数据不准确,做学问真的是不容易啊b=b |sendstart;//下面代码用来装配发送数据c=0;//先发送起始位2位+控制位1位+系统位5位=8位,后面的6位是数据位,共14位//用NPN三极管放大信号do{if(b-(b/2)*2){//发送1的前半位datas[s++]=1;}else{//发送0的前半位datas[s++]=0;}if(b-(b/2)*2){//发送1的后半位datas[s++]=0;}else{//发送0的后半位datas[s++]=1;}//数据循环右移,发送下一位数据b=b>>1;}while(++c<14);//开始发送数据count=0;//12MHZ,延时0.8255ms用//TH0=0xfc;//TL0=0xc6;//11.0592MHZ,延时0.8255ms用TH0=0xfd;TL0=0x07;ET0=1;TR0=1;}void Init(){//刚开始启动不发送P1_0=0;//我们这里利用定时器1的工作方式2(8位自动重载)来发送载波信号TMOD=0x21;EA=1;//总中断允许ES=1;//允许串口中断//串口工作于方式1,8位UART,波特率可变,允许串口接受数据,工作方式为1,无奇偶校验位。
c8051f320

(6)存储器 1280 字节的内部数据 RAM(1K+256);16K 字节的可以在系统编程的 Flash 闪速存 储器。 (7)数字外设 25 个字节宽的端点 I/O;所有口线均耐 5V 电压;可同时使用 UART 串口、硬件 SMBusTM、SPITM;带有 4 个可编程的 16 位计数器/定时器阵列;带有 5 个捕捉/比较模块的 通用 16 位计数器/定时器。 (8)时钟源 内部晶振,精度为 0.25;支持所有 USB 和 UART 模式;外部晶振器:晶体、RC、C 或 外部时钟;内置一个针对 USB 控制器的片上时钟乘法器。 (9)供电电压 片上的参考电源校准器支持 USB 总线电源操作;校准器的 Bypass 模式支持 USB 内部电源操作。 (10)性能特点 C8051F320 在保持 CISC 结构及指令系统不变的情况下,对指令运行实行流水 作业,推出了 CIP-51 的 CPU 模式,从而大大提高了指令运行速度,使 8051 兼容机系列进入了 8 位高速单片机行列。 传统的单片机 I/O 端口大都是固定为某个特殊功能的输入/输出口,可以是单功能或多功 能,I/O 端口可编程选择为单向/双向以及上拉、开漏等。这种固定方式既占用较多引脚,配置 又不够灵活。C8051F320 采用开关网络以硬件方式实现 I/O 端口的灵活配置,如图 1 所示。 在这种通过交叉开关配置的 I/O 端口系统中,单片机外部为通用 I/O 口,如 P0 口、P1 口和 P2 口。内有输入/输出的电路单元通过相应的配置寄存器控制的交叉开关配置到所选择的端口 上。
C8051F320 单片机简介 1.功能部件及特点 (1)模拟外设 10 位的 ADC(±1LSB INL):其最大可编程转换速率可达 200kbps,可多达 17 个外 部输入,可编程为单端输入或差分输入,内置一个温度传感器(±3℃);2 个模拟比较器;2.4V 的内 部电压基准;精确的 Vdd 监视器和欠压检测器。 (2)USB 功能控制模块 满足 USB2.0 协议;可在全速(12 Mbps)或低速(1.5 Mbps)下运行;集成有 一个时钟恢复源,对于全速或低速传输均可不用外部晶振;支持 8 个灵活通用的端点;内置一 个 1K 的 USB 专用缓冲存储器;集成了一个 USB 接收器,不需要外部电阻。 (3)片内调试模块 片内调试电路提供全速、非侵入式的在系统调试(不需仿真器);支持端点、 单步、观察点、堆栈监视器;可以观察/修改存储器和寄存器;比使用仿真芯片、目标仿真头和 仿真插座的仿真系统有更好的性能。 (4)工作温度范围:0~70℃ (5)高速 8051 微控制器内核 采用流水线指令结构,其 70%的指令的执行时间为一个或两个系 统时钟周期;速度可达 25 MIPS(时钟频率为 25MHz 时)。
红外接收和发送程序

遥控发送程序ORG0000HLOOPO: MOV SCON ,#0C0H ;设定串行口工作方式3MOV TMOD , #20H ;T1工作方式2MOV PCON , #00H ;波特率设置MOV TL1 , #OF4H ;定时初始值F4送TL1MOV TH1 , #OF4H ;定时初始值F4送TH1*******************************************************************CP: JB P1.0 ,CPK ;判断遥控按键P1.0是否按下LCALL PP ;调用延时JB P1.0 , CPSTEB TR1 ;启动定时器T1MOV 50H ,#5FH ; 将立即数5FH 送50H 存储单元MOV RO ,#50H;将立即数50H 送RO寄存器MOV R1 , #05H ;将立即数05H送R1寄存器IND: MOV A,@R0 ; 将50H中的5F送累加器AMOV C , PMOV TB8 ,CMOV SBUF ,A;将要发送数据5F送串行数据缓冲器AAA : JNB P1.1 ,ON1 ; P1.1是”0”电平时转至调制程序BBB”JB P1.1 ,CCC ;P1.1是”1”电平等待AMP AAACCC : JBC TI ,CP ;判断发送中断标志位]SETB P1.2 ;P1.2置1AJMP BBBON1: ACALL ONAJMP AAAPP: MOV R6, #05H ;延时子程序100P3: MOV R5 , #OF9HNOPNOP100P4: DJNZ R5 ,100P4DJNZ R6 ,100P3RETON: CP1 P1.2 ;0电平调制程序。
(共有82个CP1 P1.2)RET********************************************************************4、遥控接收程序W AIT: JBC R1 ,LOOP5 ;遥控接收程序LJMP KEYLOOP5: MOV R0 ,#51H;将立即数51H送R0MOV R7 ,#03H ;将立即数03H送R7LOOP6: MOV A ,SBUF ;将串行缓冲器接收到的数据累加器AJNB PSW.0 LOOP7 ;标志位F0清零了吗?JNB RB8 ,LOOP8 ;数据接收完了吗?LOOP9 MOV @RO ,A;开锁处理程序MOV R1 , 51HCJNE R1 ,#1EH ,LPDJNZ 52H , KPCLR P1.7MOV 52H ,# 02HMOV R0 ,#OOHLJMP W AITKP: SETB P1.7MOV R0 ,#00HLJMP W AITLP: DJNZ R7 ,W AITCLR PSW.5LJMP W AITLOOP7: JB RB8 , LOOP8LJMP LOOP9LOOP8: SETB PSW.5 ;给标志位F0置1LJMP W AIT ;继续接收数据。
C8051F320

常见的测温仪器有水银温度计、热敏电阻温度计、热电偶温度计、半导体温度计等,然而传统的温度计不能体现温度变化的连续性,本文以C8051F320为核心芯片,设计一种具有高实时性的温度检测仪[4,5,6],该检测仪可以实时采集温度数据,通过USB总线将温度信息传给计算机,通过应用软件绘制出日温度变化曲线图,年温度变化曲线图。电路各部分关系如图5所示。
关键词:C8051F320,A/D转换,USB接口
C8051F320 and its application in the temperature detection
YANG Jin-hong1,LIN Yong-hai2†
(1.department of electronic engineering,huaian college of information technology.huaian.223003,JiangsuProvince,China;
系统电路结构图常见的测温仪器有水银温度计热敏电阻温度计热电偶温度计半导体温度计等然而传统的温度计不能体现温度变化的连续性本文以c8051f320为核心芯片设计一种具有高实时性的温度检测仪456该检测仪可以实时采集温度数据通过usb总线将温度信息传给计算机通过应用软件绘制出日温度变化曲线图年温度变化曲线图
·时钟源
内部晶振的精度为0.25,支持所有USB和UART模式;外部晶振器:晶体、RC、C或外部时钟;内置一个针对与USB控制器的片上时钟乘法器。
·供电电压
片上的参考电源校准器支持USB总线电源操作;校准器的Bypass模式支持USB内部电源操作。
3.C8051F20的在大气温度检测方面的应用
大气温度是表示空气冷热程度的物理量,是大气主要状态、气象要素中主要要素之一。在日常生活实践中,许多物理现象和化学过程无不与温度有密切关系,同时,温度也是人们安排衣食住行。开展生产、科研活动。特别是农业墒情与预防灾害,如防火(森林火险级别)、防冻(霜冻)均以温度为依据。
红外发射与接收程序

TR1=1;
while(Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//==============================================================
看个例子:
#include <reg51.h>
#define c(x) (x*120000/120000)
sbit Ir_Pin=P3^6;
sbit beep=P3^7;
//sbit RELAY=P2^0;
unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
beep=1;
//RELAY=0;
//delay_50ms(50);
//RELAY=1;
}
while(1);
}
unsigned int Ir_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!Ir_Pin && (TH1&0x80)==0);
TR1=0;
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}
Led_Buf[0]=Ir_Buf[2]&0xf;
红外发射器:可以用单片机产生38K的载波,也可以用555振荡产生,也可以用红外遥控器
红外发射接收程序

/*-----------------------------------------------名称:红外发射接收修改:无内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。
*正常情况下,由于反射和高灵敏度接收,LED4(P1.7)一直闪烁,可以用黑色纸片完全遮挡接收头使*之不能接收到发射管的信号,这是LED4熄灭。
说明功能性正常------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P2^3; //红外发射sbit LED1=P0^1;bit Flag;void Init_Timer0(void){TMOD |= 0x01;TH0=0xf0; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void Timer0_isr(void) interrupt 1 using 1{TH0=0x0f; /* Init value */TL0=0x00;Flag=!Flag;}/******************************************************************/ /* 主函数 *//******************************************************************/ main(){unsigned int j;Init_Timer0(); //定时器初始化LED1=0;while(1){ //读取一体化接收头数值if(Flag){for(j=0;j<27;j++)//大约38KHz{LED=!LED; //发射管输出}}}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P0^1;sbit IR=P2^3; //红外一体化接收sbit LED1=P0^2;sbit BUZZER=P2^5;void delayus(unsigned us){ unsigned int i,j;for(i=0;i<us;i++)for(j=0;j<101;j++);}main(){LED1=0;BUZZER=0;while(1){unsigned int a,b;b=0;for(a=0;a<22;a++){ if(IR==0)b=b+1;delayus(6);//对脉冲采样}if(b>5){LED=0;BUZZER=0;}else{LED=1;BUZZER=1;}//有障碍物灯灭、蜂鸣器响}}。
用8051单片机接收红外遥控的实现

电脑知识与技术研究开发1引言对遥控信号的接收实际上是把红外光信号转换成TTL信号的过程,现在有集成度比较高的一体化接收头来处理。
对信号的解码方式则可以结合不同的MCU硬件资源写出不同的解码程序来。
这里使用8051单片机,具体是用外部中断脚INT0来接收信号,用计数器Time0测两次外部中断产生的时间间隔来区别每个位(bit)是“1”或“0”,再把数据流还原成各种命令,来控制其他的I/O做不同的工作。
2系统构成红外遥控系统由发射和接收两大部分组成,应用编/解码集成电路芯片来进行控制操作。
发射部分即遥控器(包括键盘矩阵、编码调制、红外发送二极管);接收为红外接收头(包括光/电转换、放大、解调),解码MCU(这里用的是8051单片机),如图1。
图13编码方式遥控发射器专用芯片很多,根据编码格式可以分成两大类,即日本NEC的uPD6121G系列和荷兰Philips的RC5传输协议系列。
这里我们以运用比较广泛的前者来说明。
本协议采用脉宽调制的串行码,用脉宽为0.56ms、间隔0.565ms、周期为1.125ms的组合表示二进制的“0”;用脉宽为0.56ms、间隔1.69ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
UPD6121G产生的遥控编码是连续的32位二进制码组(如图3所示),其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
后16位为8位操作码(功能码)及其反码。
图2图3遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。
图4当一个键按下超过36ms,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9m~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
51单片机的红外收发C程序

{
while(--tt);
}
void main(void)
{
signalBit=0;
P2_2= 0;
设定定时器 TMOD=0x12;// 1 和 0 工作方式为 1 和 2
EX1=1;
定时器 中断允许 IT1=1;
ET0 =1; //
0
ET1 =1;
1
}
}
a[i]=temp; //将解码出的字节值储存在 a[i]
temp=0;
}
解码正确,返回 if(a[2]==~a[3])
return 1; //
1
else return 0;
}
/************************************************************
case 0x7d: SendIRdata(irData); break;
case 0xeb: SendIRdata(irData); break;
case 0xdb: SendIRdata(irData); break;
case 0xbb: SendIRdata(mazhi); break;
case 0x7b: SendIRdata(mazhi); break;
保存高电平宽度 HighTime=TH0*256+TL0; //
if((LowTime<300)||(LowTime>620))
if((HigrheTtuirmne0>;3/0/如0)果&&低(H电ig平hT长im度e<不6在20合)) /理/如范果围高,电则平认时为间出在错5,60停微止秒解左码右, 即计数 / = 560 1.085 516 次
2010.3 使用C8051F32带USB接口的单片机进行数据采集和USB接口通信(三)

//包含文件
#include <c8051f320.h>// C8051F320头文件
#include <stddef.h> // NULL指针定义
#include "USB_API.h" // USB_API.lib头文件
//位定义
Sbit Led1=P2^2;// P2.2置1,点亮LED1
code const BYTE USB_ProductStr[] = {0x10,0x03,'U',0,'S',0,'B',0,' ',0,'A',0,'P',0,'I',0}; //产品描述
code const BYTE USB_SerialStr[] = {0x0A,0x03,'1',0,'2',0,'3',0,'4',0};
code const BYTE USB_MaxPower = 15; // 最大电流30mA(15 * 2)
code const BYTE USB_PwAttributes = 0x80;// 总线电源,不支持远程唤醒
code const UINT USB_bcdDevice = 0x0100; // 设备版本号1.00
#define FLASH_PAGE_SIZE 512 //每个flash页为512
#define BLOCKS_PR_PAGE FLASH_PAGE_SIZE/MAX_BLOCK_SIZE_READ// 512/64 = 8
#define MAX_NUM_BYTES FLASH_PAGE_SIZE*NUM_STG_PAGES
51单片机的红外收发C程序_带仿真图

发射部分#include <reg52.h>sbit P2_2=P2^2;sbit signalBit=P2^1; //发送信号标志位sbit LED=P3^7; //使能信号位,将E位定义为P2.2引脚unsigned char irData[]={0x14,0xeb,0xf0,0x0f}; //存放所有的控制码unsigned char mazhi[]={0x33,0x22,0xeb,0x14};unsigned char key,send_flag=0;void SendIRdata(unsigned char irdata[4]); //红外发射函数void anjian_send(unsigned char flag);void delay(unsigned int tt) //延时函数{while(--tt);}void main(void){signalBit=0;P2_2= 0;TMOD=0x12;//设定定时器1和0工作方式为1和2EX1=1;IT1=1;ET0 =1; //定时器0中断允许ET1 =1;TH0= 0xf4;TL0= 0xf4; //设定时值0为38K 也就是每隔13us中断一次周期为26us TR0= 0;//先关闭定时器0TR1= 0;IP=0X01;EA=1; //允许CPU中断LED=0;while(1){P1=0XF0;if(send_flag==1){anjian_send(key);send_flag=0;}}}void anjian_send(unsigned char flag){unsigned char zhi=flag;switch(zhi){case 0xee: SendIRdata(irData); break;case 0xbe: SendIRdata(irData); break;case 0xde: SendIRdata(irData); break;case 0x7e: SendIRdata(irData); break;case 0xed: SendIRdata(irData); break;case 0xdd: SendIRdata(irData); break;case 0xbd: SendIRdata(irData); break;case 0x7d: SendIRdata(irData); break;case 0xeb: SendIRdata(irData); break;case 0xdb: SendIRdata(irData); break;case 0xbb: SendIRdata(mazhi); break;case 0x7b: SendIRdata(mazhi); break;case 0xe7: SendIRdata(mazhi); break;case 0xd7: SendIRdata(mazhi); break;case 0xb7: SendIRdata(mazhi); break;case 0x77: SendIRdata(mazhi); break;}}/******* 定时器1中断处理***********/void isr_T1(void) interrupt 3{}/******* 定时器0中断处理38K载波发生器***********/ void timeint(void) interrupt 1{P2_2=~P2_2; //产生38k的载波信号}/**************** 中断1 键盘的扫描********************/ void Int1(void) interrupt 2{unsigned char l,h;P1=0XF0;l=P1;l=l&0xf0;if(l!=0xf0){delay(10);if(l!=0xf0){l=P1&0xf0;l=l|0x0f;P1=l;h=P1;h=h&0x0f;l=l&0xf0;key=h+l;send_flag=1;LED=~LED;}}}/********* 红外发射函数************/void SendIRdata(unsigned char *mData){unsigned char i,j;unsigned char test[4];for(i=0;i<4;i++)test[i]=mData[i];TR0=1; //开定时器T0 输出38K载波/********* 发送9ms的高电平************/TH1=0XDF; //装入初值设置波延时为9msTL1=0XE3;TR1=1; //启动T1工作定时所需时间signalBit=1; //发送信号while(!TF1);TF1=0;/********* 发送4.5ms的低电平*************/TH1=0xef;TL1=0xf0;signalBit=0;while(!TF1);TF1=0;/********* 发送用户码控制码控制反码***********/for(j=0;j<4;j++)//发送十六位地址的前八位{for(i=0;i<8;i++){//先发送0.565ms的38KHZ红外波(即编码中0.565ms的高电平)TH1=0XFE;TL1=0X70;signalBit=1;while(!TF1);TF1=0;//停止发送红外信号(即编码中的高电平)if(test[j]&0x01) //判断二进制数个位为1还是0{TH1=0XFA; // //1为宽的低电平,持续时间1.685msTL1=0X30;}else{TH1=0XFE; //0为窄的低电平,持续时间0.56msTL1=0x50;}signalBit=0;while(!TF1);TF1=0;test[j]=test[j]>>1;}}TR1=0; //发送停止位关闭定时器T0signalBit=1;delay(100);signalBit=0;TR0=0; //关闭定时器T1}检测部分#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //将IR位定义为P3.2引脚sbit rs=P2^4; //寄存器选择位,将RS位定义为P2.0引脚sbit rw=P2^5; //读写选择位,将RW位定义为P2.1引脚sbit e=P2^6; //使能信号位,将E位定义为P2.2引脚sbit LED=P2^0; //使能信号位,将E位定义为P2.2引脚unsigned char code string[ ]= "1602IR-CODE TEST";unsigned char code smg[]="code:";unsigned char code MA[]="0123456789ABCDEF";unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度0-65535void delay(unsigned int tt){while(--tt);}void w_cmd(unsigned char dd){rs=0;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void w_dat(unsigned char dd){rs=1;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void disp_ma(uchar *p,uchar hang,uchar wei){if(hang==1)w_cmd(0x80+wei);if(hang==2)w_cmd(0xc0+wei);while(*p!='\0'){w_dat(*p);p++;}}void init_LCD(void){w_cmd(0x38);delay(1000);w_cmd(0x38);delay(300);w_cmd(0x38);//注意顺序,设置工作方式,显示模式设置delay(300);w_cmd(0x08);//注意顺序,关闭显示w_cmd(0x01);//清屏w_cmd(0x06);//光标·画面滚动模式设置w_cmd(0x0c);//显示及光标模式设}/************************************************************函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:dat*************************************************************/bit DeCode(void){unsigned char i,j;unsigned char temp=0; //储存解码出的数据for(i=0;i<4;i++) //连续读取4个用户码和键数据码{for(j=0;j<8;j++) //每个码有8位数字{temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是低位数据TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==0) ;//如果是低电平就等待低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平宽度TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平宽度if((LowTime<300)||(LowTime>620))return 0; //如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>300)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次{temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0}if((HighTime>1300)&&(HighTime<1850)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次{temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1}}a[i]=temp; //将解码出的字节值储存在a[i]temp=0;}if(a[2]==~a[3])return 1; //解码正确,返回1else return 0;}/************************************************************函数功能:1602LCD显示*************************************************************/void Disp(void){w_cmd(0xc5); // 设置显示位置为第二行的第6个字w_dat(MA[(a[0]>>4)]);w_dat(MA[(a[0]&0x0f)]);w_dat(0x20);w_dat(MA[(a[1]>>4)]);w_dat(MA[(a[1]&0x0f)]);w_dat(0x20);w_dat(MA[(a[2]>>4)]);w_dat(MA[(a[2]&0x0f)]);w_dat(0x20);w_dat(MA[(a[3]>>4)]);w_dat(MA[(a[3]&0x0f)]);}/************************************************************函数功能:主函数*************************************************************/void main(){init_LCD(); //调用LCD初始化函数disp_ma(string,1,0);disp_ma(smg,2,0);EX0=1; //开外中断0ET0=1; //定时器T0中断允许IT0=1; //外中断的下降沿触发TMOD=0x01; //使用定时器T0的模式1TR0=0; //定时器T0关闭EA=1; //开启总中断while(1); //等待红外信号产生的中断}/************************************************************函数功能:红外线触发的外中断处理函数*************************************************************/void Int0(void) interrupt 0{EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==0); //如果是低电平就等待,给引导码低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存引导码的高电平长度if((LowTime>7500&&LowTime<10000)&&(HighTime>3500&&HighTime<5000)){//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.if(DeCode()==1) // 执行遥控解码功能Disp();//调用1602LCD显示函数}EX0=1; //开启外中断EX0}。
51单片机红外数据收发程序(NEC标准)

发射部分程序:/********************************************************* FUNCTION: 红外数据发送 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-6 * COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HSend BIT P2.0LedSend BIT P2.1;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0030HL_Main: MOV SP,#60HMOV DPTR,#T_SendBufferMOV R1,#08H ;发送1字节数据(先低位后高位)MOV R2,#00H;发送4字节L_Loop1:CLR LedSend ;开LED指示NOPNOPSETB SendLCALL F_Delay4500us ;引导码LCALL F_Delay4500usCLR SendLCALL F_Delay4500usL_Loop2:MOV A,R2MOVC A,@A+DPTRL_Loop3:SETB SendLCALL F_Delay560us ;560usCLR SendRRC AJC L_Next1LCALL F_Delay560usLJMP L_Next2L_Next1:LCALL F_Delay1680usL_Next2:DJNZ R1,L_Loop3INC R2CJNE R2,#04H,L_Loop2SETB Send ;560us高电平结束LCALL F_Delay560usCLR SendSETB LedSend ;关LED指示LJMP $/*INT_Int0:PUSH ACCPUSH PSWCPL LED1POP PSWPOP ACCRETI*/;---------------------------------------------------------- ;延时约4500usF_Delay4500us:MOV R7,#20L_Delay4500:MOV R6,#225DJNZ R6,$DJNZ R7,L_Delay4500RET;---------------------------------------------------------- ;延时约560usF_Delay560us:MOV R7,#2L_Delay560:MOV R6,#140DJNZ R6,$DJNZ R7,L_Delay560RET;---------------------------------------------------------- ;延时约1680usF_Delay1680us:LCALL F_Delay560usLCALL F_Delay560usLCALL F_Delay560usRET;---------------------------------------------------------- ;延时约1sF_Delay1s:MOV R7,#5L_Delay1s1:MOV R6,#200L_Delay1s2:MOV R5,#250DJNZ R5,$DJNZ R6,L_Delay1s2DJNZ R7,L_Delay1s1RET;-----------------------------------------------;红外发送区数据T_SendBuffer:DB 0FH,0F0H ;用户码及反码DB 56H,0A9H ;操作码及反码END ;结束接收部分程序:/********************************************************* FUNCTION: 红外数据接收程序 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-7 *COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HF_Re BIT P3.2LED1 BIT P2.6R_Receive: DS 4 ;红外数据接收空间;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0003H ;INT0入口LJMP INT_Int0ORG 0030HL_Main: MOV SP,#60HSETB EASETB EX0SETB IE0 ;下降沿触发MOV DPTR,#T_CodeL_LoopMain:;------------------------MOV R1,#R_Receive+2MOV A,@R1ANL A,#0FH ;屏蔽高4位MOVC A,@A+DPTRMOV P1,A;------------------------;CPL P2.5;LCALL F_Delay300msLJMP L_LoopMain;---------------------------------------------------------- ;外部中断0;Function: NEC红外解码.黑色遥控器用户码FFH,00H;P3.2接外部中断INT_Int0:PUSH ACCPUSH PSWMOV R0,#R_ReceiveMOV R3,#08HMOV R4,#04HLCALL F_Delay8000usJB F_Re,L_ExitINT0 ;非引导码退出JNB F_Re,$LCALL F_Delay2500usJNB F_Re,L_ExitINT0 ;遇简码退出JB F_Re,$CLR LED1 ;open LED1L_NextBit:JNB F_Re,$LCALL F_Delay840usJB F_Re,L_Next1MOV C,F_ReLJMP L_Next2L_Next1:MOV C,F_ReLCALL F_Delay1100usL_Next2:RRC A ;先收低位DJNZ R3,L_NextBitMOV @R0,AINC R0MOV R3,#08HDJNZ R4,L_NextBitL_ExitINT0:SETB LED1 ;close LED1POP PSWPOP ACCRETI;---------------------------------------------------------- ;延时约8000usF_Delay8000us:MOV R7,#20L_Delay8000:MOV R6,#200DJNZ R6,$DJNZ R7,L_Delay8000RET;---------------------------------------------------------- ;延时约840us。
C8051F320 I-O使用总结

C8051F320 I/O 使用总结
首先, 要区分数字信号与模拟信号!!!!并且还有是输入还是输出.其次,大家要知道不论在交叉开关的设置如何,端口I/O 引脚的状态总是可以被读到相应的
端口锁存器.
即:不管引脚被分配给数字外设还是作为通用I/O 端口,总是可以通过读相应
的数据寄存器得到I/O 端口引脚的状态.
再次
当一个引脚被配置为模拟输入时,它的弱上拉、数字驱动器和数字接收
器都被禁止,这可以节省功耗并减小模拟输入的噪声。
当一个引脚被配置为数字输入时,设为漏开,并向端口写1,引脚为高阻,按照I/O 结构原理图,初始化有弱上拉。
引脚与施密特连接,所以在引脚上的
电平状态是可以读进端口寄存器的,而且经过试验验证,5v 的逻辑电平也可以分辨出来,但是建议加上拉电阻。
不加也可以。
有一个网友:作为数字输入时,输出方输出特性千差万别,对于输出阻抗
高的器件可以不加上拉,对于输出阻抗低的器件就要用上拉电阻,否则无法输
出高电平。
PDF 上说交叉开关分配的输入引脚(例如NSS 或/INT0)是漏极开路或推挽并不重要, 这些引脚被配置为输入而与相应端口配置寄存器的设置无关。
为了将一个通用I/O 引脚配置为输入与这一引脚相关的端口配置寄存器位必须被清0。
这样即可选择该引脚为漏极开路输出方式另外与该引脚相关的端口位必须
被置1 这样使该引脚处于高阻态。
或在XBR2 中的WEAKPUD 被清0 时弱上
拉为高电平,这是端口引脚的复位配置。
好像可以解释为输入状态!!!。