历史上的今天
返回首页

历史上的今天

今天是:2025年03月19日(星期三)

正在发生

2020年03月19日 | 按键控制51单片机上面硬件的功能

2020-03-19 来源:eefocus

按键一二三对应51单片机上不同的功能


例如跑马灯,蜂鸣器,呼吸灯,中断之类的


#define FSCLK 11059200 //晶振频率为 11.0592MHz


#include

#include

#include


#define LED_PORT P0

sbit BEEP=P1^4;


unsigned int n = 0;


unsigned int t = 0;


unsigned char xx = 127;


  unsigned char p;

  unsigned char m;


#define uchar unsigned char

#define uint unsigned int


unsigned char code music_tab[] = {


  0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0xff, //ff 休止符


  0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0};


void int0() interrupt 1


{


  TH0 = (65536 - 10000) / 256;//0xd8;


  TL0 = (65536 - 10000) % 256;//0xef;


  n--;}


void Delay(uint time)

{

uint i;

for(i = time;i> 0;i --);

}


sbit LED0 = P0^0;

sbit LED7 = P0^7;

sbit LED1 = P0^1;

sbit LED6 = P0^6;

sbit LED2 = P0^2;

sbit LED5 = P0^5;

sbit LED3 = P0^3;

sbit LED4 = P0^4;


uint flag;

uint time;

uint temp;

uint i;

 

void Delay_ms(uint time)

{

uint i,j;

for(i = 0;i < time;i ++)

for(j = 0;j < 930;j ++);

}


void main()

