logo资料库

51单片机转速表实现.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
#include //头文件 #include//访问绝对地址 #include #include//输入输出流 #define COM8279 XBYTE[0X5FFF] //8279 控制命令地址 #define DATA8279 XBYTE[0X5EFF] //8279 数据地址 #define uchar unsigned char //宏定义 #define uint unsigned int //宏定义 uchar 0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳数码管代码 0-F uint LED[]={0,0,0,0,0,0};//六个数码管的初值 uint Count=0; //定时器中断的次数 uint Key_State,T_State; //定义键的状态和定时器的状态 int second=0; //定时器 1 在 1S 内计数的次数 code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, void delay(uint ms) //延时子程序 { uint i; while(ms--) for(i=0;i<120;i++); } void Display() //显示子程序 { COM8279=0x92;//设置写显示命令,8279 命令字 LED[0]=second%10; LED[1]=second%100/10; LED[2]=second%1000/100; LED[3]=second%10000/1000; LED[4]=second%100000/10000; LED[5]=second%1000000/100000; for(i=0;i<6;i++) DATA8279=table[LED[i]];//显示 display 数组 { } } void Scan_Key() //键盘扫描子程序 { COM8279=0x40;//读键盘命令(AI=0 仅读一个单元)
keyboard=DATA8279; if(keyboard==0) //启动功能键被按下 { delay(10); //去抖 Key_State==1; TR0=1; //开启定时器/计数器 0 TR1=1; //开启定时器/计数器 1 } else if(keyboard==1) //停止键被按下 { delay(10); //延时去抖 Key_State==2; TR0=0; //关闭定时器/计数器 0 TR1=0; //关闭定时器/计数器 1 } else if(keyboard==2) //复位键被按下 { delay(10); //延时去抖 Key_State==3; TR0=0; //关闭定时器/计数器 0 TR1=0; //关闭定时器/计数器 1 TH1=0; TL1=0; } //继续计数 else { TR0=1; TR1=1; } } void main() //主函数 { COM8279=0xDC;//清除显示 RAM 和 FIFO 命令字 COM8279=0x34;//程序时钟编程命令 (11000)24 分频 COM8279=0x00;//键盘方式设置(8*8 字符显示左边输入,编码方式扫描键盘,双键 互锁) COM8279=0x92;//设置写显示命令(AI=1 每次写入后地址自动加 1;显示 RAM 一 个单元地址 0010) for(i=0;i<6;i++) { DATA8279=table[LED[i]];//数据地址,数码管置零 }
TMOD=0x51; //定时器 1 和 0 都工作在方式 1 TH0=(65536-50000)/256; //定时器 0 装入初值 TL0=(65536-50000)%256; TH1=0; //定时器 1 装入初值 TL1=0; EA=1; //开放总中断 ET0=1; //开放定时器/计数器 0 中断 ET1=1; //开放定时器/计数器 1 中断 TR0=0; //关闭定时器/计数器 0 TR1=0; //关闭定时器/计数器 1 while(1) { Scan_Key(); //调用键盘扫描子程序 if(T_State==1&&Key_State==1)//键状态为 1 且定时器状态为 1 { T_State=0; //把定时器状态清 0 second=(TH1*256+TL1)*60;//计算转速 TH1=0; //清计数器 TL1=0; } if(Key_State==1|Key_State==2)//键状态为 1 或 2 Display(); //调用显示子程序 if(Key_State==3) //键状态为 3 { for(i=0;i<6;i++) DATA8279=table[0];//显示 display 数组 { } } } void T0timer() interrupt 1 //定时器 0 用于定时 { TH0=(65536-50000)/256; //重装初值 TL0=(65536-50000)%256; Count++; //计数值加 1 if(Count>=20) //计数值到了 20 次,即 1S 就清 0, 并把定时器状态设为 1 { Count=0; T_State=1; } } void T1timer() interrupt 3 //定时器 1 用于计数 {
TH1=0; //重装初值 TL1=0; }
分享到:
收藏