亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 919|回復: 14
打印 上一主題 下一主題
收起左側

關于stc8H的延時函數問題

[復制鏈接]
跳轉到指定樓層
樓主
本人最近在使用STC8H1K08芯片驅動TM1652,晶振是外部 12M
主要核心的驅動邏輯就是使用一根TX發數據給TM1652,不需要有數據回傳,一直發就可以。但是由于最初設計時沒有使用tx線,所以采用了io模擬tx的方式,19200的波特率用延時換算是52us,52us由stc-isp生成,目前遇到的問題是為什么這個延時不能正常點亮?
#include "main.h"

unsigned char LedSegs[]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113};

void Delay52us(void)  //@12.000MHz
{
  unsigned char data i;

  i = 206;
  while (--i);
}

void sd1(unsigned char dat)
{
  unsigned int i=0;
  bit CY = 0,TB = 0;
  ACC = dat;
  if(P)
  {
    TB = 0;
  }
  else
  {
    TB = 1;
  }
  Tm1652_SDA=0;            //將串口發送端口TXD置高
  Delay52us();
  for(i= 0;i<8;i++)
  {
    Tm1652_SDA =  dat & 0x01;
    dat = dat>>1;
    Delay52us();
  }
  Tm1652_SDA = TB;      
  Delay52us();
  Tm1652_SDA=1;            //將串口發送端口TXD置高
  Delay52us();
}
void SendInt1(int ss){
  int qian,bai,shi,ge;
  qian = ss /1000;
  bai = ss / 100;
  shi = ss % 100 / 10;
  ge = ss % 10;

  sd1(LedSegs[qian]);
  sd1(LedSegs[bai]);  
  sd1(LedSegs[shi] | 0x80);
  sd1(LedSegs[ge]);
}
void main()
{
    P1M0 = 0x00;
    P1M1 = 0x00;
    while(1)
    {
      SendInt1(8888);
    }
}#ifndef _MAIN_H_
#define _MAIN_H

#include "STC8H.h"

sbit Tm1652_SDA = P1^3;

#endif



文件STC8H.h也是由stc-isp生成的頭文件向各位大佬尋求幫助




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:69038 發表于 2026-7-9 13:46 | 只看該作者
你這代碼編譯通過了嗎?
回復

使用道具 舉報

板凳
ID:1133081 發表于 2026-7-9 15:47 | 只看該作者
回復

使用道具 舉報

地板
ID:1149881 發表于 2026-7-10 09:32 | 只看該作者
zhuls 發表于 2026-7-9 13:46
你這代碼編譯通過了嗎?

過了()
回復

使用道具 舉報

5#
ID:69038 發表于 2026-7-10 14:33 | 只看該作者

那你這個P定義在哪里呢?我咋就沒找到?
void sd1(unsigned char dat)
{
  unsigned int i=0;
  bit CY = 0,TB = 0;//CY 沒看到被引用
  ACC = dat; //ACC又為什么要=dat?,ACC沒看到被引用
  if(P)          //P定義在哪里?
  {
    TB = 0;
  }
  else
  {
    TB = 1;
  }
  Tm1652_SDA=0;            //將串口發送端口TXD置高
  Delay52us();
  for(i= 0;i<8;i++)
  {
    Tm1652_SDA =  dat & 0x01;
    dat = dat>>1;
    Delay52us();
  }
  Tm1652_SDA = TB;      //這個TB是1還是0?你這是啟動了校驗嗎?
  Delay52us();
  Tm1652_SDA=1;            //將串口發送端口TXD置高
  Delay52us();
}
看上去有11個波特率(t)的時間,你啟動了校驗位?。
正常的TXD是從高到低,并維持一個波特率的時間(t)為起始信號,然后依次8個時間(t)是8bit的數據,最后從低到高再維持一個時間(t)為停止,上述是“波特率,N,8,1”的時序,一共有10個時序波形。
你看一下,你的代碼附合不?
回復

使用道具 舉報

6#
ID:69038 發表于 2026-7-10 14:38 | 只看該作者
下載了1652的手冊看了看,確實要加入校驗位,你的校驗位是如何得出的?
還是那個(P),是從哪來的?主樓給的代碼不完整。
回復