{

uchar key;

while(1)

{

key = Key_Scan(); //在while(1)里面不断循环执行按键扫描程序Key_Scan(),Key_Scan()不断将按键的返回值赋给变量key

if(key == 1) //key!=0说明有按键被按下

{

TMOD = 0x01; //配置定时器 0 工作在 16 位定时器模式

//其中 GATE=0,C/T

TH0 = (65536-FSCLK/12/20)/256;

TL0 = (65536-FSCLK/12/20)%256; //20Hz 计数频率,溢出一次需要 50ms

ET0 = 1;  //允许定时器中断

EA = 1; //打开总中断


LED1 = 0;

LED6 = 0;

LED2 = 1;

LED5 = 1;

LED3 = 0;

LED4 = 0;


TR0 = 1;  //打开定时器,开始计数

while(1)

{

if(flag != 0)

{

flag = 0;

  

LED1 = !LED1;

LED6 = !LED6;

LED2 = !LED2;

LED5 = !LED5;

LED3 = !LED3;

LED4 = !LED4;


}

}

}


if(key == 2)

while(1)

{

for(temp = 0;temp <= 350;temp ++)

{

for(i=0;i<10;i++)

{

LED0 = 0;

 LED7 = 1;

Delay(temp);

LED0 = 1;

LED7 = 0;

Delay(350-temp);

}

}

for(temp = 350;temp > 0;temp--)

{

for(i=0;i<10;i++)

{

LED0 = 0;

LED7 = 1;

Delay(temp);

LED0 = 1;

LED7 = 0;

Delay(350-temp);

}

for(temp = 0;temp <= 350;temp ++)

{

for(i=0;i<10;i++)

{

LED7 = 1;

LED0 = 0;

Delay(temp);

LED7 = 0;

LED0 = 1;

Delay(350-temp);

}

}

for(temp = 350;temp > 0;temp--)

{

for(i=0;i<10;i++)

{

LED7 = 1;

LED0 = 0;

Delay(temp);

LED7 = 0;

LED0 = 1;

Delay(350-temp);

}

}


}

if(key == 3)

{

TMOD = 0x01; //配置定时器 0 工作在 16 位定时器模式

//其中 GATE=0,C/T

TH0 = (65536-FSCLK/12/20)/256;

TL0 = (65536-FSCLK/12/20)%256; //20Hz 计数频率,溢出一次需要 50ms

ET0 = 1;  //允许定时器中断

EA = 1; //打开总中断


LED1 = 0;

LED6 = 0;

LED2 = 1;

LED5 = 1;

LED3 = 0;

LED4 = 0;


TR0 = 1;while(1)

{

if(flag != 0)

{

flag = 0;

  

LED1 = !LED1;

LED6 = !LED6;

LED2 = !LED2;

LED5 = !LED5;

LED3 = !LED3;

LED4 = !LED4;


for(temp = 0;temp <= 300;temp ++)

{

for(i=0;i<10;i++)

{

LED0 = 0;

 LED7 = 1;

Delay(temp);

LED0 = 1;

LED7 = 0;

Delay(300-temp);

}

}

for(temp = 300;temp > 0;temp--)

{

for(i=0;i<10;i++)

{

LED0 = 0;

LED7 = 1;

Delay(temp);

LED0 = 1;

LED7 = 0;

Delay(300-temp);

}

for(temp = 0;temp <= 300;temp ++)

{

for(i=0;i<10;i++)

{

LED7 = 1;

LED0 = 0;

Delay(temp);

LED7 = 0;

LED0 = 1;

Delay(300-temp);

}

}

for(temp = 300;temp > 0;temp--)

{

for(i=0;i<10;i++)

{

LED7 = 1;

LED0 = 0;

Delay(temp);

LED7 = 0;

LED0 = 1;

Delay(300-temp);

}

}


}


}


if(key == 4)


{

uchar temp = 0xFE,i = 0,flag = 0;

while(1)

{

if(flag == 0)

{

LED_PORT = temp;

Delay_ms(200);//延时0.5s

//移位函数_crol_()包含在头文件intrins.h里面,在#include之后,可以直接调用这个函数

temp=_crol_(temp,4);//循环左移一位(例如:若调用函数前temp:0000 0001 ,调用函数后temp:0000 0010)

i++;

if(i == 7)flag = 1;

}

else 

{

LED_PORT = temp;

Delay_ms(200);//延时0.5s

temp=_cror_(temp,3);//循环左移一位(例如:若调用函数前temp:0000 0001 ,调用函数后temp:1000 0000)

i--;

if(i == 0)flag = 0;

}


}


}

if(key==5)


{


  unsigned char p, m, i;


  TMOD &= 0xf0;


  TMOD |= 0x01;


  TH0 = (65536 - 10000) / 256;//0xd8;


  TL0 = (65536 - 10000) % 256;//0xef;


  TR0 = 1; 


  IE = 0x82;


  while(1) {


   i = 0;


   while(1) {


   p = music_tab[i];


    if (p == 0) break;


    if (p == 0xff) {


     i++;


     n = 10; while(n); // delayms(100);


    } 

    m = music_tab[i++];


    n = music_tab[i++];


    while(n) {BEEP = ~BEEP; Delay(m);}


   } 


   n = 100; while(n);  // delayms(1000);


  }


}

if(key==6)

{}


}

}


void time0() interrupt 1 //中断服务程序

{

TH0 = (65536-FSCLK/12/20)/256;

TL0 = (65536-FSCLK/12/20)%256;

time ++;

if(time == 25)  //每 50ms 进入一次中断,t = 20*50 ms = 1 s。

//实现 1 秒定时

{

time = 0;

flag = 1;

}

推荐阅读

史海拾趣

Emulation Technology Inc公司的发展小趣事

面对电子行业的快速发展和市场的不断变化,Emulation始终保持着对技术的持续创新。公司不断投入研发资源,推出了一系列具有领先性能的模拟和仿真产品,满足了客户对于高精度、高效率仿真工具的需求。这些产品不仅提高了工程师们的设计效率,还促进了整个电子行业的发展。

APLUS Products公司的发展小趣事

APLUS Products公司始终重视品牌建设和文化传播。公司不仅注重产品的质量和性能,还积极参与各类行业展会和公益活动,提升品牌知名度和美誉度。同时,公司还通过社交媒体等渠道与消费者进行互动,传递公司的价值观和企业文化。这些举措不仅增强了消费者对品牌的认同感和忠诚度,也为公司的长期发展奠定了坚实的基础。


这些故事虽然是根据一般情况构建的,但它们反映了企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场布局、合作共赢、品牌建设和文化传播等手段来实现企业的发展目标。希望这些故事能够为您提供一些启示和参考。如果您需要更具体的信息,建议您查阅APLUS Products公司的官方网站或相关新闻报道。

DPA Components International公司的发展小趣事

DPA Components International公司自成立以来,一直将技术创新作为公司发展的核心动力。在电子行业的早期阶段,该公司就投入大量资源研发新型电子元件,这些元件以其高精度和稳定性迅速在市场上获得了认可。随着技术的不断进步,DPA不断推出具有创新性的产品,如智能传感器和高效能集成电路,这些产品不仅满足了客户对性能的需求,也推动了整个电子行业的发展。通过不断的技术创新,DPA Components International公司在市场上建立了良好的口碑,成为行业内的领军企业。

台湾晶豪(ESMT)公司的发展小趣事

随着电子行业的不断发展,晶豪科技也积极应对市场变化。公司扩大代工厂的晶圆开工规模,以满足不断增长的客户需求。这一举措不仅使公司能够更灵活地应对市场波动,还为客户提供了更稳定的产品供应。同时,随着晶圆开工量的增加,公司的销售额也实现了稳步增长。

台湾凯励(Carli)公司的发展小趣事

台湾凯励(Carli)公司成立于1986年,总部位于台湾省台中市。在初创阶段,公司就专注于金属膜电容器的研发与生产,凭借对技术的执着追求和对品质的严格把控,逐渐在行业中崭露头角。凯励公司不断引进先进的生产设备和技术人才,积累了大量的技术经验和研发实力,为其后续的发展奠定了坚实的基础。

Fenwal Controls公司的发展小趣事

随着业务的不断发展,Fenwal Controls公司开始寻求全球扩张。公司通过建立广泛的分销网络,将产品推广至全球各地。同时,为了更好地满足当地市场需求,Fenwal Controls还积极实施本地化战略,与各地合作伙伴紧密合作,共同开发符合当地市场需求的定制化产品。这些举措不仅提升了公司的品牌影响力,也进一步巩固了公司在全球市场的地位。

问答坊 | AI 解惑

44B0X中文资料.大家支持下

44B0X中文资料.大家支持下…

查看全部问答>

PTT/POC手机对讲软件比较,常见PTT/POC手机对讲软件分析和评测

PTT/POC手机对讲软件比较,常见PTT/POC手机对讲软件分析和评测 PTT手机对讲软件是3G时代一个新的软件财富的传奇,到底什么是PTT手机对讲软件呢?按照百度百科对PTT的解释是这样的, PTT一键通(Push-to-Talk)功能是利用软件技术实现的一种全新的 ...…

查看全部问答>

PUCHAR类型字符串转换大小写

PUCHAR类型一个字符串,如何把它转换成小写 …

查看全部问答>

VC2005做的pocket pc程序怎么能让界面不在自动全屏?

用vs.net2005中的C++做的pocketpc程序运行后界面总是自动全屏化,该怎么解决?…

查看全部问答>

51单片机串口发送问题

为什么我这样不能发?那个TI不处理我至少应该收到一个啊?                              for(m=0;m…

查看全部问答>

四款充电器系列方案

四款充电器系列方案  充电器系列方案 方案一、1-4节AA/AAA NI-MH 四并充充电器功能如下:1、输入电源:AC90—260V;2、充电电池类型:AA(2500MAH)/AAA(900MAH)镍氢电池;3、充电控制方式:四节电池、并联分时充电方式、单独控制;4、指示 ...…

查看全部问答>

MDK全局变量初始化的问题

1,使用MICROLIB时,全局变量没有初始化;2,不使用MICROLIB时,如果不重定义_sys_exit()可以看到全局变量被正确初始化了,但在BKPT处停止 3,不使用MICROLIB时,重定义_sys_exit(),变量又没初始化 MDK咋这难用呢,问题出在哪?…

查看全部问答>

哪位大侠可以给我完整深入的说一下TMS320F2812,我的毕业设计要用到

哪位大侠可以给我完整深入的说一下TMS320F2812,我的毕业设计做的就是DSP,因为没学过,所以现在用就很吃力。 希望那个大哥大姐帮我一下,越详细越好,一些硬件结构,外部电路,寄存器设置等等,谢谢了。…

查看全部问答>