搜档网
当前位置:搜档网 › 单片机STM8按键长短按

单片机STM8按键长短按

单片机STM8按键长短按
单片机STM8按键长短按

//------------------------------------------------------------------------------

unsigned char Key_Sample1=0; //Key_Sample1当前对按键采样的值

unsigned char Key_Sample2=0; //Key_Sample2 上一次对按键采样的值

unsigned char Key_Scan_old=0; //上一次有效的键值状态,必需连续两次的采样值相同才能载入该变量

unsigned char Key_Down_flag=0; //键盘按下标识,注意是经过消抖后确认的按下标志

unsigned int Key_Down_Counter=0; //用于消抖的计数器

unsigned char Key_Value=0; //最终经过确认的键值

unsigned char Key_flag_long=0; //长按键标识

unsigned int Key_Down_Counter_l=0; //长时按键计数器

unsigned char Key_flag=1; //按键标志

//------------------------------------------------------------------------------

void KeyScan_Service(void)

{

Key_Sample1 =(PB_IDR&0x3E); // Key_Sample1 当前对按键采样的值

if(Key_Sample1==Key_Sample2) //Key_Sample2 上一次对按键采样的值

{

if((PB_IDR&0x3E)!=0)

{

if(Key_Down_flag==0)

{

if(Key_Sample1==Key_Scan_old)

{

Key_Down_Counter++; //用于消抖的计数器

if(Key_Down_Counter>=10)

{

Key_Down_Counter = 0;

Key_Down_flag = 1; //键盘按下标识,注意是经过消抖后确认的按下标志

Key_Down_Counter_l=0;

Key_Value = Key_Sample1;

}

}

else

{

Key_Down_Counter = 0;

Key_flag_long=0;

}

}

else

{

Key_Down_Counter_l++;

if(Key_Down_Counter_l>=200)

{

Key_flag_long=1; //长时按键标志

Key_Down_Counter_l=0;

}

}

}

else

{

if(Key_Down_flag==1)

{

Key_Down_flag = 0;

Key_Down_Counter = 0;

Key_flag_long = 0;

Key_Down_Counter_l=0;

Key_flag=1; //短按表示

Key_Value=0;

}

}

Key_Scan_old = Key_Sample1; //上一次有效的键值状态,必需连续两次的采样值相同才能载入该变量

}

Key_Sample2 = Key_Sample1;

}

