//------------------------------------------------------------------
//File name : Test_PWM.c
//Computer : Mxtronics
//Author : like
//Purpose : 实现通过串口发送start和endtm命令来,改变RTC3~0寄存器里的值,并通过串口返回RTC计时状态
// 请使用串口调试工具调试,并采用ASCⅡ字符输入!
// 注:RTC寄存器应从高位向低位写入初值,试验时把RxD、TxD和PC机相连,
// 在11.0592M晶振下只能应用baudrate=600bps;
//Sysclk : 11.0592MHz
//Version : 1.00
//Last modified : 2009-04-08
//------------------------------------------------------------------
/***************************************************************
用串口命令功能:
start + "\n"(换行) 开始计时
endtm + "\n"(换行) 结束计时
必须按照上述格式输入命令
***************************************************************/
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include "REG8051.h"
#define XTAL 11059200 //CPU sysclock
#define baudrate 600 //serial baudrate
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Sign_COM 'A' //寄存器命令标志位
char Sign_start[6]={0x73,0x74,0x61,0x72,0x74,0x00}; /*start*/ //开始计时命令
char Sign_end[6]={0x65,0x6E,0x64,0x74,0x6D,0x00}; /*endtm*/ //结束计时命令
#define OLEN 8 //串行发送缓冲区的大小
uchar ostart; //发送缓冲区起始索引
uchar oend; //发送缓冲区结束索引
char idata outbuf[OLEN]; //发送缓冲区的存储
#define ILEN 32 //串行接收缓冲区的大小
uchar istart; //接收缓冲区起始索引
uchar iend; //接收缓冲区结束索引
char idata inbuf[ILEN]; //接收缓冲区的存储
bit sendfull; //标志:标识发送缓冲区满
bit sendactive; //标志:标识发送器激活
bit sign_count; //标志:标识开始计时
sbit a=P1^0; //标志:标识程序运行状态
/* 串行中断服务程序 */
static void com_isr(void) interrupt 4 using 1{
char c;//定义变量
if(RI)//若接收
{
c=SBUF;//把变量储存到SBUF中
RI=0;//软件置0
if(istart+ILEN!=iend)//如果接收缓冲区索引加上缓冲区的大小不等于接收缓冲区结束索引
{
inbuf[iend++&(ILEN-1)]=c;//条件满足时把变量付给表达式运算
}
}
if(TI!=0)//如果发送值不为0
{
TI=0;//软件置0
if(ostart!=oend)//如果发缓冲区索引加上缓冲区的大小不等于发送缓冲区结束索引
{
SBUF=outbuf[ostart++&(OLEN-1)];//把条件满足值付给寄存器
sendfull=0;//标志缓冲满后软件情0
}
else{
sendactive=0;//激活标志发送器
}
}
}
/* 初始化串行口和UART波特率函数 */
void com_int(void){
istart=0; //接收缓冲区索引起始初始化为0
iend=0; //接收缓冲区结束索引初始化为0
ostart=0; //发送缓冲区起始索引初始化为0
oend=0; //发送缓冲区结束索引初始化为0
sendactive=0; //标志发送器激活初始化为0
sendfull=0; //标识发送缓冲区满初始化为0
sign_count=0;//标识开始计时
TMOD=0x20;
TH1=(uchar)(256-(XTAL/(32L*12L*baudrate)));
TL1=0xDD;
TR1=1;
SCON=0x50;
PCON&=0x7F;/* 初始化串口,采用8M外部晶振,串口波特率=595bps */
ES=1; /* 使能串口中断和外部中断0 */
}
/* putbuf:写字符到SBUF或发送缓冲区 */
void putbuf(char c){
if(!sendfull){
if(!sendactive){
sendactive=1;
SBUF=c;
}
else{
ES=0;
outbuf[oend++&(OLEN-1)]=c;
if(((oend^ostart)&(OLEN-1))==0){
sendfull=1;
}
ES=1;
}
}
}
/* 替换标准库函数putchar程序 */
/* pringf函数使用putchar输出一个字符 */
char putchar(char c){
if(c=='\n'){
while(sendfull);
putbuf(0x0D);
}
while(sendfull);
putbuf(c);
return(c);
}
/* 替换标准库函数_getchar程序 */
/* getchar和gets函数使用_getkey来读字符 */
char _getkey(void){
char c;
while(iend==istart){
_nop_();
}
ES=0;
c=inbuf[istart++&(ILEN-1)];
ES=1;
return(c);
}
/* 延时函数(ms) */
void delay_ms(uint ms){ /* 主时钟为11.0592M时,延时单位为ms */
uint j,k;
for(j=0;j<ms;j++)
{
for(k=0;k<1285;k++){}
}
}
/* 处理串行口命令 */
void disposecom(char buf[6]){
ulong count,addtm;
uint sec,min,hour;
if(*buf==*Sign_start){
sign_count=1;
RTC3=0;
RTC2=0;
RTC1=0;
RTC0=0;
}
else if(*buf==*Sign_end){
if((RTC3!=0)||(!sign_count)){
printf("\nTimer out or never start!\n");}
else{
sign_count=0;
count=RTC2;
count<<=16;
addtm=RTC1;
addtm<<=8;
count=count+addtm+RTC0;
sec=(uint)(count%60);
min=(uint)(count%3600)/60;
hour=(uint)(count/3600);
printf("\nTimer is %02u:%02u:%02u\n",hour,min,sec);
}
}
else{
printf("\nPlease input command by rule!\n");
}
}
/* C主函数启动中断驱动的串行I/O */
void main(){
char com_buf[6];
PCON|=0x02; /* 外部时钟 */
EA=1;
com_int();
while(1){
a=!a;
gets(com_buf,6);
delay_ms(100);
istart=iend;
disposecom(com_buf);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
test_uart_rtc.rar_32768_RTC
共12个文件
bak:2个
h:1个
obj:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 64 浏览量
2022-09-19
16:48:25
上传
评论
收藏 23KB RAR 举报
温馨提示
RTC程序的编写,是一个主控时钟32768时钟调试
资源详情
资源评论
资源推荐
收起资源包目录
test_uart_rtc.rar (12个子文件)
test_uart_rtc
test_uart_rtc.lnp 34B
test_uart_rtc.Opt 973B
test.c 5KB
test.OBJ 12KB
test_uart_rtc.Uv2 2KB
test_uart_rtc.plg 498B
REG8051.h 8KB
test_uart_rtc_Opt.Bak 975B
test.LST 11KB
test_uart_rtc.M51 14KB
test_uart_rtc 12KB
test_uart_rtc_Uv2.Bak 2KB
共 12 条
- 1
周楷雯
- 粉丝: 80
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0