hadv
发表于 2025-4-20 08:30:54
多看看别人的错误,能使自己进步得更快!
patch1582
发表于 2025-5-12 23:00:06
这个好
怕热的大叔
发表于 2025-5-22 14:17:33
冲哥你好,请教个问题,AI8051 的视频 十三课的作业,按下矩阵键盘时 LED0亮 ,外部中断时 关闭LED0,LED0 由P00控制,P00在 按键扫描时候又用作矩阵键盘的列 ,既要矩阵按键扫描 又要控制LED灯 键盘扫描了后好像控制不了灯了,没什么思路 ,希望指导下给点思路,谢了。
zgskfolt
发表于 2025-5-29 14:59:53
#include <STC32G.H>
#include "DELAY.H"
#define BEEP P54//定义BEEP,将BEEP替换为P54
bit Run_start=0;//0表示关机,1表示开机
bit Run_working=0;//表示是否正在工作
unsigned int LEDnum=0;
void main()
{
EAXFR=1; //扩展寄存器(XFR)访问使能
CKCON=0x00; //提高访问XRAM速度
WTST=0x00; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
P4M0 = 0x00; P4M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P40=0;
while(1)
{
//------------------按下P32键,进行开机启动
if(P32==0)
{
delay(20);
while(P32==0);
delay(20);
if(Run_start==0) //关机状态下
{
Run_start=1; //将模式切换为开机
BEEP=0;
delay(10);
BEEP=1;
P6=0x00;
delay(200);
P6=0xff;
}
else
{
Run_start=0; //模式切换为关机
BEEP=0;
delay(10);
BEEP=1;
P6=0xff;
LEDnum=0; //模式清0
Run_working=0; //工作状态清0
}
}
//-----------------------------按下P33键,进行模式选择
if(P33==0) //在开机模式下才可执行下面操作
{
delay(20);
while(P33==0);
delay(20);
if(Run_start==1) //在开机模式下才可执行下面操作
{
if(Run_working==0)//在未启动下可调试
{
BEEP=0;
delay(10);
BEEP=1;
if(LEDnum>=8)
{
LEDnum=0;
}
LEDnum++; //模式灯调节切换
P6=~(0x01<<LEDnum-1);
}
}
}
//--------------------按下P34键,启动功能(LED灯持续闪烁且不可执行其他操作)
if(P34==0)
{
delay(20);
while(P34==0);
delay(20);
if(LEDnum>0) //有选择模式下方可执行
{
BEEP=0;
delay(10);
BEEP=1;
}
Run_working=~Run_working; //不启动与启动交替变换
}
if(Run_working==1)
{
P6=0xff;
delay(500);
P6=~(0x01<<LEDnum-1);
delay(500);
}
else
{
P6=~(0x01<<LEDnum-1);
}
}
}
我这个在P32没按下的时候,先去按P34键,再按P32键启动程序,之后P33键就没反应。长按P33也不行,冲哥帮忙看一下
曹会杰
发表于 2025-6-17 21:07:36
冲哥好,我有个ADC数模转换的问题请教一下,我是一边看冲哥的视频一边根据手册上的示例程序,虽然把ADC值读了出来,但是读出来的ADC值偏差太大,不知道是什么原因,我用的芯片是stc15F2k60s2芯片,用面包板搭建的电路,P10口通过1K电阻接到按键上,按键另一端再接到四个10K电阻串联在5V电源和地之间的电路上,在1/2电源的位置读出来的值应该是512,我的是460左右,读出来的电压是2.25V,不知道那是有问题了。
曹会杰
发表于 2025-6-17 21:14:08
曹会杰 发表于 2025-6-17 21:07
冲哥好,我有个ADC数模转换的问题请教一下,我是一边看冲哥的视频一边根据手册上的示例程序,虽然把ADC值读 ...
测的电源电压是4.96v,不知道是程序有问题还是电路上有问题,还请指教。感谢!感谢!
曹会杰
发表于 2025-6-17 21:17:22
曹会杰 发表于 2025-6-17 21:14
测的电源电压是4.96v,不知道是程序有问题还是电路上有问题,还请指教。感谢!感谢! ...
这里把程序贴出来帮忙分析分析。
void Delay1us(unsigned char Xus) //@11.0592MHz
{
while(Xus--)
{
_nop_();
_nop_();
_nop_();
}
}
/***---ADC初始化函数---***/
void ADC_Init()
{
P1M0 = 0x00; //设置P10,P11为高阻输入
P1M1 = 0x03;
P1ASF = 0xFF; //设置P1口为AD使用
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;//ADC_CONTR,ADC控制寄存器不可位寻址
Delay1us(2);
}
/***---ADC读取函数---***/
unsigned int ADC_Read(unsigned char ch)
{
unsigned int Adc_Value;
ADC_CONTR = ADC_POWER|ADC_START|ADC_SPEEDLL| ch;
Delay1us(5);
while(!(ADC_CONTR&ADC_FLAG))
Adc_Value = ADC_RES << 2 | ADC_RESL;
ADC_CONTR &= ~ADC_FLAG;
Delay1us(5);
return Adc_Value;
}
/***---ADC电压转换函数---***/
unsigned int ShowResult(int num)
{
return (num*5.0/1024)*1000;
}
/***---ADC温度转换函数---***/
int ADC_Temp(unsigned int adc)
{
unsigned char i;
float temp;
if(adc>ADC_table)
return -32768;
else if(adc<ADC_table)
return 32767;
else
{
for(i=0;i<190;i++)
{
if(adc==ADC_table)
return (i-40)*10;
else if(adc<ADC_table)
{
}
else
{
i = i-1;
temp = ADC_table-adc;
temp = temp*10/(ADC_table-ADC_table);
temp += (i-40)*10;
return temp;
}
}
}
}
Tuier
发表于 2025-6-18 10:43:16
冲哥你好,看了你的"定时器周期性调度任务"视频,想请教一下,几个LED灯闪烁函数可不可以不用状态变量State1/State2/State3?直接用端口取反?像这样:
void LED0_Blink(void)
{
// State1 = !State1;
// P00 = State1;
P00=!P00;
}
void LED1_Blink(void)
{
// State2 = !State2;
// P01 = State2;
P01=!P01;
}
void LED2_Blink(void)
{
// State3 = !State3;
// P02 = State3;
P02=!P02;
}
从效果上看是一样的,但请教冲哥,用了状态变量与不用有什么区别呢?
曹会杰
发表于 2025-6-20 19:15:41
教学视频已经在学,老师辛苦!
胡冰2025
发表于 2025-6-22 16:29:21
今天才看到这个好地方,加油!