14
61
481
中级会员
/*********************************************************/ #define MAIN_Fosc 11059200L //定义主时钟 #include "STC8Gxxx.h" /************* 功能说明 ************* 整体布局 功能 管脚 用途 输入输出 类型 PXM1 PXM0 P10 PIN19 传感器输入 输入 高阻 1 0 P11 PIN20 seg_a 输出 开漏输出 1 1 P12 PIN1 seg_e 输出 开漏输出 1 1 P13 PIN2 seg_f 输出 开漏输出 1 1 P14 PIN3 seg_b 输出 开漏输出 1 1 P15 PIN4 seg_d 输出 开漏输出 1 1 P16 PIN5 seg_c 输出 开漏输出 1 1 P17 PIN6 seg_g 输出 开漏输出 1 1 P0M1 = 11111110B 0xff P0M0 = 11111110B 0xfe 功能 管脚 用途 输入输出 类型 PXM1 PXM0 P30 PIN11 RX 不分配 0 0 P31 PIN12 TX 不分配 0 0 P32 PIN13 NO2输入 输入 准双口 0 0 设置为高电平 P33 PIN14 NO1输出 输出 推挽输出 0 1 缺省高电平。 P34 PIN15 NO2输出 输出 推挽输出 0 1 缺省高电平。 P35 PIN16 数码管共阳G1 输出 推挽输出 0 1 P36 PIN17 数码管共阳G2 输出 推挽输出 0 1 P37 PIN18 红外管输出 输出 开漏输出 1 1 0发光,1灭光 P3M1 = 1000 0000B 0x80 P3M0 = 1111 1000B 0xf8 功能 管脚 用途 输入输出 类型 PXM1 PXM0 P54 PIN7 seg_dp 输出 开漏输出 1 1 P55 PIN9 NO1输入 输入 准双口 0 0 设置为高电平 P5M0 = 0001 0000B 0x10 P5M1 = 0001 0000B 0x10 ******************************************/ /************* 本地常量声明 **************/ #define timeout_ms 5000 #define NO1_IN_ON (P55 == 1) #define NO2_IN_ON (P32 == 1) #define NO1_OPEN (P33 = 0) #define NO1_CLOSE (P33 = 1) #define NO2_OPEN (P34 = 0) #define NO2_CLOSE (P34 = 1) #define IR_ON (P37 = 0) #define IR_OFF (P37 = 1) #define G1_ON (P35 = 1) #define G1_OFF (P35 = 0) #define G2_ON (P36 = 1) #define G2_OFF (P36 = 0) #define SENSOR_ON (P10 == 0) /************* 本地变量声明 **************/ //用一个变量记录时间 unsigned int time_count_ms = 0; /************* 本地函数声明 **************/ /**************** 外部函数声明和外部变量声明 *****************/ /**********************************************/ void Delay100ms(void) //@11.0592MHz { unsigned char data i, j, k; _nop_(); _nop_(); i = 5; j = 52; k = 195; do { do { while (--k); } while (--j); } while (--i); } //初始化T0 void time_init_T0(void) { AUXR &= 0x7f; //定时器时钟12T模式 TMOD &= 0xf0; //设置定时器模式 } //开启T0 50ms计时,并且开启中断 void time_start_T0(void) { TL0 = 0x00; //设置定时器初始值 TH0 = 0x4c; //设置定时器初始值 TF0 = 0; //清除TF位 ET0 = 1; //允许T0中断 time_count_ms = 0; TR0 = 1; //定时器0开始计数 } //关闭T0 50ms计时,并且开启中断 void time_stop_T0(void) { ET0 = 1; //禁止T0中断 TF0 = 0; //清除TF位 TR0 = 0; //禁止器0开始计数 TL0 = 0x00; //设置定时器初始值 TH0 = 0x4c; //设置定时器初始值 time_count_ms = 0; } //定时器0中断函数 void T0_ISR(void) interrupt 1 { TF0 = 0; //清除TF位 time_count_ms += 50; } void main(void) { int time100ms = 0; char statu_g1 = 0; char statu_g2 = 0; P_SW2 |= 0x80; //允许访问XSFR(扩展特殊功能寄存器) //设置管脚模式 P1M1 = 0xff; P1M0 = 0xfe; P3M1 = 0x80; P3M0 = 0xf8; P5M1 = 0x10; P5M0 = 0x10; //P32, P55设置上拉电阻 P32 = 1; P55 = 1; //关闭开关 NO1_CLOSE; NO2_CLOSE; //关闭IR IR_OFF; //关闭G1,G2 G1_OFF; G2_OFF; //全部打开数码管的seg P1 &= 0x01; P54 = 0; G1_ON; G2_ON; for(time100ms = 10; time100ms > 0; time100ms--) { Delay100ms(); } G1_OFF; G2_OFF; //初始化计数器 time_init_T0(); //打开全局中断 EA = 1; while (1) { /* for(time100ms = 10; time100ms > 0; time100ms--) { Delay100ms(); } P54 = 1; P1 = P1 | 0xfe; for(time100ms = 10; time100ms > 0; time100ms--) { Delay100ms(); } P54 = 0; P1 = P1 & 0x01; */ if(NO1_IN_ON)// NO1 按下按键高电平 { //如果G1, G2处于关闭状态 if (statu_g2 == 0) { G1_ON;//点亮1号数码管 statu_g1 = 1; //改g1状态 IR_ON; //打开红外 //启动定时器 time_stop_T0(); time_start_T0(); } } if(NO2_IN_ON)// NO2 按下按键高电平 { //如果G1处于关闭状态 if (statu_g1 == 0) { G2_ON;//点亮2号数码管 statu_g2 = 1; IR_ON; //打开红外 //启动定时器 time_stop_T0(); time_start_T0(); } } if(SENSOR_ON || (time_count_ms > timeout_ms)) { //关闭计数器 time_stop_T0(); //关闭红外 IR_OFF; //关闭数码管 G1_OFF; G2_OFF; //改状态 statu_g1 = 0; statu_g2 = 0; } } } /**********************************************/复制代码
使用道具 举报 送花
1
38
1496
金牌会员
2
31
1351
10
214
1535
15
154
428
19
59
796
高级会员
0
72
299
hl12*** 发表于 2023-12-17 20:48 掌握核心技术就是爽,星期四客户有个机器坏了,供应商说零件下周三才能到,客户则要星期一修好,最后修修改 ...
5
32
1269
hl12*** 发表于 2023-11-12 21:37 看视频和站内的资料,整个流程应该是 1. keil写代码,编译出hex文件。 2. 用stc-isp通过TTL线连接STC8G1K08 ...
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-7 14:28 , Processed in 0.155461 second(s), 124 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.