IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 芯圣HC89S003F4简单测试代码,留着备用 -> 正文阅读

[嵌入式]芯圣HC89S003F4简单测试代码,留着备用


前言

? ? ? ?HC89S003F4 是一颗采用高速低功耗 CMOS 工艺设计开发的增强型 8 位单片机,内部有 16K Bytes FLASH 程序存储器, 256 Bytes IRAM 256 Bytes XRAM ,最多 18 个双向 I/O 口, 1 个外设功能引脚全 映射模块 PTM ,5 个 16 位定时器 / 计数器,3 组 12 位带死区控制互补 PWM ,1 个 8 PWM ,2 个 UART , 1 个 SPI 16 个外部中断, 11+2 12 ADC ,四种系统工作模式(正常、低频、掉电和空闲)和 16 个中断源。

?

1.延时函数

代码如下(示例):

#define?? ?ALLOCATE_EXTERN
#include "HC89S003F4.h"

sbit KEY = P2^7;
sbit LED = P0^0;

#define N_KEY?? ?0
#define S_KEY?? ?1
#define D_KEY?? ?2
#define L_KEY?? ?10

#define?? ?MOTO_ON()?? ?PWM0DH = 0x01;?? ?PWM0DL = 0xF4;
#define?? ?MOTO_OFF()?? ?PWM0DH = 0x00;?? ?PWM0DL = 0x00;

bit FlagSysClk10ms; ? ?//10ms标记位
bit FlagSysClk500ms; ? ?//500ms标记位

unsigned char KeyValue = 0;
unsigned char CntSysClk10ms = 0;?? ??? ??? ?//时钟10MS记数
unsigned char CntSysClk500ms = 0;?? ??? ??? ?//时钟500MS记数

unsigned int Bat_Adc = 0;?? ??? ??? ??? ??? ??? ??? ?//电池电量

/***************************************************************************************
? *延时函数*
***************************************************************************************/
void Delay_2us(unsigned int fui_i) ? //2us延时
{
?? ?while(fui_i--);?? ?
}

void Delay_ms(unsigned int fui_i) ? //1ms延时
{
?? ?unsigned int fui_j;
?? ?for(;fui_i > 0;fui_i --)
?? ?for(fui_j = 1596;fui_j > 0;fui_j --);
}

2.TIM0时钟配置1ms计时

代码如下(示例):

/*********************************TIM0时钟配置初始化************************************/
void Timer0_init(void)
{

?? ?TCON1 = 0x00;?? ??? ??? ??? ??? ??? ? ?//Tx0定时器时钟为Fosc
?? ?TMOD = 0x00;?? ??? ??? ??? ??? ??? ? ?//16位重装载定时器/计数器

?? ?//Tim0计算时间 ?? ?= (65536 - 0xFACB) * (1 / (Fosc /Timer分频系数)) = 1333 / (16000000 / 12) = 1 ms

?? ?//定时1ms 反推初值 ?? ?= 65536 - ((1/1000) / (1/(Fosc / Timer分频系数)))
?? ?//?? ??? ? ? ?? ?= 65536 - ((1/1000) / (1/(16000000 / 12))) = 65536 - 1333 = 0xFACB
?? ??? ??? ?
?? ?TH0 = 0xFA;
?? ?TL0 = 0xCB;?? ??? ??? ??? ??? ??? ??? ? ?//T0定时时间1ms
?? ?IE |= 0x02;?? ??? ??? ??? ??? ??? ??? ? ?//打开T0中断
?? ?TCON |= 0x10;?? ??? ??? ??? ??? ??? ? ?//使能T0 ? ?
?? ?EA = 1;?? ??? ??? ??? ??? ??? ??? ??? ? ? ?//打开总中断
}

2.PWM0配置2Hz频率,产生50%占空比

	/*************************************PWM0初始化****************************************/
