初级会员
- 积分
- 138
- 金钱
- 138
- 注册时间
- 2015-12-30
- 在线时间
- 37 小时
|
发表于 2016-7-8 16:20:41
|
显示全部楼层
[mw_shl_code=applescript,true]#include<stc12c5a60s2.h>
#include<LCD1602.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^0; //DS1302始终控制总线
sbit DATA=P1^1; //DS1302数据传输总线
sbit RESET=P1^2; //DS1302复位总线
uchar table2[8];
uchar second,minute,hour,day,month,year; //定义秒分时日月年变量
void delay1ms(void) //误差 -0.018084490741us
{
unsigned char a,b;
for(b=18;b>0;b--)
for(a=152;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delaynms(uchar m)
{
while(m--)
{
delay1ms();
}
}
/***********************
延时函数
***********************/
void delay()
{
_nop_();
_nop_();
}
/*******************************
单片机小精灵生成的延时1us代码
*******************************/
void delay1us(void) //误差 -0.005353009259us
{
unsigned char a;
for(a=1;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
/***********************************
延时nus
***********************************/
void delaynus(uint i)
{
while(i--)
{
delay1us();
}
}
/************************************
函数功能:串口初始化
波特率:2400
工作方式:工作方式1
************************************/
void UART_Init()
{
TMOD=0x20; //定时器1工作方式2 八位自动重装模式
TL1=0xF4; //波特率2400
TH1=0xF4; //
TR1=1; //开启定时器1
SM0=0;
SM1=1; //串行口通信方式1 八位uart 波特率可变
REN=1; // 允许串行口接收
ES=0; //关闭串行口中断
}
/************************************
ADC 初始化
************************************/
void ADC_Init()
{
P1M0=0x08; //P1.3开漏模式0000 1000 P1.3 因为按键用到了P1.4-P1.7 而时钟用到了P10-P12
P1M1=0x08; //P1.0开漏
ADC_CONTR&=0xF8; //设置转换速度最快
ADC_CONTR|=0x03; //设置P1.3引脚为输入模拟量
delaynms(5); //等待输入稳定
}
uchar AD_Change()
{
uchar result;
ADC_CONTR|=0x88; //启动转换
while((ADC_CONTR&0x10)==0); //等待转换结束
ADC_CONTR&=0xE7; //清标志位,停止AD转换
result=ADC_RES;
result<<=2;
result=result+(ADC_RESL&0x03); //结果只取高八位
return (result);
}
/*****************************
向DS1302中写入一个字节的函数
*****************************/
void DS1302_WriteByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
delay(); //延时等待
dat >>= 1; //移出数据
DATA = CY; //送出到端口
SCLK = 1; //时钟线拉高
delay(); //延时等待
}
}
/**************************************
从DS1302读1字节数据
**************************************/
uchar DS1302_ReadByte()
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
delay(); //延时等待
dat >>= 1; //数据右移一位
if (DATA) dat |= 0x80; //读取数据
SCLK = 1; //时钟线拉高
delay(); //延时等待
}
return dat;
}
/**********************************
向DS1302某个地址写入一个数据
**********************************/
void WriteDat(uchar Addr,uchar Data)
{
RESET=0;
SCLK=0;
RESET=1;
delaynus(2); //延时2us 使硬件做好准备
DS1302_WriteByte(Addr); //写入命令字
DS1302_WriteByte(Data); //写入数据
SCLK=1;
RESET=0; //禁止数据传输
}
/************************************
函数功能:从1302某个地址读取一个字节的数据
*************************** C*********/
uchar ReadDat(uchar Addr)
{
unsigned char dat;
RESET=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RESET=1; //启动数据传输
DS1302_WriteByte(Addr); //写入命令字
dat=DS1302_ReadByte(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RESET=0; //禁止数据传递
return dat; //将读出的数据返回
}
[/mw_shl_code] |
|