数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2230|回复: 27

[C51] 新手小白求助论坛会写单片机程序的大神帮帮忙。谢谢。

[复制链接]
发表于 2023-7-6 21:09:51 来自手机浏览器 | 显示全部楼层 |阅读模式
就是按照这个图纸写一段代码,单片机8脚高电平时,1脚延迟3秒输出一个时长1分钟的低电平。8脚低电平时3脚延迟3秒输出一个时长1秒钟的低电平。拜托各位大神了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2023-7-6 21:53:38 来自手机浏览器 | 显示全部楼层
好多年不玩了,帮顶
回复 支持 反对

使用道具 举报

发表于 2023-7-6 22:00:30 | 显示全部楼层
去学一下单片机,第一课,点亮一个led灯
学会了,就会写这个程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 22:43:14 来自手机浏览器 | 显示全部楼层
1006ab1006 发表于 2023-7-6 22:00
去学一下单片机,第一课,点亮一个led灯
学会了,就会写这个程序

我还真看视频了,没看会,上年纪了脑子不太够用了
回复 支持 反对

使用道具 举报

发表于 2023-7-6 23:09:16 | 显示全部楼层
kbh 发表于 2023-7-6 22:43
我还真看视频了,没看会,上年纪了脑子不太够用了

找chatgpt帮你写就好啦
回复 支持 反对

使用道具 举报

发表于 2023-7-7 01:25:08 | 显示全部楼层
本帖最后由 bg4rff 于 2023-7-7 08:14 编辑

bit FALG;
unsigned int t10ms;
//中断服务程序
void Timer0_Isr(void) interrupt 1
{
        t10ms++;
        if(FLAG)
        {
                if(t10ms==300)P34=0;
                if(t10ms==6300)
                        {
                        P34=1;
                        TR0=0;
                        }
        }
        else
        (
                if(t10ms==300)P35=0;
                if(t10ms==400)
                        {
                        P35=1;
                        TR0=0;
                        }       
        )
}

void Timer0_Init(void)                //10毫秒@6.000MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xA0;                                //设置定时初始值
        TH0 = 0x15;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        t10ms=0;
}


//中断服务程序
void exint1() interrupt 2       //INT1中断入口
{
        Timer0_Init();
        FLAG = INT1;
}

main(void)
{
    P3M0 = 0x30;
        P3M1 = 0x38;
        P33 =         1;
        P34        =        1;
        P35        =        1;
    IT1 = 0;                    //设置INT1的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
    EX1 = 1;                    //使能INT1中断
//        Timer0_Init();
    EA = 1;
        while(1)
        {
             PCON = 0x02;            //MCU进入掉电模式
        _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
        _nop_();
        }

}

打赏

参与人数 1家元 +60 收起 理由
kbh + 60 熱心助人

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-7 07:06:26 | 显示全部楼层
8脚要么高电平,要么就是低电平,平时是高电平,3脚要怎样的情况?
我认为这样的描述会理恰当:当8脚从高电平变为低电平时(下降沿),-------;当8脚从低电平变为高电平时(上升沿),----
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 08:22:57 | 显示全部楼层
bg4rff 发表于 2023-7-7 01:25
bit FALG;
unsigned int t10ms;
//中断服务程序

这个似乎不完整啊 开头少了点啥
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 08:26:40 | 显示全部楼层
lmn2005 发表于 2023-7-7 07:06
8脚要么高电平,要么就是低电平,平时是高电平,3脚要怎样的情况?
我认为这样的描述会理恰当:当8脚从高电 ...

我的意思是1,3脚只要不是低电平时都是高电平啊,难道我表达的不清楚吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 08:30:04 | 显示全部楼层
bg4rff 发表于 2023-7-7 01:25
bit FALG;
unsigned int t10ms;
//中断服务程序