/****************************************************************************** *

Key_flag 短按标志Key_flag_long 长按标志

******************************************************************************* /

void sky_answer(void)

{

switch (Key_Value)

{

//------------------------------------------------------------------------------

case 0x10: //设置PB4 sky1

{

if(Key_flag==1&&set_num!=0)

{

set_num++; skip=0;

Key_flag_long=0;Key_flag=0;

if(set_num==1)

{

LED_state=3;move_num=0; //设置

}

else if(set_num==2)

{

LED_state=4; move_num=0; //周长

girth_buff=girth;

speaData(girth_buff);

if(length_buff!=length)

{

length=length_buff;

eeprom_save(1);

Motorleng_close();

}

}

else if(set_num==3)

{

LED_state=1; //功能一

speaData(SPeed);

if(girth_buff!=girth)

{

girth=girth_buff;

eeprom_save(3);

}

}

else if(set_num==4) //LED_state=5停止

{

LED_state=5; updat=1; set_num=0;

move_num=0; run_state=0;

if(OFF_ON==0)LED_state=5;

else LED_state=0;

}

}

else if(Key_flag_long==1&&set_num==0)

{

Key_flag_long=0;Key_flag=0;

LED_state=3; //设置

set_num=1;

length_buff=length;

speaData(length_buff);

run_state=0;

}

}break;

/****************************************************************************** *

******************************************************************************* /

case 0x08: //长按清零PB3 sky2

{

if(Key_flag_long==1)

{

Key_flag_long=0;Key_flag=0;

now_length=0;

updat=1; run_state=0;

girth_DA=0;

}

else if(Key_flag==1)Key_flag=0;

}break;

//------------------------------------------------------------------------------

case 0x02: //移位PB1 sky4

{

if(Key_flag==1&&set_num!=0)

{

Key_flag_long=0;Key_flag=0;

if(set_num==1) //长度移位

{

move_num++;if(move_num>5) move_num=0;

}

if(set_num==2) //周长移位

{

move_num++;if(move_num>3) move_num=0;

}

}

}break;

//------------------------------------------------------------------------------

case 0x20: //置数PB1 sky4

{

if(Key_flag==1&&set_num!=0)

{

skip=0;Key_flag_long=0;Key_flag=0;

if(set_num==2)

{

girth_data[3]=DS_data[3];

girth_data[2]=DS_data[2];

girth_data[1]=DS_data[1];

girth_data[0]=DS_data[0];

switch(move_num)

{

case 3: {girth_data[3]++; if(girth_data[3]==10) girth_data[3]=0; }

break;

case 2: {girth_data[2]++; if(girth_data[2]==10) girth_data[2]=0; } break;

case 1: {girth_data[1]++; if(girth_data[1]==10) girth_data[1]=0; } break;

case 0: {girth_data[0]++; if(girth_data[0]==10) girth_data[0]=0; } break;

default: break;

}

girth_buff=(uint)girth_data[3]*1000+(uint)girth_data[2]*100+girth_data[1]*10+girth_data[0];

speaData(girth_buff);

}

//===================================================================== ===================

else if(set_num==1)

{

up_data[5]=DS_data[5];

up_data[4]=DS_data[4];

up_data[3]=DS_data[3];

up_data[2]=DS_data[2];

up_data[1]=DS_data[1];

up_data[0]=DS_data[0];

switch(move_num)

{

case 5: {up_data[5]++; if(up_data[5]==10) up_data[5]=0;} break;

case 4: {up_data[4]++; if(up_data[4]==10) up_data[4]=0;} break;

case 3: {up_data[3]++; if(up_data[3]==10) up_data[3]=0;} break;

case 2: {up_data[2]++; if(up_data[2]==10) up_data[2]=0;} break;

case 1: {up_data[1]++; if(up_data[1]==10) up_data[1]=0;} break;

case 0: {up_data[0]++; if(up_data[0]==10) up_data[0]=0;} break;

default:break;

}

length_buff=(long)up_data[5]*100000+(long)up_data[4]*10000+(uint)up_data[3]*1000

+(uint)up_data[2]*100+up_data[1]*10+up_data[0];

speaData(length_buff);

}

}

}break;

//------------------------------------------------------------------------------ case 0x04: //运行启停

{

if(Key_flag==1)

{

Key_flag_long=0;Key_flag=0;

sky_int();

}

}break;

//------------------------------------------------------------------------------ default:break;

}

}

自己写的按键单片机程序

自己写的按键单片机程序 用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536- 45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--

51单片机按键控制数码管程序

#define uint unsigned int #define uchar unsigned char uchar c; sbit p10=P1^0; sbit p11=P1^1; sbit p12=P1^2; sbit p13=P1^3; sbit p14=P1^4; sbit p15=P1^5; sbit p16=P1^6; sbit p17=P1^7; void delay(uint z); int b[]={0,1,2,3,4,5,6,7};//设置每一位显示的数字 unsigned char code Tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳极数码管 int a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main() { EA=1; EX0=1; IT0=1; P1=0xff; while(1) { for(c=0;c<8;c++)//数码管扫描显示

P2=a[c]; P0=Tab[b[c]]; delay (1); } } } void delay(uint z) { uint a,b; for(a=z;a>0;a--) for(b=110;b>0;b--); } int_0()interrupt 0 { EA=0; if(p10==0) b[0]=(b[0]+1)%10; if(p11==0) b[1]=(b[1]+1)%10; if(p12==0) b[2]=(b[2]+1)%10; if(p13==0) b[3]=(b[3]+1)%10; if(p14==0) b[4]=(b[4]+1)%10; if(p15==0) b[5]=(b[5]+1)%10; if(p16==0) b[6]=(b[6]+1)%10; if(p17==0) b[7]=(b[7]+1)%10;

单片机键盘输入程序

这是读取键盘的子程序 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法 以及如何处理读入的键值 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms 应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。 下面是汇编语言写的单片机键盘输入程序 ************************************************** led1 bit p1.0;LED 显示位定义 led2 bit p1.1 led3 bit p1.2 led4 bit p1.3 led5 bit p1.4 led6 bit p1.5 led7 bit p1.6 led8 bit p1.7 s1 bit p0.0 ;数码管位定义 s2 bit p0.1 s3 bit p0.2 s4 bit p0.3 s5 bit p0.4 s6 bit p0.5 s7 bit p0.6 s8 bit p0.7 led_data equ p2;数码管显示数据定义 key1 bit p3.5 ;按键引脚定义

key2 bit p3.6; key3 bit p3.7; key equ 46h;按键寄存单元 org 00h jmp main org 030h main:mov sp,#30h;首先定义 lcall REST;初始化子程序 lp:lcall pro_key;调用键盘查询子程序 lcall KEYPR ;用来显示所查询到的键值jmp lp;反复调用,不断查询 REST: mov a,#00h mov b,#00h mov p0,#0 mov p1,0ffh ; mov p2,#0 mov key,#00h mov p2,#255 clr beep RET KEYPR: mov a,key;键值在累加器KEY中 jz PROEND ;如果A= 0,表示没有按键,返回cjne a,#1,k1;A= 1 ,用户按了第一个键mov a,#1 ;处理 A = 1的情况 mov dptr,#tab_nu ;查表 movc a,@a+dptr mov led_data,a ;显示"1" setb s1 ;在第一位

51单片机学习笔记(六)_串口中断通信+定时器2串口中断

51单片机学习笔记(六)_串口中断通信+定时器2串口中 断 51 单片机默认使用定时器1 作为串口通信的波特率发生器、定时器1 中断 通信,串口与定时器1 冲突,在遇到定时器不够用的时候可以用定时器2 #include void DelayMs(unsigned int i);void SerialInit();void SendByte(unsigned char sbyte);void SendString(unsigned char *pstr);void main(void){SerialInit();while(1); //注:必需要无限循环}/*//单片机时钟周期: 11.0592MHz 以时钟1 作为波特率发生器void SerialInit(){TMOD=0x20; // 设置T1 工作方式为方式2TH1=0xfd; //给定时器高位装初值TL1=0xfd; //给定时 器低位装初值TR1=1; //开定时器//以上是设置波特率SM0=0; //设置串口通 讯方式为方式1SM1=1; REN=1; //串口是否接收数据的开关EA=1; //总中断 打开,采用查询法时不用打开中断ES=1; //串口中断开关,采用查询法时不用打开 中断}*///单片机时钟周期:11.0592MHz 以时钟T2 作为波特率发生器void SerialInit(){PCON &= 0x7F; //波特率不倍速SMOD=0SCON = 0x50; //方式1,8 位数据,可变波特率,接收允许T2CON = 0x34; RCAP2H = 0xFF; RCAP2L = 0xDC; TH2 = 0xFF; TL2 = 0xDC;EA=1; //总中断打开,采 用查询法时不用打开中断ES = 1; //串口中断开关,采用查询法时不用 打开中断}//串口中断函数:void SerialPortInte(void) interrupt 4 //采用串口中断法 收发数据{unsigned char rbyte;if(RI){ //RI=1,判定为串口接收到了数据,RI 要清零,RI=0;rbyte=SBUF; if(rbyte==0x0A){ SendString(“换行”);}else if(rbyte==0x0D){SendString(“回车”);}else{SendByte(rbyte);}}}//串口发送一个字节:void SendByte(unsigned char sbyte){ SBUF=sbyte; //发送数据while(!TI); //等待发送完成TI=0; //清零发送标志位}//串口发送一个字符串:void

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1A2; //蜂鸣器器控制脚 sbit keyl =卩3人2;〃按键控制引脚 sbit key2 =P3A3; sbit key3 =P3A4; /* 以下数组是音符编码 */ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()// 定时器 T0 方式 1 ,定时 10ms { TMOD = 0x01; IE = 0x82; TH0 = 0xDC; TL0 = 0x00; void Time0_Int() interrupt 1 { TH0 = 0xDC; TL0 = 0x00; Count++; } void delay (uint8 k)// 按键防抖延时 { uint8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)// 发声延时 { uint8 i,j; for(i=0; i

Count = 0; // 中断计数器清 0 Addr = i *3; while(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } }void keyscan (void)// 按键切换声音函数{ if(key1==0) { delay(10); if(key1==0) {

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。 这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。 这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。 3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。 这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。 4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

双机间的串口双向通信2.0

单片机应用课程设计任务书

单片机应用课程设计说明书 学院名称:计算机与信息工程学院 班级名称:网工124 学生姓名:卞可虎 学号:2012211369 题目:双机间的串口双向通信设计指导教师:于红利 起止日期:2014.12.29至2015.1.4

目录 一、绪论 (1) 二、相关知识 (6) 2.1 双机通信介绍 (6) 2.2单片机AT89C51介绍 (6) 2.3 串行通信简介 (8) 2.3.1串行通信的特点 (8) 2.3.2串行通信技术标准 (9) 三、总体设计 (10) 3.1 设计需求 (10) 四、硬件设计 (10) 4.1 系统硬件电路设计 (10) 4.1.1整体电路设计 (10) 4.1.2 控制电路设计 (11) 4.1.3 复位电路 (11) 4.1.4 显示电路 (12) 五、软件设计 (12) 5.1发送端程序流程 (12) 5.2接收端程序流程 (13) 5.3按键程序 (14) 5.4串口通信程序 (15) 5.5数码管显示程序 (16)

六、Proteus软件仿真 (16) 七、结束语 (19) 参考文献 (20) 指导教师评语 (21) 成绩评定 (21) 附录:源程序 (22) 一、绪论 电子技术的飞速发展,单片机也步如一个新的时代,越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路。单片机之间的通信可以分为两大类:并行通信和串行通信。串行通信传输线少,长距离传输时成本低,且可以利用数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。所以本系统采用串行通信来实现单片机之间可靠的,有效的数据交换。 对于一些类似复杂的后台运算及通信与高实时性前台控制系统、软件资源消耗大的系统、功能强大的低消耗系统、加密系统等等。如果合理使用多种不同类型的单片机组合设计,可以得到极高灵活性与性能价格比,因此,多种异型单片机系统设计渐渐成为一种新的思路,单片机技术作为计算机技术的一个重要分支,由于单片机体积小,系统运行可靠,数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。但在一些相对复杂的单片机应用系统中,仅仅一个单片机资源是不够的,往往需要两个或多个单片机系统协同工作。这就对单片机通

第3课 HJ-2G AVR单片机学习笔记 程序编写编译环境

第3课ICC程序编写编译环境 基于HJ-2G AVR学习板 学习AVR单片机必需要安装的第二个软件:程序编写编译环境ICC AVR 1、下面说一说安装方法,在配套资料(网上下载)找到ICC AVR直接点击按装,装好后输入正版注册码,这样就可以正常使用ICCAVR软件编写编译。 2、在桌面上打开ICCAVR软件,出现如下图片:请点开工程,并新建一个工程。 3、下图为新建一个工程,请保存在C盘目录下,输入工程名称(只能是中文),点击保存。

4、新建立一个C文件,在下图空白处输入你的C源码,输完后请保存C文件。 5、加入刚才建好的C文件到工程当中,方法如下图。

6、设置一下编译器,如下图。 7、芯片用ATmega16

8、最后一步了,只要你按上面的一步一步做,最后点一下编译键,就可以正常编译成功,如果不成功,请查一查你的C源码是否正确,还有工程是不是在中文目录下。 9、总结:本课主要学习了程序编写编译环境ICC AVR的安装,设置,还有编译方法,开始学单片机时,新手不会写C源码,可以复制慧净写好的C源码到项目中,练习多次,ICCAVR 软件你就会使用了,以后学习中,每一课都会用到本软件,只要你认真跟着《慧净1天入门AVR单片机学习笔记》学习,多多练习,相信你很快速学会AVR单片机。 慧净AVR单片机免费共享学习笔记目录(配有视频教程,请在慧净空间下载) 第一部1天入门AVR单片机学习笔记 第1课:AVR单片机学习基本流程 第2课:AVR单片机程序烧写方法 第3课:程序编写编译环境 第4课:简单C语言基础知识 第二部10天学会AVR单片机学习笔记 第1课:IO端口操作 第2课:流水灯 第3课:单个数码管显示 第4课:多个数码管同时显示 第5课:独立按键 第6课:定时器 第7课:外部中断

单片机八个按键控制八个led灯程序

#include #include void delay(void) {unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);} unsigned char Key_Scan(); void main(void) { unsigned char ledValue, keyNum; ledValue = 0x01; while (1) { keyNum = Key_Scan(); switch (keyNum) { case(0xFE) : ledValue = 0x01; break; case(0xFD) : //返回按键K2的数据 ledValue = 0x02; break; case(0xFB) : //返回按键K3的数据 ledValue = 0x04; break; case(0xF7) : //返回按键K4的数据 ledValue = 0x08; break; case(0xEF) : //返回按键K5的数据 ledValue = 0x10; break; case(0xDF) : //返回按键K6的数据 ledValue = 0x20; break; case(0xBF) : //返回按键K7的数据 ledValue = 0x40; break; case(0x7F) : //返回按键K8的数据 ledValue = 0x80; break; default:

break; } P0 = ledValue;//点亮LED灯 } } /****************************************************************************** * * 函数名: Key_Scan() * 函数功能: 扫描键盘 * 输入: 无 * 输出: 读取到的键值 ******************************************************************************* / unsigned char Key_Scan() { unsigned char keyValue = 0 , i; //保存键值 //--检测按键1--// if (P1 != 0xFF) //检测按键K1是否按下 { void delay(void) {unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);} if (P1 != 0xFF) //再次检测按键是否按下 { keyValue = P1; i = 0; while ((i<50) && (P1 != 0xFF)) //检测按键是否松开 { Delay10ms(1); i++; } } } return keyValue; //将读取到键值的值返回 }

