5个回答
展开全部
/*AT89S52和STC单片机引脚是通用的,程序可以直接移植
晶振:12MHZ
引脚连接方式见下面定义,该程序经过我仔细调试,只要连接上即可直接运行,*/
#include<reg52.H>
#define seg_data P1 //数码管显示数据输出端口
sbit K1 = P3^0; //按键引脚定义
sbit K2 = P3^1;
sbit K3 = P3^2;
sbit bit1 = P2^0; //数码管位选通端口定义
sbit bit2 = P2^1;
sbit bit3 = P2^2;
/*共阳数码管0-9 */
const unsigned char seg[10]=;
unsigned char seg_data1=0,seg_data2=0,seg_data3=0,delaytime=0;
struct boolean_variable //定义布尔型变量,每个变量只占用一个bit RAM
{
char a :1;
char b :1;
char c :1;
char d :1;
char e :1;
char f :1;
}variable1;
/******************************************************************************
定时器初始化
******************************************************************************/
void time0_time1_initialize()
{
TMOD=0X11; //T0模式1,T1模式1 相当于00010001B
ET0=1; //T0开中断
ET1=1; //T1开中断
PT0=1; //T0为高优先级
PT1=0; //T1为低优先级
EA=1; //中断总开关打开
TH1=0XF8; ////T1装入初值,实现2ms定时
TL1=0X30;
TH0=0X3c; //T0装入初值,实现50ms定时
TL0=0Xb0;
TR1=1; //开启T1
}
#define bit1_shanshuo variable1.c
#define bit2_shanshuo variable1.d
#define bit3_shanshuo variable1.e
#define jishu_key variable1.f
/******************************************************************************
动态扫描显示程序
******************************************************************************/
unsigned char judge_segdata=1;
void seg_display()
{
if (jishu_key == 1)
{
if (judge_segdata > 6)
judge_segdata =1;
switch (judge_segdata)
{
case 1: seg_data=seg[seg_data1];bit1 = 1;break;
case 2: seg_data=seg[seg_data1];bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 1;break;
case 4: seg_data=seg[seg_data2];bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 1;break;
case 6: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (jishu_key == 0)
{
if (judge_segdata >200)
judge_segdata =1;
if (bit1_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data1];bit1 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data1];bit1 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 7: seg_data=seg[seg_data2];bit2 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit2_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data2];bit2 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data2];bit2 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit3_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data3];bit3 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data3];bit3 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 5: seg_data=seg[seg_data2];bit2 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 9: seg_data=seg[seg_data2];bit2 = 0;break;
}
}
}
S: judge_segdata++;
}
/******************************************************************************
定时计数器1的中断服务子程序, 用于定时扫描数码管
******************************************************************************/
unsigned char dc1=1;
void time1_interrupt() interrupt 3 using 2
{
TH1=0XF8; //T1重新装入初值
TL1=0X30;
dc1++;
if (dc1 == 100) //200ms到了?数码管计数加1
{
dc1 = 0;
if (jishu_key == 1)
{
seg_data1++;
if (seg_data1 == 10)
{
seg_data1 = 0;
seg_data2++;
}
if (seg_data2 == 10)
{
seg_data2 = 0;
seg_data3++;
}
if (seg_data3 == 10)
seg_data3 = 0;
}
}
seg_display();
}
#define second variable1.a
static unsigned char dc2=0;
/******************************************************************************
定时计数器0的中断服务子程序, 用于定时扫描数码管
******************************************************************************/
void time0_interrupt() interrupt 1 using 3
{
TH0=0X3c; //T0装入初值,继续50ms定时
TL0=0Xb0;
dc2++; //50ms计数变量加1
if (dc2 == delaytime) //2s到了?
{
second = 1; //布尔型变量second置位
dc2=0;
}
}
/******************************************************************************
延时程序
******************************************************************************/
void delay(int time0)
{
unsigned char i;
for(;time0 >= 0;time0--)
{
for(i=0;i<120;i++);
}
}
/******************************************************************************
按键执行程序
******************************************************************************/
#define timedelay1 50
void key_function()
{
unsigned char j=0;
bit1_shanshuo = 1; //数码管第一位闪烁
delay(500); //延时500ms
delaytime = 100 ; //定时器0 定时100*50ms = 5000ms=5s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //开启T0,定时5s
while(!second) //如果5秒内没有按键,则按键设置程序返回
{
if (K1 == 0)
{
dc2 = 0; //清零T0十秒计数变量
j++;
}
if (j > 3)
j=1;
switch (j)
{
case 1:bit1_shanshuo = 1;bit2_shanshuo = 0;bit3_shanshuo = 0;break;
case 2:bit1_shanshuo = 0;bit2_shanshuo = 1;bit3_shanshuo = 0;break;
case 3:bit1_shanshuo = 0;bit2_shanshuo = 0;bit3_shanshuo = 1;break;
default: break;
}
if (K2 == 0)
{
dc2 = 0; //清零T0十秒计数变量
switch (j)
{
case 1: seg_data1++;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2++;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3++;if (seg_data3>9) seg_data3=0;break;
}
}
if (K3 == 0)
{
dc2 = 0; //清零T0十秒计数变量
switch (j)
{
case 1: seg_data1--;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2--;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3--;if (seg_data3>9) seg_data3=0;break;
}
}
delay(400); //延时400ms
}
jishu_key = 1; //数码管继续计数
TR0 = 0;
}
/******************************************************************************
K1键扫描程序
******************************************************************************/
void key_press()
{
if (K1 == 0) //key1按下?
{
jishu_key = 0; //数码管停止计数
delaytime = 40; //定时器1定时40*50ms = 2s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //T0开始定时
delay(10); //消除键盘抖动
while (!K1) //等待
{
if (second == 1)//两秒计数变量为1?
{
TR0 = 0; //关闭T0
second = 0;
key_function();
return;
}
}
TR0 = 0;
jishu_key=1;
}
}
void main()
{
K1 = 1;
K2 = 1;
K3 = 1;
second = 0;
jishu_key = 1;
bit1_shanshuo =0;
bit2_shanshuo =0;
bit3_shanshuo =0;
time0_time1_initialize();
while(1) //不断执行
key_press();
}
花了我一整个上午的时间,再给我70分
晶振:12MHZ
引脚连接方式见下面定义,该程序经过我仔细调试,只要连接上即可直接运行,*/
#include<reg52.H>
#define seg_data P1 //数码管显示数据输出端口
sbit K1 = P3^0; //按键引脚定义
sbit K2 = P3^1;
sbit K3 = P3^2;
sbit bit1 = P2^0; //数码管位选通端口定义
sbit bit2 = P2^1;
sbit bit3 = P2^2;
/*共阳数码管0-9 */
const unsigned char seg[10]=;
unsigned char seg_data1=0,seg_data2=0,seg_data3=0,delaytime=0;
struct boolean_variable //定义布尔型变量,每个变量只占用一个bit RAM
{
char a :1;
char b :1;
char c :1;
char d :1;
char e :1;
char f :1;
}variable1;
/******************************************************************************
定时器初始化
******************************************************************************/
void time0_time1_initialize()
{
TMOD=0X11; //T0模式1,T1模式1 相当于00010001B
ET0=1; //T0开中断
ET1=1; //T1开中断
PT0=1; //T0为高优先级
PT1=0; //T1为低优先级
EA=1; //中断总开关打开
TH1=0XF8; ////T1装入初值,实现2ms定时
TL1=0X30;
TH0=0X3c; //T0装入初值,实现50ms定时
TL0=0Xb0;
TR1=1; //开启T1
}
#define bit1_shanshuo variable1.c
#define bit2_shanshuo variable1.d
#define bit3_shanshuo variable1.e
#define jishu_key variable1.f
/******************************************************************************
动态扫描显示程序
******************************************************************************/
unsigned char judge_segdata=1;
void seg_display()
{
if (jishu_key == 1)
{
if (judge_segdata > 6)
judge_segdata =1;
switch (judge_segdata)
{
case 1: seg_data=seg[seg_data1];bit1 = 1;break;
case 2: seg_data=seg[seg_data1];bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 1;break;
case 4: seg_data=seg[seg_data2];bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 1;break;
case 6: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (jishu_key == 0)
{
if (judge_segdata >200)
judge_segdata =1;
if (bit1_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data1];bit1 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data1];bit1 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 7: seg_data=seg[seg_data2];bit2 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit2_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data2];bit2 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data2];bit2 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit3_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data3];bit3 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data3];bit3 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 5: seg_data=seg[seg_data2];bit2 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 9: seg_data=seg[seg_data2];bit2 = 0;break;
}
}
}
S: judge_segdata++;
}
/******************************************************************************
定时计数器1的中断服务子程序, 用于定时扫描数码管
******************************************************************************/
unsigned char dc1=1;
void time1_interrupt() interrupt 3 using 2
{
TH1=0XF8; //T1重新装入初值
TL1=0X30;
dc1++;
if (dc1 == 100) //200ms到了?数码管计数加1
{
dc1 = 0;
if (jishu_key == 1)
{
seg_data1++;
if (seg_data1 == 10)
{
seg_data1 = 0;
seg_data2++;
}
if (seg_data2 == 10)
{
seg_data2 = 0;
seg_data3++;
}
if (seg_data3 == 10)
seg_data3 = 0;
}
}
seg_display();
}
#define second variable1.a
static unsigned char dc2=0;
/******************************************************************************
定时计数器0的中断服务子程序, 用于定时扫描数码管
******************************************************************************/
void time0_interrupt() interrupt 1 using 3
{
TH0=0X3c; //T0装入初值,继续50ms定时
TL0=0Xb0;
dc2++; //50ms计数变量加1
if (dc2 == delaytime) //2s到了?
{
second = 1; //布尔型变量second置位
dc2=0;
}
}
/******************************************************************************
延时程序
******************************************************************************/
void delay(int time0)
{
unsigned char i;
for(;time0 >= 0;time0--)
{
for(i=0;i<120;i++);
}
}
/******************************************************************************
按键执行程序
******************************************************************************/
#define timedelay1 50
void key_function()
{
unsigned char j=0;
bit1_shanshuo = 1; //数码管第一位闪烁
delay(500); //延时500ms
delaytime = 100 ; //定时器0 定时100*50ms = 5000ms=5s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //开启T0,定时5s
while(!second) //如果5秒内没有按键,则按键设置程序返回
{
if (K1 == 0)
{
dc2 = 0; //清零T0十秒计数变量
j++;
}
if (j > 3)
j=1;
switch (j)
{
case 1:bit1_shanshuo = 1;bit2_shanshuo = 0;bit3_shanshuo = 0;break;
case 2:bit1_shanshuo = 0;bit2_shanshuo = 1;bit3_shanshuo = 0;break;
case 3:bit1_shanshuo = 0;bit2_shanshuo = 0;bit3_shanshuo = 1;break;
default: break;
}
if (K2 == 0)
{
dc2 = 0; //清零T0十秒计数变量
switch (j)
{
case 1: seg_data1++;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2++;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3++;if (seg_data3>9) seg_data3=0;break;
}
}
if (K3 == 0)
{
dc2 = 0; //清零T0十秒计数变量
switch (j)
{
case 1: seg_data1--;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2--;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3--;if (seg_data3>9) seg_data3=0;break;
}
}
delay(400); //延时400ms
}
jishu_key = 1; //数码管继续计数
TR0 = 0;
}
/******************************************************************************
K1键扫描程序
******************************************************************************/
void key_press()
{
if (K1 == 0) //key1按下?
{
jishu_key = 0; //数码管停止计数
delaytime = 40; //定时器1定时40*50ms = 2s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //T0开始定时
delay(10); //消除键盘抖动
while (!K1) //等待
{
if (second == 1)//两秒计数变量为1?
{
TR0 = 0; //关闭T0
second = 0;
key_function();
return;
}
}
TR0 = 0;
jishu_key=1;
}
}
void main()
{
K1 = 1;
K2 = 1;
K3 = 1;
second = 0;
jishu_key = 1;
bit1_shanshuo =0;
bit2_shanshuo =0;
bit3_shanshuo =0;
time0_time1_initialize();
while(1) //不断执行
key_press();
}
花了我一整个上午的时间,再给我70分
上海巴鲁图工程机械科技有限公司_
2022-05-15 广告
2022-05-15 广告
光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。光电编码器每转输出60(我们用老板没有说)个脉冲,五线制。其中两根为电源线,三根为脉冲线(A相、B相、Z)。电源的工作电压为 (+5~+24V)直流电源。光...
点击进入详情页
本回答由上海巴鲁图工程机械科技有限公司_提供
展开全部
STC89c52有三个定时器
第三个与前两个不太一样,它有自动重载的功能,不用程序里重新装初值,另外寄存器的名称也很不一样。
设置方法
1:选择计数模式 TMOD = 0xxx
2:中断是否允许 ETX=x
3:装入初值 THX = 0XXX
4:计数开始 IRX=X
第三个与前两个不太一样,它有自动重载的功能,不用程序里重新装初值,另外寄存器的名称也很不一样。
设置方法
1:选择计数模式 TMOD = 0xxx
2:中断是否允许 ETX=x
3:装入初值 THX = 0XXX
4:计数开始 IRX=X
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//初始化主函数
void init_main()
{
// RCAP2H=(0xFFFF-50000)/256;
// RCAP2L=(0xFFFF-50000)%256; //24MHz晶振下定时25ms,自动重装
TH2=RCAP2H;
TL2=RCAP2L; //定时器2赋初值
T2CON=0; //配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置
T2MOD=0; //配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置
IE=0xA0; //1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1;
TR2=1; //启动定时器2
}
void timer2() interrupt 5
{
//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
TF2=0;
void init_main()
{
// RCAP2H=(0xFFFF-50000)/256;
// RCAP2L=(0xFFFF-50000)%256; //24MHz晶振下定时25ms,自动重装
TH2=RCAP2H;
TL2=RCAP2L; //定时器2赋初值
T2CON=0; //配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置
T2MOD=0; //配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置
IE=0xA0; //1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1;
TR2=1; //启动定时器2
}
void timer2() interrupt 5
{
//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
TF2=0;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^0; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
TIM2Inital();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{
TF2=0;
LED=~LED; //指示灯反相
}
sbit LED=P1^0; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
TIM2Inital();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{
TF2=0;
LED=~LED; //指示灯反相
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
RCAP2H=0xff;
RCAP2L=0x20;
ET2=1;
三句话
RCAP2L=0x20;
ET2=1;
三句话
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询