#define uchar unsigned char
uchar dat;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
main()
{
bit flag=0;
while(1)
{
if(key1==0)
{
while(key1==0);
flag=~flag;
}
if(key2==0)
{
while(key2==0);
if(flag)dat++;
}
if(key3==0)
{
while(key3==0);
if(flag(dat--);
}
P0=dat;
}
}遥控器秒表
配置并启动T0,使用T0中段来进行数码管,按键、按键扫描和秒表的计时。使用第四行作为独立按键来使用,进行秒表的启停和复位,Esc键代表复位调用复位函数,回车键代表启停调用启停函数。按键驱动函数来检测按键动作,调度相应动作函数。动作函数为启停和复位。按键扫描函数,需在定时中断中调用,并且进行按键消抖,将按键动作赋值给数组使驱动函数调用动作函数。数码管动态扫描刷新函数需在定时中断中调用。秒表计数函数是每隔10ms调用一次进行秒表计数累加,能保留小数点后两位,当处于运行状态时才会递增计数值即此时的启停函数的秒表运行标志变量为1。秒表计数显示函数将小数部分转换到低2位,整数部分转换到高4位,并且高位的0显示为空字符同时显示小数点。数码管动态扫描函数,在中断时调用,将缓冲区数据送到P0口,显示消隐。使用串口控制秒表的启停、复位,需要增加串口配置函数,设置通信波特率为9600,使用T1定时计数器。UART 中断服务函数在电脑通过串口调试助手发送指令时调用动作函数。P为暂停,E为启动调用启停函数,R为复位调用复位函数。其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。\x0d\当按一下键,再启动,TR0=1,就开始计时了。\x0d\再 按一下键,就停止,TR0=0,就不计时了。\x0d\程序好写,先 定义一个按键\x0d\sbit key=P1^1; //具体是哪个 键,你自己改\x0d\主程序中,判断按键和启动/停止\x0d\if(key==0)\x0d\{\x0d\delay(); //具体延时时间自己定\x0d\if(key==0)\x0d\{\x0d\TR0=!TR0; //每按一次,取反 一次\x0d\while(key==0);\x0d\}\x0d\}
程序清单如下:
#include < reg51h >// 51单片机头文件
#define uchar unsigned char // 宏定义,用uchar替代无符号字符型
#define uint unsigned int // 宏定义,用uint 替代无符号整数型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定义数码管的段码 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延时N毫秒
void DelayNms( uint N ) // 利用x、y作简单的自减运算,消耗单片机指令周期,达到延时的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//数码管显示 // 显示方式为动态扫描,视觉暂留原理
void Display( uchar Num ) // p指向Main函数中的数组ShowNum的首地址
{
P0 = DataChar[ Num ]; // 向P0赋段码值
DelayNms(2); // 短暂的延时
P0 = 0x00; // 让数码管熄灭,否则会造成数字重叠
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9) 0 : Count;
}
while( !Key );
}
Display( Count );
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)