按键设置占空比,PWM控速_第1页
按键设置占空比,PWM控速_第2页
按键设置占空比,PWM控速_第3页
按键设置占空比,PWM控速_第4页
按键设置占空比,PWM控速_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*接法:P0段选;P3键盘功能:通过按键设置PWM占空比进而控制电机转速*/原理图:程序:#include<reg51.h> #include<math.h>#define uint unsigned int/下面用uint代替unsigned int(无符号整数)#define uchar unsigned char/下面用uchar代替unsigned char(无符号字符型数)#define GPIO_DIG P0/下面用GPIO_DIG代替P0口,P0口送数码管段选信号#define keyport P3/keyport代替P3,P3口键盘扫描sbit shi

2、 = P25;/数码管位选(十位) ,用shi代替 P25sbit ge = P26;/数码管位选(个位)sbit LED = P27;/P27控制LED闪烁sbit PWM = P10;/P10输出pwmunsigned char code table17 = /定义一个数组存放共阴极数码管码表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar temp=0,0; /临时存放占空比的数组uchar duty=0,0; /存放占空比的数组,duty0存十位duty1存个位ch

3、ar flag = 0; /按键的一个标志按一次键加1, uchar key = 0; /存放键值uchar t0; /存放占空比()uint timer1;uint count;uint period;uint t = 0;/* 子函数声明*/void delay10ms(void); /10ms延时软件消抖的声明void delayxms(uint x);/延时xms的函数的声明void matrixscan(void); /键盘检测函数的声明void Time1Config(void);/定时器设置函数的声明void set(void);/设置占空比的函数void display(voi

4、d);/数码管动态显示函数声明/* 主函数*/void main()Time1Config();while(1)set();matrixscan();display();t0=duty0*10+duty1;/* 子函数定义*/*延时10ms函数的定义(无入口参数无返回值)*/void delay10ms() uchar a,b,c;for(a=1;a>0;a-)for(b=38;b>0;b-)for(c=130;c>0;c-);/*延时xms函数的定义(入口参数是无符号整形数x的值是多少延时几毫秒,无返回值)*/void delayxms(uint x) /误差 0us un

5、signed char a,b,c;for(;x>0;x-) for(c=1;c>0;c-) for(b=142;b>0;b-) for(a=2;a>0;a-);/*数码管动态显示函数的定义(无入口参数无返回值)*/void display(void)P0=tableduty0;shi = 0;delayxms(10);shi = 1;P0=tableduty1;ge = 0;delayxms(10);ge = 1;/*3×5键盘扫描函数的定义(无入口参数无返回值)*/void matrixscan() uchar temp; keyport=0xfe; /第

6、1行通低电平(1111,1110)temp=keyport; /读P3电平temp=temp>>3; /右移三位if(temp!=0x1f) /检测不等说明高5位中有低电平,有键按下delay10ms(); /去抖延时temp=keyport; /读P3电平temp=temp>>3; /右移三位if(temp!=0x1f) /检测不等说明高5位中有低电平,有键按下 temp=keyport; /读P3电平flag+; switch(temp) /根据temp分类case 0xf6: /1111 0110 key=0; break;case 0xee: /1110 111

7、0key=1; break;case 0xde: /1101 1110key=2; break;case 0xbe: /1011 1110key=3; break;case 0x7e: /0111 1110key=4; break;default:break;temp=keyport;/读P3电平temp=temp>>3; while(temp != 0x1f) /松键检测(加了这一段松开才给key赋值,不加这句按了就变) temp = keyport;/读P3电平temp=temp>>3;/右移三位 keyport=0xfd; /第2行通低电平(1111 1101)t