就比如这个头上还有一些脚定义啥的 麻烦您帮忙写个完整的,我这个真的不会弄。谢谢啦
/********************************************************************
日    期:2022/05/22
功    能: 简单按键识别,按键控制灯亮或者灭          芯片型号STC15F104W          
编    写:劲松电脑通讯         www.jvbaopeng.com
*********************************************************************/
#include <stc15.h>                //引入库文件,这个直接下载器里复制保存为stc15.h
#define CPU_Fosc 12000000uL    //定义主时钟
/********************************************************************
* 知识补缺:
sbit在C语言里是编译器里面的关键字,sbit是keil c51中的关键字。
sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit。sbit更像是类型定义,不像是变量定义。sbit: 指示说明性说明。
bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。
bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。*//*
                            I/O定义
*********************************************************************/
sbit LED1=P3^3;         //定义单片机P3口的第3位 (即P3.3)//为输出          这是8脚,配合开发板图玩玩,接的灯电路
sbit key1=P3^2;         //定义单片机P3口的第2位 (即P3.2)//为输入           这里是7脚
//========================================================================
// 函数: void  delayms(unsigned int ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~65535ms. 自动适应主时钟.
// 返回: none.
//========================================================================
void  delayms(unsigned int ms)
{
unsigned int i;
do{
    i = CPU_Fosc/13000;
    while(--i);   
   }
        while(--ms);
}
/***************************主函数*****************************************/
void main()
{
        LED1 = 0x00;   //芯片默认都有电平输出,先把这个脚电压置低,不然加电就灯半闪烁
        while(1)
        {
                if(key1==0)
                {
                        delayms(3000);    //这里判断按键时长,比如我这里需要按3秒这个按键才会起作用
                        if(key1==0)
                        {
                                while(!key1);           //这个必须加,表示判断按键是否松开,不然按键时灯闪烁
                                LED1=~LED1;        //取反,本来是亮的按下就熄灭,本来是熄灭的按下就亮
                        }
                }
        }
}       
       
/***************************程序完成*****************************************/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 10:13:24 | 显示全部楼层
bg4rff 发表于 2023-7-7 01:25
bit FALG;
unsigned int t10ms;
//中断服务程序

定义脚稍微改一下,单片机3脚高电平时,7脚延迟3秒输出一个时长1分钟的低电平。3脚低电平时8脚延迟3秒输出一个时长1秒钟的低电平。麻烦大神再给改改发一个完整的代码谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-7-7 12:00:25 | 显示全部楼层
这种简单的程序,如果会PLC编程的话,可以生成PWM文件,然后找PWM转HEX的软件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 13:05:23 | 显示全部楼层
蕴殇 发表于 2023-7-7 12:00
这种简单的程序,如果会PLC编程的话,可以生成PWM文件,然后找PWM转HEX的软件

大佬,我编程一点不会,刚开始学习嘉立创EDA画个PCB还行。我也看了些教学视频但是那些专业的词我都不知道没法编程。昨天折腾一天才装好Keil 学会怎么生成HEX。现在就是差编程了
回复 支持 反对

使用道具 举报

发表于 2023-7-7 13:46:53 | 显示全部楼层
光耦,不懂,有必要用么? 什么情况下需要放个光耦
回复 支持 反对

使用道具 举报

发表于 2023-7-7 14:07:18 | 显示全部楼层
kbh 发表于 2023-7-7 10:13
定义脚稍微改一下,单片机3脚高电平时,7脚延迟3秒输出一个时长1分钟的低电平。3脚低电平时8脚延迟3秒输 ...

不建议这样,INT3只有单边沿触发
实际上这是个按键的话需要重新写
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 14:17:45 | 显示全部楼层
bg4rff 发表于 2023-7-7 14:07
不建议这样,INT3只有单边沿触发
实际上这是个按键的话需要重新写

那还是以前最开始的样子好了,麻烦您给写个完整的程序吧,谢谢
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2023-7-7 14:19:40 | 显示全部楼层
2023/7/10, 周一下午,14: 00 ~ 17:00;腾讯会议号:882-661-559
STC32位8051库函数0基础应用实战宣讲会:正好要讲这个
库函数开发,还是点灯大师,I/O 实战,兼容8051

回复 支持 反对

使用道具 举报

发表于 2023-7-7 14:20:05 | 显示全部楼层
kbh 发表于 2023-7-7 10:13
定义脚稍微改一下,单片机3脚高电平时,7脚延迟3秒输出一个时长1分钟的低电平。3脚低电平时8脚延迟3秒输 ...

单片机3脚高电平时,7脚延迟3秒输出一个时长1分钟的低电平。是3脚由低到高时吧?要不然还是一直触发?


3脚低电平时8脚延迟3秒输出一个时长1秒钟的低电平。麻烦大神再给改改发一个完整的代码谢谢,这个也一样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 14:47:16 | 显示全部楼层
bg4rff 发表于 2023-7-7 14:20
单片机3脚高电平时,7脚延迟3秒输出一个时长1分钟的低电平。是3脚由低到高时吧?要不然还是一直触发?