单片机读书笔记

单片机的分类 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。 众多的单片机可以从不同角度进行分类。 Ⅰ按生产厂家分 1.INTEL公司的单片机(MCS-48系列单片机:MCS-48单片机是美国INTEL公司于1976年推出,它是现代单片机的雏形,包含了数字处理的全部功能,外接一定的附加外围芯片即构成完整的微型计算机;MCS-51系列:MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品) 2.ATMEL公司的单片机(AT89系列单片机:AT89系列单片机是ATMEL 公司的8位Flash单片机系列。这个系列单片机的最大特点是在片内含有Flash存储器。因此,在应用中有着十分广泛的前途特别是在便携式、省电及特殊信息保存的仪器和系统中显得更为有用;A VR单片机:A VR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片

机。A VR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。) 3.Motorola公司的单片机(MC68300系列单片机:MC68300系列微控制器采用模块化设计,可以根据用户的要求,选择不同的模块,以适应不同的应用场合) 4. MicroChip单片机的单片机(PIC12CXXX系列单片机、PIC16CXXX系列单片机) 5.PHILIPS公司的单片机(通用型单片机:PHILIPS公司的P80C31基于80C51内核采用高密度CMOS技术设计制造,包含中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、3个16位定时/计数器和6个中断源,4层优先级中断嵌套结构,可用于多机通信的串行I/O口,I/O扩展或全双工UART,片内时钟振荡电路;Flash 单片机、低功耗OTP单片机) 6.TI公司的单片机(TI单片机MSP430:德州仪器(TI)超低功率16位RISC混合信号处理器的MSP430产品系列为电池供电测量应用提供了最终解决方案。德州仪器作为混合信号和数字技术的领导者,TI 创新生产的MSP430,使系统设计人员能够在保持独一无二的低功率的同时同步连接至模拟信号、传感器和数字组件。) 7.其他公司的单片机(美国SST公司的SST89系列、美国CYGNAL公司的C8051FXXX系列单片机、东芝TLCS-870系列单片机) Ⅱ按单片机数据总线的位数,可将单片机分为4位、8位、16位、32位

