STC89C52RC/LE52RC

STC89C52RC

  • 芯片手冊
  • 原理圖
    • 擴展版原理圖
  • 功能示例
    • LED燈
      • ==LED燈的常亮效果==
      • ==LED燈的閃爍==
      • ==LED燈的跑馬燈效果:從左到右,從右到左==
    • 數碼管
      • 靜態數碼管
      • 數碼管計數
        • mian.c
        • App.c
        • App.h
        • Com.c
        • Com.h
        • Dir.c
        • Dir.h
        • Int.c
        • Int.h
        • Mid.c
        • Mid.h
  • 模板
        • mian.c
        • App.c
        • App.h
        • Com.c
        • Com.h
        • Dir.c
        • Dir.h
        • Int.c
        • Int.h
        • Mid.c
        • Mid.h

芯片手冊

STC89C52

原理圖

擴展版原理圖

擴展版原理圖

功能示例

LED燈

LED燈的常亮效果

# include <STC89C5xRC.H>
void main(){//將LED連接的P00端口設置為0P00 =0;while(1);
}

LED燈的閃爍

/*----------------------------------------------------------* 文件名:LED_FlowLight.c* 功能:STC89C52RC單片機控制的LED流水燈程序(單向左移循環)* 硬件連接:P0口接8個共陽LED,P4.6控制蜂鳴器* 作者:[您的名字]* 日期:[創建日期]*---------------------------------------------------------*/#include <STC89C5xRC.H> // 包含STC89C52RC系列單片機寄存器定義頭文件
#include <INTRINS.H>    // 包含內部函數庫(提供_nop_()空指令)/* 類型重定義(增強可讀性)*/
typedef unsigned char u8;  // 定義無符號8位數據類型(范圍0~255)
typedef unsigned int u16;  // 定義無符號16位數據類型(范圍0~65535)/* 函數聲明 */
void Delayms(u16 count);   // 毫秒級延時函數聲明/*----------------------------------------------------------* 主函數*---------------------------------------------------------*/
void main()
{// 變量初始化u8 temp = 0x01;  // 初始化LED位置(二進制00000001,對應最右側LED)// 注:實際是P0.0對應第一個LED,P0.7對應第八個LEDP46 = 0;         // 關閉蜂鳴器(硬件設計缺陷,P4.6低電平關閉蜂鳴器)// 如果不設置,上電時可能產生噪音while (1)        // 主循環(單片機程序必須包含無限循環){/* LED顯示控制 */P0 = ~temp;  // 輸出到P0口控制LED:// - 取反操作是因為采用共陽接法(端口輸出0時LED亮)// - 例如temp=0x01(00000001),取反后=0xFE(11111110),//   即P0.0輸出0,對應LED點亮/* 更新LED位置 */temp <<= 1;  // 左移一位,實現LED流水效果// 例如:0x01→0x02→0x04→...→0x80/* 循環檢測 */if (temp == 0) // 當左移超出8位時(0x80<<1會變成0x00){temp = 0x01; // 重新從最右側開始}/* 延時控制流水速度 */Delayms(100); // 延時100ms(控制LED移動速度)}
}/*----------------------------------------------------------* 函數名稱:Delayms* 功能:實現毫秒級延時* 參數:count - 需要延時的毫秒數* 說明:針對12MHz晶振校準,其他頻率需調整參數*---------------------------------------------------------*/
void Delayms(u16 count)
{/* 變量定義(使用data關鍵字將變量存儲在內部RAM,提高訪問速度)*/u8 data i, j;  while (count--)  // 外層循環(控制總延時毫秒數){_nop_();    // 空指令(消耗1個機器周期,12MHz下=1us)// 用于微調延時精度/* 雙重循環實現精確延時 */i = 2;j = 199;do{while (--j); // 內層循環1(約199×3個機器周期)} while (--i);   // 內層循環2(外層循環2次)/* * 延時計算(12MHz時鐘):* - 1機器周期=1us* - 內層循環:199×3 = 597us* - 外層循環:2×597 = 1194us ≈ 1ms* - 總延時:count × 1ms*/}
}

LED燈的跑馬燈效果:從左到右,從右到左

