用三星单片机S3F9454做的一个遥控开关的源代码
单片机程序源代码

单片机程序源代码第二章任务一:闪烁广告灯的设计利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<>#define uint unsigned int#define uchar unsigned charsbit LED1=P0^0;sbit LED2=P0^1;void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(){while(1){LED1=0;LED2=1;delayms(500);LED1=1;LED2=0;delayms(500);}}任务二:流水广告灯的设计利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。
#include<>#include <>#define uint unsigned int#define uchar unsigned charuint i;uchar temp;uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delayms(uint ms){while(ms--){ uint j;for(j=0;j<120;j++);}}void main(){while(1){P0=0xfe;while(P0!=0x7f){7f89c89c0f89c0a0f7f0f0f0f7f7f2L3f4f7f6f7fDelay==0) break;else{sound(&music[n]);n++ ;}}}void main(){init();while(1){if(key==0){delayms(5);play(table1);}SPEAKER=1;}}void inter() interrupt 1{TH0 = ReloadH;TL0 = ReloadL;SPEAKER = !SPEAKER; //音乐声频的半个波}(3)#include<>//头文件#define uint unsigned int#define uchar unsigned char//宏定义sbit beep=P1^0;//按键位声明void Beep() //“叮咚”子函数{uint i,j;for(i=300;i;i--)//持续时间{beep=~beep;for(j=240;j;j--);//频率}for(i=200;i;i--)//持续时间{beep=~beep;for(j=180;j;j--);//频率}}void init() //初始化子函数{EA=1; //打开总中断TMOD=0x05;//设置计数器0 工作方式1ET0=1; //打开计数器0中断TR0=1;//启动定时器0TH0=0xff;TL0=0xff;//计数器赋初值}void beep_interrupt() interrupt 1 //计数器0中断服务子程序{TH0=0xff;TL0=0xff;//计数器初值Beep();//调用“叮咚”子函数}void main()//主函数{init();//调用初始化函数while(1);//等待按键按下}任务七:速度可调流水灯控制假设单片机晶振频率为12MHz,单片机P0口外接8只LED,外接按键K1,外接按键K2。
51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号
基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码/*******************红外遥控+液晶LCD1602测试程序源代码******************** 单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:红外遥控+液晶LCD1602显示功能测试。
操作说明:按下红外遥控器上的“CH-”键,液晶LCD1602上显示“CH-”。
按下红外遥控器上的“CH”键,液晶LCD1602上显示“CH”。
按下红外遥控器上的“CH+”键,液晶LCD1602上显示“CH+”。
按下红外遥控器上的“|<<”键,液晶LCD1602上显示“|<<”。
按下红外遥控器上的“>>|”键,液晶LCD1602上显示“>>|”。
按下红外遥控器上的“>||”键,液晶LCD1602上显示“>||”。
按下红外遥控器上的“-”键,液晶LCD1602上显示“-”。
按下红外遥控器上的“+”键,液晶LCD1602上显示“+”。
按下红外遥控器上的“EQ”键,液晶LCD1602上显示“EQ”。
按下红外遥控器上的“0”键,液晶LCD1602上显示“0”。
按下红外遥控器上的“100+”键,液晶LCD1602上显示“100+”。
按下红外遥控器上的“200+”键,液晶LCD1602上显示“200+”。
按下红外遥控器上的“1”键,液晶LCD1602上显示“1”。
按下红外遥控器上的“2”键,液晶LCD1602上显示“2”。
按下红外遥控器上的“3”键,液晶LCD1602上显示“3”。
按下红外遥控器上的“4”键,液晶LCD1602上显示“4”。
按下红外遥控器上的“5”键,液晶LCD1602上显示“5”。
按下红外遥控器上的“6”键,液晶LCD1602上显示“6”。
按下红外遥控器上的“7”键,液晶LCD1602上显示“7”。
按下红外遥控器上的“8”键,液晶LCD1602上显示“8”。
红外遥控编程参考(单片机读取按键编码)

程序可以用来查看每个遥控按键的编码,以便于开发利用遥控每一个按键。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit en=P3^4;sbit rs=P3^5; //用于控制1602sbit rw=P3^6;sbit dula=P2^6;sbit wela=P2^7; //用于控制晶体管sbit IRIN=P3^2; //红外接收器数据线IO 口uchar IRCOM[4]=0;//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码//IRCOM[1] 高8位地址码//IRCOM[2] 8位数据码//IRCOM[3] 8位数据码的反码uchar code table[]="MAKE BY HEIQISHI"; uchar code table1[]="The code is 0x";uchar code table2[]="0123456789abcdef";//////////////显示程序///////////////////void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}void Write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(5);en=1;delay(5);en=0;}void Write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(5);en=1;delay(5);en=0;}void _1602Init(){wela=0;dula=0; //用于关闭晶体管,因为都是用P0en=0; //初始时使能为0rw=0;Write_com(0x38); //显示屏模式设置为1602方案Write_com(0x0c); //显示开关/光标设置Write_com(0x06);Write_com(0x01); //清屏Write_com(0x80); //指针置零}//////////////////////////////////////////////////////////////////////解码程序///////////////////void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS{uchar i;while(x--){for(i=0;i<15;i++) //13;}}//////////////初始化////////////void IR_init(void){EA=1;EX0=1; //允许总中断中断,使能INT0 外部中断IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化}////////////解码过程//////////////void IR_CODE(void) interrupt 0 //在外部中断子程序中解码{uchar j,k,N=0,shi,ge;EX0=0; //防止干扰delay014ms(15); //延时2.1msif (IRIN) //2.1ms能够检测出各种错误信号{EX0 =1;return;} //确认IR信号出现while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
STM32单片机红外遥控

STM32单片机红外遥控红外遥控接口电路STM32单片机红外遥控程序源代码#include "sys.h"#define LED_RED PBout(12) //红色发光二极管控制管脚初始化PB12 #define LED_GREEN PBout(13) //绿色发光二极管控制管脚初始化PB13 #define LED_YELLOW PBout(14) //黄色发光二极管控制管脚初始化PB14 #define LED_BLUE PBout(15) //蓝色发光二极管控制管脚初始化PB15 #define BEEP PBout(5) //蜂鸣器端口定义PB5#define RDATA PAin(1) //红外数据输入脚//红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的//我们选用的遥控器识别码为0#define REMOTE_ID 0static u8 fac_us=0; //us延时倍乘数static u16 fac_ms=0; //ms延时倍乘数void delay_init(u8 SYSCLK);void delay_ms(u16 nms);void delay_us(u32 nus);void Led_Init(void); //发光二极管控制管脚初始化void Red_Led_Light(void); //点亮红色发光二极管void Green_Led_Light(void); //点亮绿色发光二极管void Yellow_Led_Light(void); //点亮黄色发光二极管void Blue_Led_Light(void); //点亮蓝色发光二极管void Red_Led_Goout(void); //熄灭红色发光二极管void Green_Led_Goout(void); //熄灭绿色发光二极管void Yellow_Led_Goout(void); //熄灭黄色发光二极管void Blue_Led_Goout(void); //熄灭蓝色发光二极管void Beep_Init(void);void Beep_Tweet(void);void Beep_Silent(void);extern u8 Remote_Cnt; //按键次数,此次按下键的次数extern u8 Remote_Rdy; //红外接收到数据extern u32 Remote_Odr; //命令暂存处u32 Remote_Odr=0; //命令暂存处u8 Remote_Cnt=0; //按键次数,此次按下键的次数u8 Remote_Rdy=0; //红外接收到数据void Remote_Init(void); //红外传感器接收头引脚初始化u8 Remote_Process(void); //红外接收到数据处理u8 Pulse_Width_Check(void); //检查脉宽extern u8 USART_RX_BUF[64]; //接收缓冲,最大63个字节.末字节为换行符extern u8 USART_RX_STA; //接收状态标记//如果想串口中断接收,请不要注释以下宏定义//#define EN_USART1_RX //使能串口1接收void uart_init(u32 pclk2,u32 bound);/*************************************************************开发板上电后,用红外遥控器对着开发板上的红外接收头。
自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。
三星S3F9454译文
1 产品概观SAM88RCRI 产品系列三星 8 位单片互补金属氧化物半导体(互补型金属氧化半导体)微控制器系列 SAM88RCRI 提供一个快速高效的处理器,完整的外围接口 ,和多种可编程掩膜 ROM 规格。
地址/数据总线结构和大量的位可配置的I/ O 口为不同的存储器和I/ O 需求提供了一个灵活的设计环境。
内嵌支持实时操作的可选模式定时器/计数器。
S3C9442/C9444/C9452/C9454 微控制器S3C9442/C9444/C9452/C9454 单片 8 位微控制器为有用的 A/D 转换器 ,SIO 应用领域而设计。
S3C9442/C9444/C9452/C9454 使用强大的 SAM88RCRI 处理器和 S3C9442/C9444/C9452/C9454 体系。
为增加片上寄存器空间,内部寄存器文件是逻辑扩展的。
S3C9442/C9444/C9452/C9454 有 2K/4K字节的片内可编程ROM和 208 字节的随机存取储存器。
S3C9442/C9444/C9452/C9454 是一个广泛用于简单定时器/计数器, PWM 的通用微控制器。
此外,S3C9442/C9444/C9452/C9454 先进的互补型金属氧化半导体(互补型金属氧化半导体)技术提供低功耗和宽广的操作电压范围。
采用 SAM88RCRI 设计方法,下列各项外围接口是完整的 SAM88RCRI 核心:——三个可配置的/ O 口 (18 脚)——一个矢量和一个中断级的四中断源——一个时间间隔模式 8 位定时器/计数器——九通道 10 位分辨率的模数转换器——一个 8 位 PWM 输出S3C9442/C9444/C9452/C9454 微控制器是广泛使用的简单定时器/计数器, PWM , ADC 的理想器件。
S3C9452/C9454 有 20/16 脚的DIP双列直插式封装和 20 脚的SOP贴面封装。
S3C9452/C9454 有 8 脚的DIP双列直插式封装和 8 脚的SOP贴面封装。
用单片机制作的定时开关控制器
用单片机制作的定时开关控制器定时开关控制器在各种场合都有着极为广泛的用途。
本文利用凯思迪公司的k-51a单片机实验板设计的定时开关控制器具有简单易制、价格低廉、控制点数多、控制时间可精确到秒等特点,供有兴趣的朋友参考。
1.主板电路部分本电路主要是利用单片机at89c2051(-24pi)作为主控制元件,通过外围电路控制用电设备的电源,以达到定时开、关机的目的。
at89c2051具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。
图1为主电路原理图,图2为按其制作的主板(双面)大小只有95mm×70mm的器件位置图。
主板电路包括mcuat89c2051、键盘与显示、输入与输出口、复位和电源滤波等电路组成。
(1)键盘与表明表明电路由u2、u3、q1~q7和l1a、l2a共同组成。
u2为bcd-7段译码器(74ls47),通过单片机u1的p1.4~p1.7口将要显示字符的bcd码输入至u2的四个输出端的,经u2译码后输入适当的笔段驱动led数码管(共阳)。
led数码管表明使用动态读取方式,即为在某一时刻,只有一个数码管被照亮。
数码管的位选信号由单片机u1的p3.3~p3.5输入,经u3(74hc138)译码后通过q1~q6压缩,驱动适当的数码管。
r17~r24为限流电阻。
由于u2只能输出7段笔段码,而数码管除了七段笔段外,还要控制点亮小数点,因此,小数点必须有另外的驱动电路来完成,在这里,通过q7来驱动小数点。
当需要点亮小数点时,在u1的p1.3输出高电平即可。
键盘电路跟显示电路一样,采用扫描方式,利用动态显示时的数码管驱动位置信号来判断相应按键的状态。
u1的p3.3~p3.5口输出的bcd码经u3译码后,相应y口呈低电平,而u1的p3.7口平时为高电平(由于r8上拉),当某一键按下时,p3.7被下拉为低电平,这时mcu利用程序查询p3.7是否为低电平,如果p3.7为低电平,就读回u1p3.3~p3.5口的值(从缓冲区读取),则可判断是哪个按键按下,然后调用相应的处理程序进行处理。
单片机程序源代码完整版.doc
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint i;
while(1)
{
P1=0xff;
delay(500);
for(i=0;i<4;i++)
{
P1=table[i];
delay(500);
{uint j;
for(j=0;j<120;j++);
}
}
void main()
{
while(1)
{
P0=0xfe;
while(P0!=0x7f)
{
//P1=temp;
//delayms(500);
P0=_crol_(P0,1);
delayms(250);
}
temp=0x7f;
while(P0!=0xfe)
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7,然后再点亮D7->D6->D5->D4 ->D3->D2->lt;reg52.h>
#include <intrins.h>
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。
单片机系统代码
系统程序:#include "reg51.h"#define unchar unsigned charint distance;sbit Trig=P3^0;sbit Echo=P3^1;sbit yaokong=P3^3;sbit zuo =P1^0;sbit you =P1^1;sbit qian=P1^2;sbit hou =P1^3;sbit motor11=P1^4;sbit motor12=P1^5;sbit motor21=P1^6;sbit motor22=P1^7;sbit RS=P3^5; //LCDRS sbit RW=P3^6; //LCDRW sbit E =P3^7; //LCD Eunchar code str1[]={"Next bar: cm"};unchar code str2[]={"SetDistance:15cm"}; //定义显示缓冲unchar data disData[5];//百、十、个、小数位unchar state,cnt;bit sec;void delay1s(int n ){int i,j,k;for(i=0;i<n;i++)for(j=0;j<200;j++)for(k=0;k<550;k++) ;}void init_t0(){TMOD=0X11;IE=0X82;TR0=1;}void t0() interrupt 1{if(++cnt>2){cnt=0;sec=1;}}void delay(){unchar i,j;for(i=0;i<10;i++) for(j=0;j<250;j++); }void delay1ms(int m ) {int i,j;for(i=0;i<m;i++)for(j=0;j<110;j++) ; }void Yaokong(void){if(zuo){motor11=1;motor12=0;motor21=0;motor22=1;}if(you){motor11=1;motor12=0; motor21=0;motor22=1;delay1s(2);}if(qian){motor11=1;motor12=0;motor21=0;motor22=1; delay1s(2);}if(yaokong){motor11=1;motor12=0;motor21=0;motor22=1; delay1s(2);}void Write_Com(unsigned char com ) //写入指令函数{delay1ms(5);RS = 0;RW = 0;E= 0;P2= com;delay1ms(5);E = 1;delay1ms(5);E = 0;}void Write_Dat(unsigned char dat) //写入数据函数{delay1ms(5);RS = 1;RW = 0;E = 0;P2 = dat;delay1ms(5);E = 1;delay1ms(5);E = 0;}void Init_LCD() //初始化{delay1ms(5); //稍微延时,等待LCD进入工作状态Write_Com(0x38);//8位2行16*2delay1ms(1);Write_Com(0x08);//光标归位调用写控制指令子函数,并用实参"0000 1000"代替形参com //0x08表示设置为关显示、不显示光标、光标不闪烁delay1ms(1);Write_Com(0x01);//清显示delay1ms(1);Write_Com(0x06);//文字不动,光标右移delay1ms(1);Write_Com(0x0c);//显示开/关光标开闪烁开delay1ms(1);}void display_str(unsigned char *p) //lcd显示字符串子函数{while(*p!='\0') //测试是否等于'\0',即判断是否结尾Write_Dat(*p); //显示指针所指的字符串p++;delay1ms(1);}}void init_play() //初始化显示子函数{Init_LCD(); //调用lcd初始化置子函数,对LCD进行初始化Write_Com(0x80); //调用写控制指令子函数,并用实参"1000 0000"代替形参com //并将数据指针定位到第一行第一个字符处display_str(str1); //从第一行第一个字符处显示字符串str1Write_Com(0xc0); //调用写控制指令子函数,并用实参"1000 0000"代替形参com 并将数据指针定位到第二行第一个字符处display_str(str2); //从第二行第一个字符处显示字符串str2}void display_distance(){disData[0]=distance/1000+'0'; //百位数字符0的十六进制是0x30disData[1]=distance/100%10+'0'; //十位数disData[2]=distance/10%10+'0'; //个位数disData[3]=distance%10+'0'; //小数if(disData[0]==0x30){disData[0]=0x20; //如果百位为0,不显示空格键if(disData[1]==0x30){disData[1]=0x20; //如果百位为0,十位为0也不显示}}Write_Com(0x80+0x09);//定位数据指针的位置:第一行第七个字符处Write_Dat(disData[0]); / /显示百位Write_Com(0x80+0x0a);//定位数据指针的位置:第一行第八个字符处Write_Dat(disData[1]); //显示十位Write_Com(0x80+0x0b); //定位数据指针的位置:第一行第九个字符处Write_Dat(disData[2]); //显示个位Write_Com(0x80+0x0c); //定位数据指针的位置:第二行第十个字符处Write_Dat(0x2e);//显示小数点Write_Com(0x80+0x0d); //定位数据指针的位置:第二行第十一个字符处Write_Dat(disData[3]); //显示小数位}void test(){Trig=1;TF1=0;TH1=0xff;TL1=-10;TR1=1;while(!TF1);TR1=0;Trig=0;TF1=0;}void main(){init_t0();init_play() ;while(1){if(sec){sec=0;test();while(!Echo );TH1=0;TL1=0;TR1=1;while(Echo && !TF1);TR1=0;distance=(TH1*256.0+TL1)*0.17; display_distance();if(yaokong){Yaokong();}if(distance<150){motor11=1;motor12=0;motor21=0;motor22=1;}else{motor11=1;motor12=1;motor21=1;motor22=1; }}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用三星单片机S3F9454做的一个遥控开关的源代码2010-05-05 18:13
比尔熊发表于 2008-11-28 13:30 侃单片机←返回版面
楼主:用三星单片机S3F9454做的一个遥控开关的源代码
#i nclude
#define uchar unsigned char
#define uint unsigned int
#define NOP asm("NOP")
#define DI asm("DI")
#define EI asm("EI")
#define SET_LED (P0 |= 0x01)
#define CLR_LED (P0 &= ~0x01)
#define COM_LED (P0 ^= 0x01)
#define SET_SCR (P0 |= 0x04)
#define CLR_SCR (P0 &= ~0x04)
#define COM_SCR (P0 ^= 0x04)
#define GET_SCR (P0 & 0x04)
#define GET_IR (P0 & 0x02)
#define SET_BUZZER (P2 |= 0x01)
#define COM_BUZZER (P2 ^= 0x01)
#define IR_USER_CODE 0x00
#define IR_POWER 0x7C
#define IR_Vol_Add 0x16
#define IR_Vol_Dec 0x02
#define IR_RIGHT 0x0F
#define IR_LEFT 0x0E
#define IR_UP 0x5B
#define IR_DOWN 0x53
__root const uchar smartOption[4] @ 0x003C ={0x00,0x00,0xE4,0x00}; uchar remBuffer[4];
uchar irFlag;
uint timeCount; void InitSfr(void) {
BTCON = 0x02; CLKCON = 0x18;
P0CONH = 0xAA;
P0CONL = 0xA6;
P0PND = 0x00;
P1CON = 0x0A;
P2CONH = 0x4A;
P2CONL = 0xAA;
P0 = 0x00;
P2 = 0x00;
SET_SCR;
SET_LED;
SET_BUZZER;
irFlag = 0;
timeCount = 0;
}
void DelayMs(uchar ms) {
uchar i,j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 250; j++) NOP;
}
}
void SendDat(uchar byte)
uchar i;
for(i = 0; i < 8; i++) {
CLR_LED;
if(byte & 0x80)
DelayMs(1);
else
DelayMs(3);
SET_LED;
byte <<= 1;
DelayMs(1);
}
}
void BuzzerOut(uint time)
uint j;
uchar i;
for(j = 0; j < time; j++) {
BTCON = 0x02;
for(i = 0; i < 16; i++) {
NOP;
}
COM_BUZZER;
}
}
void main()
{
InitSfr();
DelayMs(100);
T0DATA = 250;//定时器初始值
T0CON = 0xC8;//打开定时器 1/8之一分频P0PND = 0x08;
BuzzerOut(3000);
CLR_LED;
EI;
while(1)
{
BTCON = 0x02;
P0CONL = 0xA6;
SET_BUZZER;
if(irFlag)
if(remBuffer[0] == IR_USER_CODE) {
if(remBuffer[2] == IR_POWER) {
COM_SCR;
if(GET_SCR == 0)
{
BuzzerOut(1000);
SET_LED;
}
else
{
BuzzerOut(2000);
CLR_LED;
}
}
//SendDat(remBuffer[2]); irFlag = 0;
P0PND = 0x08;
}
if(GET_SCR)
{
timeCount++;
if(timeCount >= 55000) {
timeCount = 0;
SET_LED;
DelayMs(50);
CLR_LED;
}
}
}
}
#pragma vector = 0x00
__interrupt void Interrupts(void) {
uchar count;
uchar i,j;
if(P0PND & 0x04)
{
P0PND = 0x00;
for(count = 0;count < 160; count++) {
T0CON = 0xC8;
do
NOP;
while(T0CNT < 150);
if(GET_IR)
{
P0PND = 0x08;
return;
}
}
while(GET_IR == 0);
for(count = 0;count < 80;count++) {
T0CON = 0xC8;
do
NOP;
while(T0CNT < 150);
if(GET_IR == 0)
{
P0PND = 0x08;
return;
}
}
while(GET_IR);
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
while(GET_IR == 0);
for(count = 0; count < 18; count++)
{
T0CON = 0xC8;
do
NOP;
while(T0CNT < 150);
}
remBuffer[j] >>= 1;
if(GET_IR)
{
remBuffer[j] |= 0x80;
for(count = 0; count < 32; count++) {
T0CON = 0xC8;
do
NOP;
while(T0CNT < 150); }
}
}
}
irFlag = 1;
}
}。