51单片机按键控制花样灯

51单片机按键控制花样灯 时间:2012-09-10 13:50:11 来源:51hei 作者: /**************************************************** * 本程序实现用按键控制花样灯。 * * 当K1按下时,灯从0xfe向左跑一遍; * * 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;* * 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。* * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。* * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。* ******************************************************/ ************************************************* 连接方法:P0接独立按键JP5;P2接LED灯接口JP1 * ***********************************************************/ #include //头文件,函数声明 #include //定义按键所在位 sbit K1=P0^0; sbit K2=P0^1; sbit K3=P0^2; 页脚内容1

sbit K4=P0^3; sbit K5=P0^4; unsigned char led; unsigned char j; void delayms(unsigned char ms) // 1ms标准延时 { while(ms--) { for(j=0;j<110;j++); //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确} } void main() { //P2=led; unsigned int i; while(1) { /********************************************* 页脚内容2

基于AT89C51单片机键盘控制动态显示器的设计

键盘控制动态显示器 目录 摘要-----------------------------------------------------------------------------------------3 关键字--------------------------------------------------------------------------------------3 第一章绪论-------------------------------------------------------------------------------4 1.1 课题简介---------------------------------------------------------------------------4 1.2 系统功能要求---------------------------------------------------------------------4 1.3技术指标----------------------------------------------------------------------------4 第二章方案论证及硬件设计----------------------------------------------------------5 2.1 方案论证---------------------------------------------------------------------------5 2.2 单片机简介------------------------------------------------------------------------5 2.2.1 MSC-51系列单片机简介-------------------------------------------------------6 2.2.2MSC-51系列单片机内部结构-----------------------------------------------7 2. 2.3 MSC-51系列单片引脚及其功能----------------------------------------------8 2.3 键盘部分--------------------------------------------------------------------------9 2.4 LED显示器简介----------------------------------------------------------------10 2.5 电路工作过程---------------------------------------------------------------------10 第三章键盘控制电路原理图----------------------------------------------------------11 3.1 硬件框图---------------------------------------------------------------------------11 3.2 电路原理图------------------------------------------------------------------------12 第四章软件设计-------------------------------------------------------------------------13 4.1键盘扫描、按键判断程序------------------------------------------------------13 4.2显示子程序------------------------------------------------------------------------13 4.3程序框图----------------------------------------------------------------------------15 4.4 完整的源程序---------------------------------------------------------------------16 第五章检测与调试--------------------------------------------------------19 5.1 硬件调试---------------------------------------------------------------------------19 5.2 软件调试---------------------------------------------------------------------------19 第六章元器件清单----------------------------------------------------------------------20 第七章心得体会-------------------------------------------------------------------------21 第八章参考文献-------------------------------------------------------------------------23