8、emp=keyport; /读P3电平temp=temp>>3; /右移三位if(temp!=0x1f) /检测不等说明高5位中有低电平,有键按下 delay10ms(); /去抖延时temp=keyport; /读P3电平temp=temp>>3; /右移三位if(temp!=0x1f) /检测不等说明高5位中有低电平,有键按下temp=keyport; /读P3电平flag+;switch(temp)case 0xf5: /1111 0101key=5;break;case 0xed: /1110 1101key=6;break;case 0xdd: /110111

9、01key=7;break;case 0xbd: /1011 1101key=8;break;case 0x7d: /0111 1101key=9;break;default:break;temp=keyport; /读P3电平temp=temp>>3; /右移三位while(temp!=0x1f) /松键检测(加了这一段松开才给key赋值,不加这句按了就变) temp=keyport; /读P3电平 temp=temp>>3; /右移三位keyport=0xfb; /第3行通低电平(1111 1011)temp=keyport; /读P3电平temp=temp>

10、>3; /右移三位if(temp!=0x1f) /检测不等说明高5位中有低电平,有键按下delay10ms(); /延时消抖,temp=keyport; /读P3电平temp=temp>>3; /右移三位if(temp!=0x1f) /检测不等temp=keyport; /读P3电平flag+;switch(temp)temp=keyport; /读P3电平case 0xf3: /1111 0011key=10;break;case 0xeb: /1110 1011key=11;break;case 0xdb: /1101 1011key=12;break;case 0xbb

11、: /1011 1011key=13;break;case 0x7b: /0111 1011key=14;break;temp=keyport; /读P3电平temp=temp>>3; /右移三位while(temp!=0x1f) /检测不等temp=keyport; /读P3电平temp=temp>>3; /右移三位/*定时器设置函数的定义(无入口参数无返回值)*/void Time1Config()TMOD|= 0x10; /设置定时计数器工作方式1为定时器/*定时器赋初始值,12MHZ下定时*/ TH1 = 0xFE; TL1 = 0x0C;ET1 = 1; /开

12、启定时器1中断EA = 1; /开总中断TR1 = 1; /开启定时器void set(void)while(key=14)/Reset键按下flag=0;while(key=14)/当Reset键按下/*设置十位*/while(flag=0)/*数码管十位闪烁*/if(timer1<1200)P0=table0;shi=0;elseshi=1;/*/matrixscan(); /键盘扫描if(key<=9) /如果是09数字键temp0=key; /保存十位if(key=10) /cancel键按下flag=0;break; /出设置界面if(key>=11) /如果是su

13、re,delete,clear或Resetflag=0; /*设置个位*/while(flag=1|flag>=8) /flag=1时第一次输入个位,flag>=8第2,3,4.输入个位shi=0; /十位的位选P0=tabletemp0; /十位的段选delayxms(10); /延时显示shi=1; /关闭位选/*实现个位闪烁*/if(timer1<1200&&flag<8)P0=table0;ge=0;delayxms(10);ge=1;if(timer1>=1200&&flag<8)ge=1;/*两位都输入后显示十位个

14、位*/if(timer1<1200&&flag>=8)P0=tabletemp1;ge=0;delayxms(10);ge=1;if(timer1>=1200&&flag>=8)P0=tabletemp1;ge=0;delayxms(10);ge=1;/*/matrixscan();if(key<=9&&flag=2) /如果个位第一次按下数字键09temp1=key; /保存个位flag=8;if(key=10) /取消操作键flag=0;break;if(key=11&&flag=2)/如果个位第

15、一次输入的是确定键flag=1;if(key=11&&flag>=8) /如果设置完毕,按下确定键duty0=temp0;duty1=temp1;flag=0;break;if(key = 12)/按下退格键if(flag=2)/如果清除十位key=14;flag=0;if(flag>=8)/如果清除个位flag=1;if(key = 13)/按下清空键flag=0;key=14;if(flag=0) /返回到设置界面重新来过break;void Time1(void) interrupt 3 /3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断TH1 = 0xFE; /重新赋初值TL1 = 0x0C;timer1+; count+;period+;/*产生pwm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论