#include <STC89C5xRC.H>  // 包含STC89C52RC系列單片機頭文件
#include <INTRINS.H>     // 包含 intrinsics 函數(如_nop_)typedef unsigned char u8;   // 定義無符號8位數據類型(0~255)
typedef unsigned int u16;   // 定義無符號16位數據類型(0~65535)// 函數聲明
void Delayms(u16 count);    // 毫秒級延時函數聲明void main()
{// 變量初始化u8 temp = 0x01;     // 初始燈位(00000001,最右側LED亮)bit is_left = 1;    // 方向標志(1=左移,0=右移)while (1)           // 主循環{P0 = ~temp;     // 輸出到P0口(取反因為LED共陽接法)// 根據移動方向更新燈位if (is_left) {temp <<= 1; // 左移一位(LED向左移動)} else {temp >>= 1; // 右移一位(LED向右移動)}// 檢測邊界條件并改變方向if (temp == 0x80) { // 當移動到最左端(10000000)is_left = 0;     // 改為右移方向}if (temp == 0x01) {  // 當移動到最右端(00000001)is_left = 1;      // 改為左移方向}Delayms(100);    // 延時100ms控制移動速度}
}/*** @brief 毫秒級延時函數* @param count 延時毫秒數* @note 針對12MHz晶振校準,其他頻率需要調整參數*/
void Delayms(u16 count)
{u8 data i, j;       // 使用data關鍵字將變量存儲在內部RAMwhile (count--)     // 外層循環(毫秒級){_nop_();       // 空指令(4個時鐘周期)i = 2;j = 199;do              // 內層循環(微秒級){while (--j); // 約100us} while (--i);   // 組合成約1ms延時}
}

數碼管

靜態數碼管

