刚学单片机,第一个单片机程序,看到仿真成功还是非常激动的,功能很简单,就是高入低出,低入高出,有点类似非门,但搞了好长时间才弄出来。。。。。。详见注释
- #include<reg52.h>
- #define CRYSTAL_FREQ 12000000//晶振频率(Hz)
- #define uchar unsigned char
- #define uint unsigned int
- #define INTERRUPT_PERIOD 16//时钟配置1/16s
- sbit led=P1^0;//定义led为输出端
- sbit key=P0^0;//key输入端
- void delayms(uint xms)//延时作用的子函数
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Interrupt_Init()
- {
- TMOD = 0x01;
- TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
- TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
- ET0 = 1;
- TR0 = 1;
- EA = 1;
- }
- void main()
- {
- Interrupt_Init();//调用中断声明子函数
- while(1);
- }
- void power()
- {
- if(key==0) //检测输入端是否为低电平
- {
- delayms(10); //延时再次检测输入端是否为低电平
- if(key==0)
- {
- led=1; //如果再次确认输入端为低,控制输出高电平,灯亮
- }
- else
- led=0; //否则输出低电平,灯灭
- }
- else
- led=0;
- }
- void Timer0() interrupt 1
- {
- TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
- TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
- power(); //中断里调用检测函数
- }
后来又加了声控功能,需要的功能是,实现声控优先级比光控高以及灯亮之后的延时,详见注释
- #include<reg52.h>
- #define CRYSTAL_FREQ 12000000//晶振频率(Hz)
- #define uchar unsigned char
- #define uint unsigned int
- #define INTERRUPT_PERIOD 16//时钟配置1/16s
- sbit led=P1^0;//定义led为输出端
- sbit voicekey=P0^1; //声控输入端
- sbit key=P0^0;//光控输入端
- uchar flag=0;
- void delayms(uint xms)//延时作用的子函数
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Interrupt_Init()
- {
- TMOD = 0x01;
- TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
- TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
- ET0 = 1;
- TR0 = 1;
- EA = 1;
- }
- void main()
- {
- Interrupt_Init(); //调用中断声明子函数
- while(1);
- }
- void power()
- {
- if(key==0) //先检测光控输入端是否为低电平,因为光控输入端优先级比声控高
- {
- delayms(10); //延时再次检测光控输入端是否为低电平
- if(key==0)
- {
- if(voicekey==1) //如果检测声控入端为高 ,输出高电平,灯亮,
- {
- led=1;
- delayms(10000); //延时10秒
- }
- else
- led=0; //否则灯灭
- }
- else
- led=0;
- }
- else
- led=0;
- }
- void Timer0() interrupt 1
- {
- TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
- TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
- power(); //中断里调用检测函数
- }
联系客服