不好意思论坛回复审核超级慢,就是3脚加个开关上电时开关断开时3脚高电平,控制7脚延迟3秒输出一个时长1分钟的低电平。然后3脚开关闭合上电时3脚就是低电平,控制8脚延迟3秒输出一个时长1分钟的低电平。平时所有输出脚都是高电平。如果不行就麻烦您按照最开始的那个样子8脚控制也行。非常感谢
回复 支持 反对

使用道具 举报

发表于 2023-7-8 14:11:42 | 显示全部楼层
本帖最后由 慕名而来 于 2023-7-8 14:14 编辑

楼主硬件的控制模式是系统上电时按键SW1的端口状态为高电平,此时不能做判断,否则系统上电就进入了“单片机8脚高电平时,1脚延迟3秒输出一个时长1分钟的低电平”这个状态了,虽然楼主要求是判断8脚低电平、高电平,但因为按键不按下就是高电平状态了,所以我的理解为楼主的控制只有按键SW1按下的一个判断,按键松手后就自动进入了另一个状态,也就是说,每按一次按键单片机都要如下运行:
按键按下(按键按下再抬起时开始运行)——>延时3秒——>P3.5=0——>延时1秒——>P3.5=1——>(开始按键高电平状态的运行)延时3S——>P3.4=0——>延时60秒——>P3.4=1——>等待下次按键。
如果楼主需要对两个光耦分别控制则需要两个按键来实现,或者通过按键的长、短时间来分别控制。
对于一楼的控制要求,我的代码分享如下,是通过按键查询模式实现的,也可以改为中断控制的,程序在(STC8H8K64U)开天斧三.1实验板上测试通过。
代码中的P34,P35是头文件中已经定义好的端口名称
#include <stc15.h>
bit flag, f32, f34, f35;
unsigned int count;
//----20ms延时函数----------------------------------
void Delay20ms()  [url=]//@11.0592MHz[/url]
{
    unsigned char data i, j;
    i = 216;
    j = 37;
    do
    {
        while (--j);
    }
    while (--i);
}
//----定时器0初始化函数-----------------------------
void Timer0_Init(void)  //50毫秒@11.0592MHz
{
    AUXR &= 0x7F;   //定时器时钟12T模式
    TMOD &= 0xF0;   //设置定时器模式
    TL0 = 0x00;    //设置定时初始值
    TH0 = 0x4C;    //设置定时初始值
    ET0 = 1;     //使能定时器0中断
    EA = 1;
}
//----定时器0中断函数-------------------------------
void Timer0_Isr(void) interrupt 1
{
    if(f35)
    {
        if(P35)
        {
            if(count++ > 60)  //计时3秒
            {
                count = 0;
                P35 = 0;   //使能P3.5脚输出
            }
        }
        if(!P35)
        {
            if(count++ > 20) //计时1秒
            {
                count = 0;
                P35 = 1;  //关闭输出
                f32 = 0;
                TR0 = 0;  //关闭P3.5脚输出
            }
        }
    }
    if(f34)
    {
        if(P34)
        {
            if(count++ > 60)  //计时3秒
            {
                count = 0;
                P34 = 0;   //使能P3.4脚输出
            }
        }
        if(!P34)
        {
            if(count++ > 1200) //计时1分钟
            {
                count = 0;
                P34 = 1;  //关闭P3.4脚输出
                TR0 = 0;  //关闭定时器
            }
        }
    }
}
//----按键函数------------------------------------
void key()
{
    if(P32 == 0)
        Delay20ms();
    if(P32 == 0)
    {
        f32 = 1;
        while(!P32);
    }
}
//----主函数--------------------------------------
void main ()
{
    P3M0 = 0x30;  //配置P3.4、P3.5为推挽输出模式
P3M1 = 0x00;
    Timer0_Init();
    flag = 0;
    f32 = 0;
    f34 = 0;
    f35 = 0;
    count = 0;

    while(1)
    {
        key();    //按键查询
        if(f32)
        {
            TR0 = 1;  //开启定时器
            flag = 1;
            f35 = 1;
            f34 = 0;
        }
        if(P32 & flag )
        {
            TR0 = 1;  //开启定时器
            flag = 0;
            f34 = 1;
            f35 = 0;
        }
    }
}



回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-13 08:10 , Processed in 0.171601 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表