史上最通俗易懂的单片机自学有笔记1

单片机关键知识点一览: 系列一 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第一个单片机小程序 5:单片机延时程序分析 6:单片机并行口结构 7:单片机的特殊功能寄存器 系列二 8:单片机寻址方式与指令系统 9:单片机数据传递类指令 10:单片机数据传送类指令 11:单片机算术运算指令 12:单片机逻辑运算类指令 13:单片机逻辑与或异或指令祥解 14:单片机条件转移指令 系列三 15:单片机位操作指令 16:单片机定时器与计数器 17:单片机定时器/计数器的方式

18:单片机的中断系统 19:单片机定时器、中断试验 20:单片机定时/计数器实验 21:单片机串行口介绍 系列四 22:单片机串行口通信程序设计 23:LED数码管静态显示接口与编 24:动态扫描显示接口电路及程序 25:单片机键盘接口程序设计 26:单片机矩阵式键盘接口技术及 27:关于单片机的一些基本概念 28:实际案例实践——单片机音乐程序设计 1:单片机简叙 什么是单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。 2:单片机引脚介绍

按键处理程序 C语言 单片机

分享一种按键处理程序(用C) //头文件定义: Ustruct KEY { Uchar Val; #define Key_Model_C 0 //按键1值 #define Key_AddVal_C 1 //按键2值 Uint ScanOnTime; Uchar LongKeyState; Uchar LongKeyRestState; Uchar SetInRn; Uchar Model; //按键状态(模式) #define Off_C 0 //之前未按下 #define On_C 1 //现按下 #define Delay_C 2 //按键处理后标志 }Key; //----------------定义两个IO输入口为按键入口--------------------// #define KeyMo_Bin (GPIOB->IDR.Bit.B5) #define KeyAdd_Bin (GPIOB->IDR.Bit.B6) /*===============================================================*/ GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断 /*===============================================================*/ //主程序大循环中每1毫秒扫描1次 void KeyScan(void) { if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键) { if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起 { if(++Key.ScanOnTime >= 130) //延时后复位 { Key.LongKeyRestState=0; Key.Model=Delay_C; } } else Key.ScanOnTime=0; return; } if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C” { if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效) { if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动

