HT66F50 C程序框架及注意事项.docx
《HT66F50 C程序框架及注意事项.docx》由会员分享,可在线阅读,更多相关《HT66F50 C程序框架及注意事项.docx(8页珍藏版)》请在冰豆网上搜索。
![HT66F50 C程序框架及注意事项.docx](https://file1.bdocx.com/fileroot1/2022-12/13/c450c204-29c9-4bc6-a64a-64e692f24405/c450c204-29c9-4bc6-a64a-64e692f244051.gif)
HT66F50C程序框架及注意事项
HT66F50C程序框架及注意事项
HT66F50C程序框架及注意事项2011-03-2716:
27/********************************************************************
程序功能:
使PF1引脚的电平每1s翻转1次
芯片类型:
HT66F50
总线频率:
12MHz
********************************************************************/
#include"HT66F50.h"
//IO口重定义---------------------------------------------------
#defineled_20_4//pf1,作为控制led用
//数据类型宏定义-----------------------------------------------
typedefunsignedcharUINT8;//!
<unsigned8bitdefinition
typedefunsignedlongUINT16;//!
<unsigned16bitdefinition
typedefsignedcharINT8;//!
<signed8bitdefinition
typedefsignedlongINT16;//!
<signed16bitdefinition
typedefunsignedcharuint8;//!
<unsigned8bitdefinition
typedefunsignedlonguint16;//!
<unsigned16bitdefinition
typedefsignedcharint8;//!
<signed8bitdefinition
typedefsignedlongint16;//!
<signed16bitdefinition
typedefunsignedcharuchar;//!
<unsigned8bitdefinition
//变量定义---------------------------------------------------
//存储空间相关说明:
中文数据手册26页
//bank0变量---------------------------------------
#pragmarambank0
//时间变量
ucharto_2ms;//2ms统计变量
ucharto_20ms;//20ms统计变量
ucharto_200ms;//200ms统计变量
ucharto_1s;//2s统计变量
ucharto_1m;//1m统计变量
ucharto_1h;//1h统计变量
//bank0或者其他bank的变量-------------------------
#pragmanorambank
//中断向量声明-----------------------------------------------
//中断相关说明:
中文数据手册152页
#pragmavectorisr_timer0@0x14
//子函数声明-------------------------------------------------
voidmcu_init();//单片机初始化
voidvar_init();//变量初始化
voidset_timer();//定时器设置函数
//主函数-----------------------------------------------------
voidmain()
{
mcu_init();//单片机初始化
var_init();//变量初始化
set_timer();//设置定时器
_emi=1;//开总中断
while
(1)
{
//添加用户代码---------------------------
}
}
//mcu寄存器初始化---------------------------------------
voidmcu_init()
{
//振荡器相关说明:
中文手册38页
//_smod=0x03;//上电后默认值为0x03,选择高频振荡器fh作为系统时钟fsys
//中断寄存器相关说明:
中文手册150页
//_intc0=0;//上电后默认值为0
//_intc1=0;//上电后默认值为0
//_intc2=0;//上电后默认值为0
//芯片引脚排列相关说明:
中文手册6页
//输入/输出端口相关说明:
中文手册64页
//把所有的IO口都设置成为输出,请根据需要修改
//注意:
//很多引脚具有复用功能,有些引脚上电后默认不是普通的IO口功能,如A口,
//要把和对应IO口相关的特殊功能取消后才能作为普通IO口使用.
//测试当前IO口是不是普通的IO口功能的方法:
//把IO口先设置为输出高电平,并测试对应的IO是不是高电平,
//再把IO口设置为输出低电平,并测试对应的IO是不是低电平.
//取消A口8个引脚的AD输入功能
_acerl=0;//上电后默认值位0xff
//取消A0,A2,A3,A5的比较器输入输出功能
_cp0c=0;//上电后默认值0x81
_cp1c=0;//上电后默认值0x81
//设置IO口的方向和电平
_pa=0b11111111;
_pac=0b00000000;
_pb=0b00000000;
_pbc=0b00000000;
_pc=0b00000000;
_pcc=0b00000000;
_pd=0b00000000;
_pdc=0b00000000;
_pe=0b00000000;
_pec=0b00000000;
_pf=0b00000000;
_pfc=0b00000000;
}
//变量初始化-----------------------------------
voidvar_init()
{
//把所有的变量区都清为0-------------------------------
//方法1:
优点(代码量少),缺点(不够方法2简单明了)
//清BANK2,1,080H~FFH之间的变量区
_mp1=0x80;
while(_mp1!
=0x00)
{
_bp=2;
_iar1=0;//清bank2对应的空间
_bp=1;
_iar1=0;//清bank1对应的空间
_bp=0;
_iar1=0;//清bank0对应的空间
_mp1++;
}
/*
//方法2:
优点(简单明了),缺点(代码量多)
//清BANK280H~FFH之间的变量区
_mp1=0x80;
_bp=2;
while(_mp1!
=0x00)
{
_iar1=0;
_mp1++;
}
//清BANK180H~FFH之间的变量区
_mp1=0x80;
_bp=1;
while(_mp1!
=0x00)
{
_iar1=0;
_mp1++;
}
//清BANK080H~FFH之间的变量区
_mp0=0x80;
_bp=0;
while(_mp0!
=0x00)
{
_iar0=0;
_mp0++;
}
*/
//设置其他变量的值------------------------------
}
//设置定时器--------------------------------------
//定时器模块相关说明:
中文手册75页
voidset_timer()
{
//禁止所有TM的输入输出引脚,保持对应IO口原来的功能
_tmpc0=0;
_tmpc1=0;
//设置定时器0------------------------------------------------------
//已知总线时钟为高频振荡器的频率12M,
//设置定时溢出模式的时钟源为总线时钟,4分频,则定时器的驱动脉冲频率为3M
//中断频率=3M/tm0a=3M/375=8000
_tm0c0=0;//总线时钟4分频,停止
_tm0c1=0b11000001;//定时/计数器模式,TM0比较器A匹配清除计数器
//TM对应的3个16位寄存器读写时必须遵循以下的原则:
//写:
先写低字节,再写高字节
//读:
先读高字节,再读低字节
_tm0al=0x77;//先写低字节
_tm0ah=0x01;//再写高字节
_t0on=1;//启动定时器0
_t0ae=1;//定时器0比较器A匹配中断请求允许
_mf0e=1;//允许多功能中断0
}
//中断处理函数---------------------------
//注意:
TM0P,TM0A,TM2P,TM2A的中断都属于
//多功能中断M.Funct.0,对应的中断向量地址为0x14,
//因此,当这四种中断有2个或2个以上同时开启时,
//则在它们对应的中断函数中要判断中断请求标志
//才能够确定究竟是发生了什么中断.
//其他的多功能中断也要类似处理.
voidisr_timer0()//timer/event0
{
_t0af=0;//中断标志必须用指令清除
//蜂鸣器管理
/*
if(beep_time>0)
{
buzzer=!
buzzer;
}
else
{
buzzer=0;
}
*/
//溢出频率为8000(周期为0.125ms)
to_2ms++;
if(to_2ms>=16)
{
to_2ms=0;
//2ms平台----------------------
to_20ms++;
if(to_20ms>=10)
{
to_20ms=0;
//20ms平台----------------------
to_200ms++;
if(to_200ms>=10)
{
to_200ms=0;
//200ms平台----------------------
to_1s++;
if(to_1s>=5)
{
to_1s=0;
//1s平台----------------------
led=!
led;
to_1m++;
if(to_1m==60)
{
//分钟平台-----------------
to_1m=0;
to_1h++;
if(to_1h==60)
{
//小时平台-----------------
to_1h=0;
}
}
}
}
}
}
}