#include <STC89C5xRC.H>  // 包含STC89C52RC系列單片機頭文件
#include <INTRINS.H>     // 包含 intrinsics 函數(如_nop_)typedef unsigned char u8;   // 定義無符號8位數據類型
typedef unsigned int u16;   // 定義無符號16位數據類型
typedef unsigned long u32;  // 定義無符號32位數據類型// 函數聲明
void DigitalTube_setBuffer(u32 number);  // 設置數碼管顯示緩沖區
void DigitalTube_Single(u8 pos, u8 number); // 控制單個數碼管顯示
void DigitalTube_Refresh();              // 刷新整個數碼管顯示
static void Delayms(u16 count);         // 毫秒級延時函數(static限制作用域)// 數碼管段選碼(共陰數碼管0-9,對應a~dp段)
// 編碼格式:gfedcba(P0.0~P0.6),最高位P0.7為小數點
const u8 number_codes[10] = {0x3F, // 0 - 001111110x06, // 1 - 000001100x5B, // 2 - 010110110x4F, // 3 - 010011110x66, // 4 - 011001100x6D, // 5 - 011011010x7D, // 6 - 011111010x07, // 7 - 000001110x7F, // 8 - 011111110x6F  // 9 - 01101111
};u8 digital_buffer[8]; // 數碼管顯示緩沖區(存儲8位數碼管的段選值)void main()
{// 初始化IO口// P0 = 0x00;  // 段選初始化為全滅(注釋掉,實際在刷新函數中處理)// P1 = 0xC7;  // 位選初始化為全滅(P1.3-P1.5控制位選,11000111)P46 = 0;    // 可能的總使能信號(低電平有效)P36 = 0;    // 數碼管使能信號(低電平有效)P34 = 1;    // 關閉流水燈(高電平關閉)DigitalTube_setBuffer(99998888); // 設置初始顯示值為250while (1){DigitalTube_Refresh(); // 持續刷新數碼管顯示}
}/*** @brief 設置數碼管顯示緩沖區內容* @param number 要顯示的數字(最大支持8位數)* @note 數字將右對齊顯示,不顯示前導零*/
void DigitalTube_setBuffer(u32 number)
{u8 i;// 1. 清空緩沖區(全部顯示空白)for (i = 0; i < 8; i++) {digital_buffer[i] = 0; // 0表示不顯示任何段}// 2. 從最右側開始填充數字(右對齊)for (i = 7; i >= 0; i--) {digital_buffer[i] = number_codes[number % 10]; // 獲取當前位的段碼number /= 10;  // 移除已處理的最低位if (number == 0) break; // 數字已處理完畢則退出}
}/*** @brief 控制單個數碼管顯示* @param pos 數碼管位置(0-7對應位選)* @param number 要顯示的段碼值* @note 使用P1.3-P1.5控制3-8譯碼器選擇位選*/
void DigitalTube_Single(u8 pos, u8 number)
{// 1. 位選控制(通過P1.3-P1.5)pos <<= 3;       // 左移3位,將0-7映射到P1.3-P1.5P1 &= 0xC7;      // 11000111 - 清除位選位(P1.3-P1.5)P1 |= pos;       // 設置新的位選// 2. 段選輸出P0 = number;     // 輸出段碼值到P0口
}/*** @brief 刷新整個數碼管顯示(動態掃描)* @note 采用循環掃描方式,每位顯示1ms*/
void DigitalTube_Refresh()
{u8 i = 0;while (i <= 7)  // 掃描0-7共8位數碼管{DigitalTube_Single(i, digital_buffer[i]); // 顯示當前位Delayms(1);  // 保持顯示1msi++;}
}/*** @brief 毫秒級延時函數* @param count 延時毫秒數* @note 使用static限制只在本文件使用,防止命名沖突*/
static void Delayms(u16 count)
{u8 data i, j;while (count--){_nop_();  // 空指令,用于精確延時i = 2;j = 199;do{while (--j);  // 內層循環延時} while (--i);    // 外層循環延時}
}

數碼管計數

mian.c
#include ".\Com\Com_Util.h"
#include ".\Int\Int_DigitalTube.h"// 主函數
void main()
{u8 num = 100;u8 count = 0;u8 i=0;P46 = 0; // 關閉蜂鳴器// 初始化數碼管Int_DigitalTube_Init();//設置要顯示的數字Int_DigitalTube_setBuffer(num);//死循環while (1){Int_DigitalTube_setBuffer(num);while (count <= 100){Int_DigitalTube_Refresh();count++;}if (num > 0){num--;count=0;}else if (num == 0){while (1){Int_DigitalTube_setBuffer(0);}}}
}
App.c
App.h
Com.c
#include "Com_Util.h"// 延時函數,指定延時多少毫秒
void Delayms(u16 count)
{u8 data i, j;while (count){_nop_();i = 2;j = 199;do{while (--j);} while (--i);count--;}
}
Com.h
#ifndef __COM_UTIL_H__
#define __COM_UTIL_H__#include <STC89C5xRC.H>
#include <INTRINS.H>// 類型別名
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;/*** @brief 延時函數,指定延時多少毫秒** @param count 指定多少毫秒*/
void Delayms(u16 count);#endif
Dir.c
Dir.h
Int.c
#include "Int_DigitalTube.h"// 定義數組,保存每個數字的段選信息
static u8 s_number_codes[10] = {0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F  // 9
};// 定義數組,8個元素,對應數碼管8個位置; 每個元素存儲數字的段選信息
static u8 s_digital_buffer[8];/*** @brief 數碼管初始化*/
void Int_DigitalTube_Init()
{// 打開數碼管開關P36 = 0;// 關閉流水燈P34 = 0;
}/*** @brief 將指定的整數設置到數碼管顯示緩存中(s_digital_buffer數組)** @param number*/
void Int_DigitalTube_setBuffer(u32 number)
{u8 i;// 1. 清空之前的顯示內容for (i = 0; i < 8; i++){s_digital_buffer[i] = 0x00;}// 2. 依次取出number中每位上的數,將其段選信息存儲數組;最低位存入最后一個元素for (i = 7;; i--){// 取出當前位上的數,將其段選信息存入數組指定位置s_digital_buffer[i] = s_number_codes[number % 10];// 處理number,去掉最低位number /= 10;// 如果number變為0,說明數字已經取完,停止循環if (number == 0 || i == 0){break;}}
}/*** @brief 數碼管指定位置指定數字** @param pos     位置,使用數字0~7分別表示從左邊數第1到到第8個* @param code    數字的段選信息*/
void Int_DigitalTube_Single(u8 pos, u8 number_code)
{// 1. 位選 -------------------------------// 1.1 pos 左移3位,  與P15、P14、P13 對齊pos <<= 3;// 1.2 將P1的P15、P14、P13三位置0,其他位保持不變, P1 & 0b11000111P1 &= 0xC7;// 1.3 將pos上的三位有效數, 賦值到 P15、P14、P13 位置上P1 |= pos;// 2. 段選 --------------------------------P0 = number_code;
}/*** @brief 刷新數碼管**/
void Int_DigitalTube_Refresh()
{// 循環0到7u8 i;for (i = 0; i <= 7; i++){Int_DigitalTube_Single(i, s_digital_buffer[i]);Delayms(1);}
}
Int.h
#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__#include "..\Com\Com_Util.h"/*** @brief 數碼管初始化*/
void Int_DigitalTube_Init();/*** @brief 將指定的整數設置到數碼管顯示緩存中(digital_buffer數組)* * @param number */
void Int_DigitalTube_setBuffer(u32 number);/*** @brief 數碼管指定位置指定數字** @param pos     位置,使用數字0~7分別表示從左邊數第1到到第8個* @param code    數字的段選信息*/
void Int_DigitalTube_Single(u8 pos, u8 number_code);/*** @brief 刷新數碼管**/
void Int_DigitalTube_Refresh();#endif
Mid.c
Mid.h

模板

mian.c
App.c
App.h
Com.c
Com.h
Dir.c
Dir.h
Int.c
Int.h
Mid.c
Mid.h

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84310.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

踩坑記錄:RecyclerView 局部刷新notifyItemChanged多次調用只觸發一次 onBindViewHolder 的原因

1. 問題背景 在做項目的時候&#xff0c;RecyclerView需要使用局部刷新&#xff0c;使用 notifyItemChanged(position, payload) 實現局部刷新&#xff0c;但發現調用多次只執行了一次&#xff0c;第二個刷新不生效。 2. 錯誤示例&#xff08;只處理 payloads.get(0)&#xff…

OpenLayers 加載鷹眼控件

注&#xff1a;當前使用的是 ol 5.3.0 版本&#xff0c;天地圖使用的key請到天地圖官網申請&#xff0c;并替換為自己的key 地圖控件是一些用來與地圖進行簡單交互的工具&#xff0c;地圖庫預先封裝好&#xff0c;可以供開發者直接使用。OpenLayers具有大部分常用的控件&#x…

WPF···

設置啟動頁 默認最后一個窗口關閉,程序退出,可以設置 修改窗體的icon圖標 修改項目exe圖標 雙擊項目名會看到代碼 其他 在A窗體點擊按鈕打開B窗體,在B窗體設置WindowStartupLocation=“CenterOwner” 在A窗體的代碼設置 B.Owner = this; B.Show(); B窗體生成在A窗體中間…

github公開項目爬取

import requestsdef search_github_repositories(keyword, tokenNone, languageNone, max_results1000):"""通過 GitHub API 搜索倉庫&#xff0c;支持分頁獲取所有結果&#xff08;最多 1000 條&#xff09;:param keyword: 搜索關鍵詞:param token: GitHub To…

防震基座在半導體晶圓制造設備拋光機詳細應用案例-江蘇泊蘇系統集成有限公司

在半導體制造領域&#xff0c;晶圓拋光作為關鍵工序&#xff0c;對設備穩定性要求近乎苛刻。哪怕極其細微的振動&#xff0c;都可能對晶圓表面質量產生嚴重影響&#xff0c;進而左右芯片制造的成敗。以下為您呈現一個防震基座在半導體晶圓制造設備拋光機上的經典應用案例。 企…

S32K開發環境搭建詳細教程(一、S32K IDE安裝注冊)

一、S32K IDE安裝注冊 1、進入恩智浦官網https://www.nxp.com.cn/&#xff08;需要在官網注冊一個賬號&#xff09; 2、直接搜索 “Standard Software”&#xff0c;找到S32K3 Standard Software&#xff0c;點擊進入 3、下載 (1)Automotive SW - S32K3 - S32 Design Studio…

Spring Cloud Gateway 微服務網關實戰指南

上篇文章簡單介紹了SpringCloud系列OpenFeign的基本用法以及Demo搭建&#xff08;Spring Cloud實戰&#xff1a;OpenFeign遠程調用與服務治理-CSDN博客&#xff09;&#xff0c;今天繼續講解下SpringCloud Gateway實戰指南&#xff01;在分享之前繼續回顧下本次SpringCloud的專…

MSP430G2553 USCI模塊串口通信

1.前言 最近需要利用msp430連接藍牙模塊傳遞數據&#xff0c;于是死磕了一段時間串口&#xff0c;在這里記錄一下 2.msp430串口模塊 msp430的串口模塊可以有USCI模塊提供 在異步模式中&#xff0c; USCI_Ax 模塊通過兩個外部引腳&#xff0c; UCAxRXD 和 UCAxTXD&#xff0…

【產品經理從0到1】用戶端產品設計與用戶畫像

思考 xx新聞的第一個版本應該做哪些事情呢&#xff1f; 用戶端核心功能 用戶端通用頁面設計 思考 回想一下&#xff0c;大家在第一次使用一個新下載的App的時候會看到一些什么樣的頁面?這樣的頁面一般都是展示了一些什么內容? 引導頁 概念 第一次安裝App或者更新App后第…

多場景游戲AI新突破!Divide-Fuse-Conquer如何激發大模型“頓悟時刻“?

多場景游戲AI新突破&#xff01;Divide-Fuse-Conquer如何激發大模型"頓悟時刻"&#xff1f; 大語言模型在強化學習中偶現的"頓悟時刻"引人關注&#xff0c;但多場景游戲中訓練不穩定、泛化能力差等問題亟待解決。Divide-Fuse-Conquer方法&#xff0c;通過…

佰力博科技與您探討壓電材料的原理與壓電效應的應用

壓電材料的原理基于正壓電效應和逆壓電效應&#xff0c;即機械能與電能之間的雙向轉換特性。 壓電材料的原理源于其獨特的晶體結構和電-機械耦合效應&#xff0c;具體可分為以下核心要點&#xff1a; 1. ?正壓電效應與逆壓電效應的定義? ?正壓電效應?&#xff1a;當壓電…

算法備案審核周期

&#xff08;一&#xff09;主體備案審核 主體備案審核周期通常為7-10個工作日&#xff0c;監管部門將對企業提交的資質信息進行嚴格審查&#xff0c;審核重點包括&#xff1a; 營業執照的真實性、有效性及與備案主體的一致性。法人及算法安全責任人身份信息的準確性與有效性…

管理系統的接口文檔

一、接口概述 本接口文檔用于描述圖書管理系統中的一系列 Restful 接口&#xff0c;涵蓋圖書的查詢、添加、更新與刪除操作&#xff0c;以及用戶的登錄注冊等功能&#xff0c;方便客戶端與服務器之間進行數據交互。 二、接口基礎信息 接口地址&#xff1a;https://book-manag…

杰發科技AC7801——PWM獲取固定脈沖個數

測試通道6 在初始化時候打開通道中斷 void PWM1_GenerateFrequency(void) {PWM_CombineChConfig combineChConfig[1]; //組合模式相關結構體PWM_IndependentChConfig independentChConfig[2];//獨立模式相關結構體PWM_ModulationConfigType pwmConfig; //PWM模式相關結構體PWM…

RL電路的響應

學完RC電路的響應&#xff0c;又過了一段時間了&#xff0c;想必很多人都忘了RC電路響應的一些內容。我們這次學習RL電路的響應&#xff0c;以此同時&#xff0c;其實也是帶大家一起回憶一些之前所學的RC電路的響應的一些知識點。所以&#xff0c;這次的學習&#xff0c;其實也…

鴻蒙Flutter實戰:21-混合開發詳解-1-概述

引言 在前面的系列文章中&#xff0c;我們從搭建開發環境開始&#xff0c;講到如何使用、集成第三方插件&#xff0c;如何將現有項目進行鴻蒙化改造&#xff0c;以及上架審核等內容&#xff1b;還以高德地圖的 HarmonyOS SDK 的使用為例&#xff0c; 講解了如何將高德地圖集成…

Vmware ubuntu22.04 虛擬機 連接Windows主機虛擬串口

1. Windows虛擬串口配置 虛擬串口下載&#xff1a;教程網址 虛擬串口使用&#xff1a;教程網址 2. Ubuntu 虛擬串口配置 Vmware ubuntu22.04 虛擬機 連接windows主機虛擬串口_vmware中ttys0連接的是哪個端口-CSDN博客 注意&#xff1a;虛擬添加串口的時候&#xff0c;一直…

編譯rk3568的buildroot不起作用

一、環境&#xff1a; 使用kickpi k1開發板&#xff0c;芯片為rk3568。 vmware ubuntu22.04 kickpi給的sdk包&#xff0c;應該不同友商是通用的。 使用的根文件為buildroot 二、問題&#xff1a; 由于 1、wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 …

【動態規劃】簡單多狀態(二)

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

如何選擇支持AI接入的開發語言與框架

選擇支持AI接入的開發語言與框架 在AI系統開發中,語言和框架的選擇不僅決定了代碼實現方式,更深刻影響模型服務的接入效率、調用方式、性能表現和未來的可維護性。相比傳統后端系統的語言選擇只需關注并發性能或生態成熟度,AI架構下的開發語言必須同時滿足以下幾類能力: 具…