使用道具 舉報

7#
ID:69038 發表于 2026-7-10 14:57 | 只看該作者
還有:
1652要有初始設置,亮度、模式==,但在你的代碼中沒找到;
sd1(LedSegs[shi] | 0x80);=>這里為什么要“|0x80”,而其它的卻沒有?
回復

使用道具 舉報

8#
ID:624769 發表于 2026-7-10 14:59 | 只看該作者
我說…… 你到底用沒用過 TM1652 ?  以及,你看沒看過手冊,會不會用TM1652?
會用的話…… 初始化呢???
整個代碼看了半天,也沒看到你初始化 TM1652啊……
回復

使用道具 舉報

9#
ID:1133081 發表于 2026-7-10 16:33 | 只看該作者
回復

使用道具 舉報

10#
ID:341045 發表于 2026-7-11 09:56 | 只看該作者
  Tm1652_SDA=0;            //將串口發送端口TXD置高

你管這個叫置高?我這邊叫置低。Tm1652_SDA=1; 才叫置高。
回復

使用道具 舉報

11#
ID:1149881 發表于 2026-7-14 13:10 | 只看該作者
謝謝大家的幫助,我調出來了,為什么問的延時而不是tm1652的使用,是因為之前點亮過,但是因為時序影響,按鍵按下數碼管刷新不流暢,所以又拿出來重寫。因為之前重做了一版之后,數碼管不亮,然后改用AI生成的52us的延時之后亮了,實際上晶振也沒變過,所以就懷疑是延時的問題。這次又重新使用STCISP的延時,成功點亮了,添加別的功能也沒有影響。
回復

使用道具 舉報

12#
ID:1149881 發表于 2026-7-14 13:10 | 只看該作者
我把代碼貼到這里,STC8H.h文件是我在STCISP中下載的頭文件,
#include "delay.h"

void Delay52us(void)  //@12.000MHz
{
  unsigned char data i;

  i = 206;
  while (--i);
}

void Delay_ms(unsigned int ms)  //@12.000MHz
{
  unsigned char data i, j;
  unsigned int k = 0;
  for(k = 0;k < ms; k++)
  {
      i = 16;
      j = 147;
      do
      {
        while (--j);
      } while (--i);
  }
}

void Delay_us(unsigned int us)  //@12.000MHz
{
  unsigned char data i;
  unsigned int j = 0;
  for(j = 0; j < us ;j++)
  {
    i = 2;
    while (--i);
  }
}
#include "tm1652.h"

unsigned char code LedSegs[]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113};

void sd1(unsigned char dat)
{
  unsigned int i=0;
  bit CY = 0;
  bit TB = 0;
  ACC = dat;
  if(P)
  {
    TB = 0;
  }
  else
  {
    TB = 1;
  }
  Tm1652_SDA = 0;         
  Delay52us();
  for(i= 0;i<8;i++)
  {
    Tm1652_SDA =  dat & 0x01;
    dat = dat>>1;
    Delay52us();
  }
  Tm1652_SDA = TB;      
  Delay52us();
  Tm1652_SDA = 1;            //將串口發送端口TXD置高
  Delay52us();
}

void Tm1652Dispaly(int ss)
{
  int qian,bai,shi,ge;

  qian = ss /1000;
  bai = ss % 1000 / 100;
  shi = ss % 100 / 10;
  ge = ss % 10;
  sd1(0x08);
  sd1(LedSegs[qian] | 0x80);
  sd1(LedSegs[bai] | 0x80);  
  sd1(LedSegs[shi] | 0x80);
  sd1(LedSegs[ge] | 0x80); // 亮小數點
  Tm1652_SDA = 1;
  Delay_ms(3);  //一定要這個延時,否則會不亮,只延時1ms也會不亮
  sd1(0x18);
  sd1(0xb8);  // 調亮度(位驅動占空比和段驅動電流,和位數)

}

#ifndef _TM1652_H_
#define _TM1652_H_

#include "STC8H.h"
#include "delay.h"

sbit Tm1652_SDA = P1^3;

void sd1(unsigned char dat);
void Tm1652Dispaly(int ss);

