|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-6-27 12:58:22
|
显示全部楼层
/******************************************************************
本OS只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的Blog:http://hi.baidu.com/lyzhnagxiang
Chip Source.c file
作者:Lyzhangxiang
建立日期: 2010.05.08
版本:V1.0
Copyright(C) 安徽师范大学 Lyzhangxiang
*******************************************************************/
#include "REG51.H"
#define TL_Value 0xFF
#define TH_Value 0xFF
//每个指令的振荡周期数(4,6,12),注意,这里一定要仔细查看芯片手册
//*12 - 早期的8051、8052及当前的绝大部分51单片机
//*6 - Philips 的芯片
//*4 - Dallas
#define OSC_PER_INST (12)
//TIME 为定时时间 单位MS
#define PRELOAD1MS (65536 - 1*(UINT16)(Flck/(OSC_PER_INST*1000)))
#define PRELOAD5MS (65536 - 5*(UINT16)(Flck/(OSC_PER_INST*1000)))
/**************************Timer定时计数器*************************/
void Timer_init(void)
{
//TCON //"定时器控制寄存器"
//TF1 = 1; //"T1溢出标志"
//TR1 = 1; //"T1运行控制"
//TF0 = 1; //"T0溢出标志"
//TR0 = 1; //"T0运行控制"
//IE1 = 1; //"外部中断1申请标志"
//IT1 = 1; //"外部中断1触发方式 0=电平 1=边沿"
//IE0 = 1; //"外部中断0申请标志"
//IT0 = 1; //"外部中断0触发方式 0=电平 1=边沿"
//TMOD //"工作方式控制寄存器"
//定时器/计数器1
//GATA = 1; //"由外部中断请求信号(INT0或INT1)和TR的组合状态启动定时器"
//GATA = 0; //"由运行控制位TR启动定时器"
// C/T = 0; //"定时器工作方式"
// C/T = 0; //"计数器工作方式"
//M1M0 = 00; //"选择方式0 13位定时器/计数器工作方式"
//M1M0 = 01; //"选择方式1 16位定时器/计数器工作方式"
//M1M0 = 10; //"选择方式2 常数自动装入的8位定时器/计数器工作方式"
//M1M0 = 11; //"选择方式3 T1停止"
//定时器/计数器0
//GATA = 1; //"由外部中断请求信号(INT0或INT1)和TR的组合状态启动定时器"
//GATA = 0; //"由运行控制位TR启动定时器"
// C/T = 0; //"定时器工作方式"
// C/T = 0; //"计数器工作方式"
//M1M0 = 00; //"选择方式0 13位定时器/计数器工作方式"
//M1M0 = 01; //"选择方式1 16位定时器/计数器工作方式"
//M1M0 = 10; //"选择方式2 常数自动装入的8位定时器/计数器工作方式"
//M1M0 = 11; //"选择方式3 为两个8位定时器/计数器工程方式"
}
/**************************Uart串行通行****************************/
void Uart_init(void)
{
//SCON //"串行控制寄存器"
//SM0SM1 = 00; //"方式0 同步移位寄存器方式 Fclk/12"
//SM0SM1 = 01; //"方式1 8位Uart 定时器T1溢出率/n"
//SM0SM1 = 10; //"方式2 9位Uart 当SMOD=1时Fclk/32或当SMOD=0时Fclk/64"
//SM0SM1 = 11; //"方式3 9位Uart 定时器T1溢出率/n"
//关于定时器T1溢出率的注释:一般采用T1的方式2 TH1=256-Flck/(波特率*12*32/2^SMOD)
//PCON //"电源控制寄存器"
//SMOD=1 //"串行口波特率加倍,其余位未定义"
}
/****************************Delay软件延时******************************/
void Delay_ms(unsigned char k)
{
int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
//当K=1时延时1ms
void delay_ms(unsigned char a)
{
int i;
unsigned char i;
while(a-- !=0)
{
for(i=0;i<125;i++);
}
}
//当a=1时延时1ms
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//t取值20
/***********************Delay硬件延时(定时器)****************************/
void timer0_int(void) interrupt 1
{
TH0=TH_Value;
TL0=TL_Value;
while(TF0!=1);
{
TF0=0;
//添加相应的延时处理程序
}
}
/****************************定时器硬件延时******************************/
void start_Timeout1ms()
{
TH0 = PRELOAD1MS / 256;
TL0 = PRELOAD1MS % 256;
TF0 = 0 ;//清溢出标志位
ET0 = 0; //关定时器0的中断
TR0 = 1; //启动定时器
}
void start_Timeout5ms()
{
//TMOD = ;
TH0 = PRELOAD5MS / 256;
TL0 = PRELOAD5MS % 256;
TF0 = 0 ;//清溢出标志位
ET0 = 0; //关定时器0的中断
TR0 = 1; //启动定时器
}
void stop_Timeout()
{
TR0 = 0;
}
void Delay5ms()
{
start_Timeout5ms();
while(!_testbit_(TF0)); //等待T0超时
stop_Timeout();
}
void Delay1ms()
{
start_Timeout1ms();
while(!TF0); //等待T0超时
stop_Timeout();
} |
|