单片机学习笔记

MC51单片机学习笔记 一准备知识: 1.内部结构:4K Rom 程序存储器(硬件)128节Ram随机存储器(软件) 8位cpu,4个8位并口,1个全双串行口,2个16位定时器/计数器; 寻址范围64k 布尔处理器 CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器; RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据; ROM:用以存放程序、一些原始数据和表格; I/O口:四个8位并行I/O口,既可用作输入,也可用作输出; T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式 五个中断源的中断控制系统; 一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信; 片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。 2.分类:arm(快)凌阳(处理声音较好) 3.型号说明:STC (公司名) 89(系列)C(CMOS;CAD:自带

AD转换;S:串行下载无需专门的编程器;lv:工作电压为3v)51(1*4=4K) RC 40(晶振最高频率) C(商业级:温度0--85,I工业级温度-40--125)----PDIP (双列直插式)0721(07年第21周)......... 4.电平:TTL:高:+5v--低0v; RS232:计算机串口:+12v--低-12v,故计算机和单片机通信需要电平转换芯片 5.二进制与十六进制之间的转换:每4位转变一次 6.二进制转换逻辑符号:&与,//或,---非,异或 7. P3第二功能各引脚功能定义: P3.0:RXD串行口输入 P3.1:TXD串行口输出 P3.2:INT0外部中断0输入 P3.3:INT1外部中断1输入 P3.4:T0定时器0外部输入 P3.5:T1定时器1外部输入 P3.6:WR外部写控制(计数) P3.7:RD外部读控制 RST :复位管脚,高电平有效,时间大于两个机器周期 VPD:备用电源 注:机器周期和指令周期 (1)振荡周期: 也称时钟周期, 是指为单片机提供时钟脉

