- 打卡等级:偶尔看看II
- 打卡总天数:24
- 最近打卡:2025-06-17 11:28:34
中级会员
- 积分
- 327
|
发表于 2025-5-28 15:49:47
|
显示全部楼层
交作业:8G1K17A,其实芯片低于3V也不能工作,也没必要ADC,重点在于锁存,不用这个功能保护会打嗝,重启是重点(锁存检修)。用6脚锁存芯片也可以,那又要占空间加器件了,利用原来芯片让它多干点活更好(IO要配下拉电阻)。
#include "STC8G.H"
#include <intrins.h> // 包含_nop_()函数
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200UL // 内部时钟频率11.0592MHz
bit output_flag = 0; // 锁定标志位
sbit pwm = P3^3; // 输出引脚
sbit input_pin = P3^0; // 输入引脚定义
unsigned char code x[]={ 255,240,226,211,196,182,168,154,141,128,115,103,
91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,0,1,3,6,
10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,
154,168,182,196,211,226,240
};
unsigned int i,j;
void delay_ms(unsigned int ms) {
while (ms--) {
unsigned int i = 1000;
while (i--) _nop_(); // 约1ms延时
}
}
void init()
{
// 配置P5.4为推挽输出,初始低电平
P5M1 &= ~(1 << 4); // P5M1.4=0
P5M0 |= (1 << 4); // P5M0.4=1 → 推挽模式
P54 = 0; // 初始输出低电平
// 配置P3.0为高阻输入
P3M1 |= (1 << 0); // P3M1.0=1
P3M0 &= ~(1 << 0); // P3M0.0=0 → 高阻输入
// 配置P3.3相关寄存器
P3M1 &= ~(1 << 3); // P3M1.3=0
P3M0 |= (1 << 3); // P3M0.3=1 → 推挽输出
TMOD=0x02; // 定时器0模式2(自动重装载)
TH0=(255-x);// 初始值
TL0=(255-x);// 初始值
EA=1; // 开总中断
ET0=1; // 开定时器0中断
TR0=1; // 启动定时器0
pwm = 1; // PWM输出初始高电平
}
void main() //主程序
{
init(); // 初始化硬件
while(1) {
// 去抖动检测:连续多次检测高电平
if (!output_flag && input_pin) { // P3.0为高
delay_ms(10); // 延时去抖动
if (input_pin) { // 再次确认高电平
P54 = 1; // 输出高电平
output_flag = 1; // 锁定状态
}
}
}
}
void timer0()interrupt 1 // 定时器0中断服务函数
{
TH0=(255-x);
TL0=(255-x);
j++;
if(j==37) // 改变频率
{ |
|