#endif



回復

使用道具 舉報

13#
ID:1149881 發表于 2026-7-14 13:17 | 只看該作者
謝謝大家的評論,是有幫助的。
之所以發這個帖,帖題目問時序問題是因為之前使用tm1652成功點亮過,但是后面換了一個板子燒錄,就發現沒辦法點亮了,判斷是52us延時的問題,原先的52us是STCISP生成,后來AI生成了一個52us延時之后,可以點亮,但是時序很亂,按鍵按下數碼管刷新不了或者會卡頓。最后又掏出來重新寫,確實是沒注意到之前寫這個的時候,沒加芯片驅動開始的地址,亮度等參數,所以沒辦法正確點亮,現在我把成功的貼到下面,希望可以幫助到別人
STC8H.h是STCISP生成的頭文件。

#include "tm1652.h"

unsigned char code LedSegs[]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113};

void sd1(unsigned char dat)
{
        unsigned int i=0;
        bit CY = 0;
  bit TB = 0;
        ACC = dat;
        if(P)
        {
                TB = 0;
        }
        else
        {
                TB = 1;
        }
        Tm1652_SDA = 0;            //將串口發送端口TXD置高
        Delay52us();
        for(i= 0;i<8;i++)
        {
                Tm1652_SDA =  dat & 0x01;
                dat = dat>>1;
                Delay52us();
        }
        Tm1652_SDA = TB;                  
        Delay52us();
        Tm1652_SDA = 1;            //將串口發送端口TXD置高
        Delay52us();
}

void Tm1652Dispaly(int ss)
{
        int qian,bai,shi,ge;

  qian = ss /1000;
        bai = ss % 1000 / 100;
        shi = ss % 100 / 10;
        ge = ss % 10;
        sd1(0x08);
  sd1(LedSegs[qian] | 0x80);
        sd1(LedSegs[bai] | 0x80);  
        sd1(LedSegs[shi] | 0x80);
        sd1(LedSegs[ge] | 0x80); // 亮小數點
        Tm1652_SDA = 1;
        Delay_ms(3);  //一定要這個延時,否則會不亮,只延時1ms也會不亮
        sd1(0x18);
        sd1(0xb8);  // 調亮度(位驅動占空比和段驅動電流,和位數)

}
#ifndef _TM1652_H_
#define _TM1652_H_

#include "STC8H.h"
#include "delay.h"

sbit Tm1652_SDA = P1^3;

void sd1(unsigned char dat);
void Tm1652Dispaly(int ss);

#endif

#include "delay.h"

void Delay52us(void)        //@12.000MHz
{
        unsigned char data i;

        i = 206;
        while (--i);
}

void Delay_ms(unsigned int ms)        //@12.000MHz
{
        unsigned char data i, j;
        unsigned int k = 0;
        for(k = 0;k < ms; k++)
        {
                        i = 16;
                        j = 147;
                        do
                        {
                                while (--j);
                        } while (--i);
        }
}

void Delay_us(unsigned int us)        //@12.000MHz
{
        unsigned char data i;
        unsigned int j = 0;
        for(j = 0; j < us ;j++)
        {
                i = 2;
                while (--i);
        }
}
delay也均由STCISP生成。
回復

使用道具 舉報

14#
ID:1149881 發表于 2026-7-14 13:19 | 只看該作者
zhuls 發表于 2026-7-10 14:33
那你這個P定義在哪里呢?我咋就沒找到?
void sd1(unsigned char dat)
{

多謝審讀我的代碼,是的,芯片驅動主要的初始化和亮度等參數沒寫入,所以導致沒辦法點亮,補全之后就可以了
但是P這些校驗,應該是STC本身的寄存器,調用頭文件就可以正常使用了,應該是不需要定義的
回復

使用道具 舉報

15#
ID:1149881 發表于 2026-7-14 13:19 | 只看該作者
188610329 發表于 2026-7-10 14:59
我說…… 你到底用沒用過 TM1652 ?  以及,你看沒看過手冊,會不會用TM1652?
會用的話…… 初始化呢?? ...

是的,是因為這個問題,謝謝,已經糾正了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表