MSP430时钟配置及ad模块等学习笔记

MSP430收集资料笔记 问: 个刚从51转到msp430这块的学生,我想知道,分频其实到底可以干什么,具体什么时候才会需要我们去分频? 能举些详细的例子告诉我分频什么时候改用,什么时候不该用吗?不需要代码,例子就好 答: 51也要分频啊,一个系统CPU(中央处理单元)的频率最高的,其他的外设都是低速的,都要通过主时钟分频产生低速的时钟来工作;比如8Mhz的单片机是说CPU的时钟是工作在8mhz,但gpio、串口,定时器等它们的工作频率很低的,这个时钟就需要分频来产生;当你想要改变一个外设的工作频率时就需要重新设置分频系数,比如串口波特率,定时时间,IIC时钟,spi时钟等等; 问: MSP430单片机的定时器,看门狗等东西的时钟来源于于各个时钟 (SMCLK,ACLK,MCLK,DCO等)有什么区别呢?还有这些问什么要分频呢,不分频好像程序也可以写啊! 有这三种时钟我也知道,我只是想知道。我是想知道这些时钟给外设使用的时候到底到底选择哪个,为什么要选择这个? 答: 不知道楼主用的是那个型号!我用的149,就用这个给你说吧!msp430F149 不分频具体的根据系统需要决定,楼主应该是初学吧!有些问题你不必深究,慢慢的在学习和使用中你就明白了,刚开始你知道怎么用就可以了! CTRL_C+CTRL_V,就算是抄别人的,也自己敲一遍,加深理解,加深印象!

话有说回来,学编程本来就是这么个过程,一看二抄三写四调试!我就是这么过来的,网上资源很多,多看看别人是怎么学的,怎么做的! || || 信号源---分频输出---------》时钟----------------》输出信号源----------外围模块|| (DCO)//************不设置即被MCLK默认***********************// || (LFXTI)→MCLK==→信号源分频输出=→信号源供给外围模块,CPU || (LFXT2) 1)MCLK系统主时钟。除了CPU运算使用此时钟以外,外围模块也可以使用。MCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。 (2)SMCLK系统子时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。SMCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。 ||(DCO)//************不设置即被MCLK默认***********************// ||(LFXTI)→信号源分频输出=→SMCLK==→信号源供给外围模块 ||(LFXT2) (3)ACLK辅助时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。但ACLK只能由LFXT1进行1、2、4、8分频作为信号源。 PUC复位后,MCLK和SMCLK的信号源为DCO,DCO的振荡频率默认为800KHZ。ACLK的信号源为LFXT1。 || ||LFXI1=→信号源分频====》ACLK========→外围模块 MCLK,SMCLK ||PUC复位===|=======》 DCO=800KHZ |ACLK | |LFXTI

相关主题