1,轻触开关对于51单片机的IO引脚接口动作图中的是点动,就是按着就接通、放手就断开 。。。。。。。。。。。。51开发中,一般使用开关让IO变低电平 , 来判断是否按下开关了 。【51按键接io口程序,轻触开关对于51单片机的IO引脚接口动作】
2,关于51单片机设计键盘输入电路独立键盘好编程 矩阵键盘省IO口 可以根据实际情况的五个按钮,那就直接连上IO , 占用5个就算了,数量多的话,就用矩阵,通过简单的算法,找出被按下的按键 。如果你需要做其他事的话,那就需要按键外部中断响应 , 这比较实时如果帮你写出来的话,就失去学习单片机的意义了,大概思路可以给你讲下,首先你得用个矩阵键盘的扫描程序 , 用7个io口就能实现,然后把扫描到的键值进行处理 。然后把处理完的值在数码管上显示出来,这里需要对应你的单片机电路图 , 写一个自己的数码管驱动 。你后面说的每按一下,向左移动一位?不明白什么意思,但是你把上面的弄完了,实现这些东西肯定没问题 。郭天祥的十天学会单片机 你看看3和4讲,应该是讲矩阵键盘和数码管的,一看就会 。。。其实很好接 你把所用io口一端接按键 按键另一端接地不就行了 3Q
3,51单片机io口相连两个单片机,近距离的串口通信,就是这样的 。完全可以直接相连 。并口通信,也有人弄过 , 也是直接相连的 。RXD连接另一片单片机的TXD时可以 即近距离的串口通信时可以,在同一片单片机是不可以的51的io 很特别,属于sfr,不能直接或者间接寻址,所以不能像寄存器那样随意调换顺序 。要么在定义的时候修改,要么使用以个接口函数,在接口函数中实现io的兑换 , 这个函数可以接受参数什么的,可以做的比较人性化 。不行吧,至少是不好的,我看数据手册上有说下面这一段话:发现有些在做行列矩阵按键扫描电路时,实际工作时没有加限流电阻,实际工作时可能出现2个I/O口均输出为低,并且在按键按下时,短接在一起,我们知道一个COMS电路的两个输出脚是不应该短接在一起的,按键扫描电路中,此时一个口为了读另外一个口的状态 , 必须先置高才能读另外一个口的状态,而8051单片机在从0变为1时会有两个时钟的强推挽高输出电流 , 输出到另外一个输出为低的I/O口,就有可能造成I/O口的损坏 。建议在其中一侧加1K限流电阻,或者在软件处理上,不要出现两端的I/O同时为低 。
4,c语言51 io口程序设计//下列程序基本正确,剩下一些脉冲宽度定时,可自行完成 。#include #define uchar unsigned char #define uint unsigned int sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit k_1 = P3^0; //第一个输入 uchar t_10ms, k3; //-------------------------------------- DL_x_10ms(uchar x) { t_10ms = 0; TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; //定时10ms@12MHz TR0 = 1; //启动定时. while(t_10ms < x); //不到x*10ms,原地等待. TR0 = 0; //关闭定时. } //-------------------------------------- void main(void) { TMOD = 01; //T0定时方式1 TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; //定时10ms@12MHz TR0 = 0; //暂时不启动. ET0 = 1; IT0 = 1; IT1 = 1; EX0 = 0; EX1 = 0; EA = 1; k3 = 1; while(1) { // //-------------------------------------- while((k_1 == 1) || (k3 == 0));//K1没有按,或者 K3尚未执行 原地等待. //K1按了一次,就往下执行. while(k_1 == 0); //等待K1释放. k3 = 0; //以后K1按下两次、三次...,也不会执行. //进入第一个中断 , P0.0口输出低电平,P0.1口输出高电平,延时1.5S后P0.0口输出高电平 。. P00 = 0; P01 = 1; DL_x_10ms(150); P00 = 1; EX0 = 1; //开放INT0(K2)中断 //循环到前面,等待(K1按下且K3=1) } } //-------------------------------------- T0_INT() interrupt 1 { TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; //定时10ms@12MHz t_10ms++; } //-------------------------------------- X0_INT() interrupt 0 //K2输入下降沿,将进入本函数 { //进入第二个中断,延时1.11S后P0.2口输出低电平,然后. DL_x_10ms(111); P02 = 0; //P0.2口输出低电平 //输出低电平多少时间?题目没有说 。//--------------------- //高0.15S, P02 = 1; //P0.2口输出高. DL_x_10ms(15); //--------------------- //低0.3S, P02 = 0; //P0.2口输出低电平. DL_x_10ms(30); //下面的定时,可以自行编写 //高0.3S, //低0.58S, //高0.12S, //低1.08S, //高2.55S, //低0.47S, //高0.075S,高低电平很多次这样 。. EX0 = 0; EX1 = 1; //开放INT1(K3)中断 } //-------------------------------------- X1_INT() interrupt 2 { //当进入第三个中断,P0.1口输出低电平 。. P01 = 0; EX1 = 0; k3 = 1; //=1,将在主函数中有用 } //--------------------------------------5 , 51单片机用一个IO口模拟一个脉冲信号然后用一个独立按键控制这io口输出不同占空比的脉冲/*************************************************************************** th0=0xb1;tl0=0xdf;25hz(很闪) th0=0xc9;tl0=0x4f;35hz(闪) th0=0xd5;tl0=0x07;43hz(微闪) th0=0xdd;tl0=0x9f;60hz(不闪)***************************************************************************/#include #define uchar unsigned char #define uint unsigned int sbit key=p2^0; uchar flag,thp,tlp,thc,tlc; uint duty; /*************************************************************************** 延时n ms ***************************************************************************/ void delaym(unsigned int n) { unsigned int i,j; for(j=n;j>0;j--) for(i=112;i>0;i--); } /*************************************************************************** 根据flag值装入定时器0的初值 。flag为0,装入高电平脉宽时间初值 。flag为1,装入 低电平脉宽时间初值 。***************************************************************************/ void hometime() { switch(flag) { case 0x00 : th0=thp;tl0=tlp;p1=0xff;break; case 0x01 : th0=thc;tl0=tlc;p1=0;break; }; } /*************************************************************************** 中断入口,翻转flag标志 。装入初值 。***************************************************************************/ void timer0() interrupt 1 { flag=!flag; hometime(); } /*************************************************************************** 单片机开中断设置 ***************************************************************************/ void mcuinti() { tmod=0x01; hometime(); tr0=1; ea=1; et0=1; } /*************************************************************************** 占空比,频率,定时器0初值计算 高电平初值=0xffff-周期时间(hometime)/占空比倒数(duty) 低电平初值=0xffff-周期时间+周期时间/占空比倒数 ***************************************************************************/ void timenum(unsigned int hometime) { unsigned int tram; tram=0xffff-hometime/duty; thc=tram>>8; tlc=tram; tram=0xffff-hometime+(hometime/duty); thp=tram>>8; tlp=tram; } /*************************************************************************** 键盘扫描 。每次按键duty-1,duty取值范围20~1 ***************************************************************************/ void scan_key() { if(key==0) { delaym(20); if(!key) { tr0=0; duty--; if(duty<1|duty>20) { duty=20; }; timenum(5000); while(!key); tr0=1; }; }; } /*************************************************************************** 200hz ***************************************************************************/ void main() { duty=20; timenum(5000); mcuinti(); while(1) { scan_key(); }; }你好!因为按键操作涉及寄存器配置和按键防抖,因此写了你也不一定用得上 。而且你这个的逻辑比较简单,建议自己写 。主要注意几个地方就可以了:按键I/O口电平的配置:要结合硬件电路确认按键是低电平触发还是高电平触发 。在程序中设置正确的I/O口电平 。I/O口的输入输出状态的配置:I/O口作为按键输入必须是准双向模式或输入模式,这个不同单片机配置寄存器方式不同但大同小异 。按键防抖:在按键按下时有时会有短暂的接触不良,因此会多次判断按键按下和断开,因此一般在按键按下或断开时增加几十毫秒的防抖处理 , 具体就是连续多个循环判断按键是否是一个状态,如果状态不变 , 再进行下一步处理 。
- mysql子查询和连接查询 mysql子查询插入
- 客户端无法连接到异速联服务器 客户端无法连接mongodb
- mysql怎么把两个字段拼在一起 mysql字段拼接中文
- 惠普6930p,惠普打印机怎么连接家里wifi
- 分析家c语言接口
- 如何正确接入高防服务器? 高防服务器怎么接
- 网页调用mysql mysql网页打开链接
- rediscluster连接池 redis连接池是什么
- redis本地登录 redis只能本地连接
- mongodb数据库连接池配置 mongodb数据库连接个数