void PWM_init(void)
{
	P2M1 = P2M1&0xF0|0x08;		//P22设置为推挽输出
  P1M0 = P1M0&0xF0|0x08;    //P10设置为推挽输出
	
	PWM0_MAP = 0x07;					//PWM0通道映射P07口
	PWM01_MAP = 0x10;					//PWM01通道映射P10口
  PWM0C = 0x01;					  	//PWM0、PWM01高有效,时钟8分频

	//独立模式下,PWM0和PWM01共用一个周期寄存器
	//周期计算 	= 0x03E8 / (Fosc / PWM分频系数) = 0x03E8 / (16000000 / 8)	= 500us	/ 2kHz		

	PWM0PH = 0x03;
	PWM0PL = 0xE8;

	//占空比计算= 0x0155 / (Fosc / PWM分频系数)
	//			= 0x01F4 / (16000000 / 8)	= 500 / 2000000  = 250us	占空比为250/500 = 50%		

	PWM0DH = 0x01;						//PWM0高4位
	PWM0DL = 0xF4;						//PWM0低8位
	PWM0DTH = 0x01;						//PWM01高4位
	PWM0DTL = 0xF4;						//PWM01低8位
	PWM0EN = 0x0F;						//使能PWM0,工作于独立模式
}

3.按键扫描状态

unsigned char key_driver(void) 
{     
    static unsigned char key_state = 0;         // 按键状态变量
    static unsigned int key_time = 0;           // 按键计时变量
    unsigned char key_return; 
    key_return = N_KEY;                         // 清除 返回按键值
    switch (key_state)     
    {       
        case 0:      // 按键状态0按键按下
            if (!KEY)  key_state = 1; // 有按键按下       
            break;

        case 1:                       // 按键状态1:软件消抖。按键有效的定义:按键持续按下超过设定的消抖时间。
            if (!KEY)                     
            {
                key_time = 0;               // 一次10ms
                key_state = 2;    // 进入 按键状态2, 继续判定到底是那种有效按键
            }         
            else key_state = 0;       // 如果按键时间没有超过,判定为误触,按键无效,返回 按键状态0,继续等待按键
            break; 

        case 2:                       // 按键状态2:判定按键有效的种类:是单击,还是长按
            if(KEY)
            { 
                 key_return = S_KEY;            // 返回 有效按键值:单击
                 key_state = 0;       // 返回 按键状态0,继续等待按键
            } 
            else
            {
                key_time++;                     
                if(key_time >= 200)   // 如果按键时间超过2s, 则判定为 长按
                {
                    key_return = L_KEY;         // 返回 有效键值值:长按
                    key_state = 3;    // 去状态3,等待按键释放
                }
            }
            break;

      case 3:                         // 等待按键释放
          if (KEY) key_state = 0;       
          break; 

        default: 
          key_state = 0;
          break;
    }
    return key_return;                          // 返回 按键值
}

3.main函数

void main()
{?? ??? ?
?? ?System_init();
?? ?Timer0_init();
?? ?PWM_init();
? ? //ADC_init();
?? ?LED = 1;
?? ?while(1)
?? ?{
?? ??? ?if(FlagSysClk10ms)
?? ??? ?{
?? ??? ??? ?FlagSysClk10ms = 0;
?? ??? ??? ?KeyValue = key_driver();
?? ??? ??? ?switch(KeyValue)
?? ??? ??? ?{
?? ??? ??? ??? ?case S_KEY:
?? ??? ??? ??? ??? ?LED = ~LED;
?? ??? ??? ??? ??? ?MOTO_OFF();
?? ??? ??? ??? ?break;
?? ??? ??? ??? ?
?? ??? ??? ??? ?case L_KEY:
?? ??? ??? ??? ??? ?LED = 0;
?? ??? ??? ??? ??? ?MOTO_ON();
?? ??? ??? ??? ?break;
?? ??? ??? ?}?? ??? ??? ?
?? ??? ?}
?? ??? ?if(FlagSysClk500ms)
?? ??? ?{
?? ??? ??? ?FlagSysClk500ms=0;
?? ??? ??? ?ADCC0 |= 0x40;?? ??? ??? ??? ??? ?//启动ADC转换
?? ??? ??? ?while(!(ADCC0&0x20));?? ??? ?//等待ADC转换结束
?? ??? ??? ?ADCC0 &=~ 0x20;?? ??? ??? ??? ??? ?//清除标志位
?? ??? ??? ?Bat_Adc = ADCR;
?? ??? ??? ?if(Bat_Adc < 2048)
?? ??? ??? ?{
?? ??? ??? ??? ?LED = 0;
?? ??? ??? ?}
?? ??? ??? ?else?? ?LED = 1;
?? ??? ?}
?? ?}
}

该处使用的url网络请求的数据。


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:11:07  更:2021-09-05 11:12:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:39:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码