89c51单面机c语言时钟控制器编程
发布时间:2025-05-20 19:35:52 发布人:远客网络
一、89c51单面机c语言时钟控制器编程
方案1:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。
#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址
#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址
#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址
#define DSA XBYTE[0x8f0a]//实时时钟寄存器A
#define DSB XBYTE[0x8f0b]//实时时钟寄存器B
#define DSC XBYTE[0x8f0c]//实时时钟寄存器C
#define DSD XBYTE[0x8f0d]//实时时钟寄存器D
#define SECOND XBYTE[0x8f05]//实时时钟分报警
uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值
uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址
uchar xdata*addr=0x8f00;//实时时钟片选地址
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
//void delay( unsigned int number);
void init_ds(void);//实时时钟初始化
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日
uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
void init_ds(void)//实时时钟初始化
DSA=0x2f;//选时钟32.768kHz;中断周期500ms
DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许
*(addr+at[i])=dt[i];//置时标初值
void lcd_busy()//检测lcd忙程序
while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止
void lcd_cmd(uchar lcd_cmd)//写命令函数
void lcd_data(uchar lcd_data)//写数据函数
void lcd_moveto(uchar position)//确定显示位置
uchar temp;//为显示位置对应的地址
temp=(position+0x80-1);//为在第一行
temp=((position-16)+0xc0);//为第二行
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x38);//置功能:2行,5*7字符
lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动
lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁
void shizhong(void)//时钟的每一位取出来
使用芯片:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。
#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址
#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址
#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址
#define DSA XBYTE[0x8f0a]//实时时钟寄存器A
#define DSB XBYTE[0x8f0b]//实时时钟寄存器B
#define DSC XBYTE[0x8f0c]//实时时钟寄存器C
#define DSD XBYTE[0x8f0d]//实时时钟寄存器D
#define SECOND XBYTE[0x8f05]//实时时钟分报警
uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值
uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址
uchar xdata*addr=0x8f00;//实时时钟片选地址
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
//void delay( unsigned int number);
void init_ds(void);//实时时钟初始化
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日
uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
/*void delay1(uint x)//延时1ms程序
void delay( unsigned int number)
void init_ds(void)//实时时钟初始化
DSA=0x2f;//选时钟32.768kHz;中断周期500ms
DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许
*(addr+at[i])=dt[i];//置时标初值
void lcd_busy()//检测lcd忙程序
while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止
void lcd_cmd(uchar lcd_cmd)//写命令函数
void lcd_data(uchar lcd_data)//写数据函数
void lcd_moveto(uchar position)//确定显示位置
uchar temp;//为显示位置对应的地址
temp=(position+0x80-1);//为在第一行
temp=((position-16)+0xc0);//为第二行
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x38);//置功能:2行,5*7字符
lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动
lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁
void shizhong(void)//时钟的每一位取出来
case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;
case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;
case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;
case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;
case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;
case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;
case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;
方案2:用内部的定时器做数字钟,通过数码管显示出来
使用芯片:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。
#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址
#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址
#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址
#define DSA XBYTE[0x8f0a]//实时时钟寄存器A
#define DSB XBYTE[0x8f0b]//实时时钟寄存器B
#define DSC XBYTE[0x8f0c]//实时时钟寄存器C
#define DSD XBYTE[0x8f0d]//实时时钟寄存器D
#define SECOND XBYTE[0x8f05]//实时时钟分报警
uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值
uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址
uchar xdata*addr=0x8f00;//实时时钟片选地址
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
//void delay( unsigned int number);
void init_ds(void);//实时时钟初始化
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日
uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
/*void delay1(uint x)//延时1ms程序
void delay( unsigned int number)
void init_ds(void)//实时时钟初始化
DSA=0x2f;//选时钟32.768kHz;中断周期500ms
DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许
*(addr+at[i])=dt[i];//置时标初值
void lcd_busy()//检测lcd忙程序
while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止
void lcd_cmd(uchar lcd_cmd)//写命令函数
void lcd_data(uchar lcd_data)//写数据函数
void lcd_moveto(uchar position)//确定显示位置
uchar temp;//为显示位置对应的地址
temp=(position+0x80-1);//为在第一行
temp=((position-16)+0xc0);//为第二行
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x30);//置功能:1行,5*7字符
lcd_cmd(0x38);//置功能:2行,5*7字符
lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动
lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁
void shizhong(void)//时钟的每一位取出来
case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;
case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;
case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;
case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;
case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;
case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;
case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;
再给一个:用内部的定时器做数字钟,通过数码管显示出来。
uchar dispcode[]={ 0x3f,0x06,0x5b,0x4f,
0x39,0x5e,0x79,0x71,0x00};//定义0到F的段选码
uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//8位数码管的位选码
uchar dispbuf[8]={ 0,0,16,0,0,16,0,0};//定义一个缓冲区
for(j=248;j>0;j--);//延时检查是否是P0_0被按下
dispbuf[0]=second%10;//存放秒的个位
dispbuf[1]=second/10;//存放秒的十位
while(P0_0==0);//等待P0_0变高
void t0(void) interrupt 1 using 0//定时器0中断服务程序
P1=dispcode[dispbuf[dispbitcnt]];//为位选码
P3=dispbitcode[dispbitcnt];//为段选码
if(tcnt==4000)//此时有一秒钟了(4000*250us)
注:至于你说的蜂鸣器,这个很简单,在程序里设置一个标志位
sbit busy_louder在硬件连接上采用一个放大器与单片机的一个引脚相接即时到60秒时,计时器清零,同时标志位置位,即可~
二、vb与C语言的区别
1、C语言是一门通用计算机编程语言,广泛应用于底层开发,C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
2、VB是Microsoft公司开发的一种通用的基于对象的程序设计语言,为结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言,是一种可用于微软自家产品开发的语言。
3、VB和C语言都是程序开发中的一种语言,c语言不支持可视化编程,vb支持可视化编程。
4、VB和C语言均可完成任何一种开发需求;对于界面制作,c语言会变得很繁琐,vb则相对简单快捷;vb语言的语法要求不严格,可不先声明变量,c语言必须先声明后使用。
5、vb是一种事件驱动的程序结构,c语言的程序必须从一个main函数开始。
6、C语言它更高效,并且在嵌入式linux环境下支持更好,它的语言主要是以描述功能为主,而VB由于它更接近于脚本的同时是面向对象的语言。
7、c语言支持指针,而vb不支持;c语言入门相对较难,vb则很容易入门,但后续的深入学习c语言会变得相对容易。
三、西门子cfc语言如何给一个输入信号取反
西门子cfc语言给一个输入信号取反步骤:
1、打开西门子PLC编程软件,然后在项目树中选择【指令】并点击打开。
2、然后在项目树【指令】下拉菜单中选择【逻辑运算指令】并打开。
3、然后在【逻辑运算指令】中选择【取反字节】指令并点击打开。
4、将取反字节指令拖入到编辑器需要的位置并点击确定。
5、最后根据需要输入取反字节的变量参数,并点击确定,这样西门子PLC调用逻辑运算中的取反字节指令就设置成功了。