用单片机做个万年历为什么led不亮,用proteus做的。c语言的编程

用单片机做个万年历为什么led不亮,用proteus做的。c语言的编程,第1张

如那位老兄所说的两个问题先改正。

然后数码管用7SEG-MPX8-CC-BLUE,因为这个是共阴极数码管适合你的程序。

然后就能显示了,仅仅是能够显示哈,因为你程序还有其他问题(其中之一是位码应该取反才对,扫描反向或扫描口的高低位交换一下)。

需帮助加QQ:1055590241(狼牙)

ReadSetDS1302()这个函数还没有声明过原型,所以编译器不知道这个函数是个什么样的类型,需要什么样的参数。

你需要在程序开头部分声明其原型,即

unsigned char ReadSetDS1302(unsigned char);

之类。

undefined identifier是未定义的标志符,在程序内使用了没有被定义的标志符或者变量。

具体解决办法:找到未定义的标志符,对其进行赋值即可。

定义的是unsigned char num,在使用的时候,写成了NUM,也会出现同样的错误p1,undefined identifier:英文意思就是p1未定义,找不到p1编译出错。

扩展资料:

C语言单片机编程:

单片机软件设计使用C语言作为编程开发软件,采用模块化的程序结构。

设计了按键模块程序、RFID模块程序、日历时钟模块程序、GPRS模块程序、显示存储模块程序等,并编写系统主程序,将五个程序模块组合在一起,实现单片机控制系统的整体功能。

51单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是使用较广的单片机编程语言。

单片机的C语言采用C51编译器(简称C51)。有C51产生的目标代码短,运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用 。

参考资料来源:百度百科-单片机C语言编程

参考资料来源:百度百科-单片机编程器

DS_WriteBCDBata(0x80,second|0x80);

这个函数应该是把秒写到DS1302芯片的秒寄存器中,秒的寄存器的地址上80和81两个地址(寄存器0)。寄存器0中最高位 CH 是一个时钟停止标志位。如果时钟电路有备用电源,上电后,我们要先检测一下这一位,如果这一位是 0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是 1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果 Vcc1 悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是 1,我们可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的7 位高 3 位是秒的十位,低 4 位是秒的个位,这里再提请注意一次,DS1302 内部是 BCD 码,而秒的十位最大是 5,所以 3 个二进制位就够了。second|0x80后面的这个数据使用 | 符号就是把最高位CH变成1

/============================================================

使用1602液晶显示DS1302+S51时钟+温度显示

==============================================================

//更新历史:增加温度显示,调整时闪动。

// 增加零下温度显示

SMC1602A(162)模拟口线接线方式

连接线图:

---------------------------------------------------

|LCM-----51 | LCM-----51 | LCM------51 |

---------------------------------------------|

|DB0-----P10 | DB4-----P14 | RS-------P20 |

|DB1-----P11 | DB5-----P15 | RW-------P21 |

|DB2-----P12 | DB6-----P16 | E--------P22 |

|DB3-----P13 | DB7-----P17 | VLCD接1K电阻到GND|

---------------------------------------------------

DS1302 接线图

Vcc2 CLK I/O /RST

| | | |

--------------

| 8 7 6 5|

| DS1302 |

| |

| 1 2 3 4|

--------------

| | | |

VCC1 GND

1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00

8脚接后备电源,可以接老计算机主板上的36V电池,也可以通过二级管隔离接一个大容量电解电容

电压在25V以上即可维持

按键说明:1 共三个键,低电平有效

2 P04 和 P05 同时按:初始化

3 P06 端口按键:选择要调整的项目

4 P05 端口按键:增加;P04端口按键:减少

[注:AT89S51使用12M晶振]

=============================================================/

/#include <AT89x51h>/

#include <REGX51H>

#include <stringh>

#include<intrinsh>

#define LCM_RS P2_0 //定义引脚

#define LCM_RW P2_1

#define LCM_E P2_2

#define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#define uchar unsigned char

uchar id,timecount;

bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志

void Disp_line1(void); //显示屏幕第一行

void Disp_line2(void); //显示屏幕第二行

void id_case1_key();

// DS1302 时间显示定义部分

sbit T_CLK=P1^0;

sbit T_IO =P1^1;

sbit T_RST=P1^2;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

void Set(uchar,uchar); //根据选择调整相应项目

void RTInputByte(uchar); / 输入 1Byte /

uchar RTOutputByte(void); / 输出 1Byte /

void W1302(uchar, uchar); // 向DS1302写入一个字节

uchar R1302(uchar); // 从DS1302读出一个字节

void Set1302(unsigned char ); // 设置时间

bit sec,min,hour,year,mon,day,weekk; //闪烁标志位

//初始化后设置为:04年12月2日星期4 0点0分0秒

unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};

// 秒 分钟 小时 日 月 年 星期

// 18B20温度显示定义部分

sbit DQ=P3^3; //18B20 接P07口

typedef unsigned char byte;

typedef unsigned int word;

Read_Temperature(char,char);

void mychar(void);

void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应

// 05, 025, 0125

// 1602LCD驱动

void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadStatusLCM(void);

void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code DData);

void Delay5Ms(void);

void Delay400Ms(void);

unsigned char code week[]={"Week"};

void main(void)

{

Delay400Ms(); //启动等待,等LCM讲入工作状态

LCMInit(); //LCM初始化

Delay5Ms(); //延时片刻(可不要)

mychar(); //显示自定义字符

TMOD=0x01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;

TR0=1;

ET0=1;

W1302(0x90,0xa5);//打开充电二级管 一个二级管串联一个2K电阻

W1302(0x8e,0x80);//写保护,禁止写 *** 作

adjust_res(0x1f); //调整18B20的分辨率 0x1f:05; 0x3f:025; 0x5f:0125

while(1)

{

if ((P1_4|P1_5)==0) //初始化

{

Delay5Ms();

if ((P1_4|P1_5)==0) Set1302(inittime);

}

if (P1_6==0) // 设置和选择项目键

{

Delay5Ms();

if(P1_6==0){id++;if(id>7) id=0;}

while(P1_6==0);

}

switch(id)

{

case 0:

sec=0;

Disp_line1(); Disp_line2();

break;

case 1://年

year=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 2://月

year=0;mon=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 3://日

mon=0;day=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 4://星期

day=0;weekk=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 5://小时

weekk=0;hour=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 6://分钟

hour=0;min=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 7://秒

min=0;sec=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

}

}

}

//中断入口,冒号闪烁

void t0(void) interrupt 1 using 0

{

TH0=(65535-50000)/256; //50ms定时

TL0=(65535-50000)%256;

timecount++;

if(timecount>9)

{

timecount=0;

flag=~flag;

}

}

//id为1时的下一级选择

void id_case1_key()

{

if (P1_5==0) //增加

{

Delay5Ms();

if(P1_5==0) Set(id,0);

if(id!=7) while(P1_5==0);

}

if (P1_4==0) //减少

{

Delay5Ms();

if(P1_4==0) Set(id,1);

if(id!=7) while(P1_4==0);

}

}

//根据选择调整相应项目并写入DS1302

void Set(uchar sel,uchar sel_1)

{

signed char address,item;

signed char max,mini;

if(sel==7) {address=0x80; max=0;mini=0;} //秒

if(sel==6) {address=0x82; max=59;mini=0;} //分钟

if(sel==5) {address=0x84; max=23;mini=0;} //小时

if(sel==3) {address=0x86; max=31;mini=1;} //日

if(sel==2) {address=0x88; max=12;mini=1;} //月

if(sel==1) {address=0x8c; max=99;mini=0;} //年

if(sel==4) {address=0x8a; max=7; mini=1;} //星期

item=R1302(address+1)/1610+R1302(address+1)%16;

if (sel_1==0) item++; else item--;

if(item>max) item=mini;

if(item<mini) item=max;

W1302(0x8e,0x00);//允许写 *** 作

W1302(address,item/1016+item%10);

W1302(0x8e,0x80);//写保护,禁止写 *** 作

}

//屏幕显示第一行 时间和温度

void Disp_line1(void)

{

Read_Temperature(10,0); //温度显示

//冒号闪烁

if(flag==0)

{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}

else

{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}

if(sec==1) //秒闪烁标志位

{

if(flag==1)

{

DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒

DisplayOneChar(8,0,R1302(0x81)%16+0x30);

}

else

{

DisplayOneChar(7,0,0x20); //显示秒

DisplayOneChar(8,0,0x20);

}

}

else

{

DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒

DisplayOneChar(8,0,R1302(0x81)%16+0x30);

}

if(min==1) //分钟闪烁标志位

{

if(flag==1)

{

DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟

DisplayOneChar(5,0,R1302(0x83)%16+0x30);

}

else

{

DisplayOneChar(4,0,0x20); //显示分钟

DisplayOneChar(5,0,0x20);

}

}

else

{

DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟

DisplayOneChar(5,0,R1302(0x83)%16+0x30);

}

if(hour==1) //小时闪烁标志位

{

if(flag==1)

{

DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时

DisplayOneChar(2,0,R1302(0x85)%16+0x30);

}

else

{

DisplayOneChar(1,0,0x20); //显示小时

DisplayOneChar(2,0,0x20);

}

}

else

{

DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时

DisplayOneChar(2,0,R1302(0x85)%16+0x30);

}

}

// 屏幕显示第二行 日期和星期

void Disp_line2(void)

{

DisplayOneChar(3,1,0x2f); //显示固定字符

DisplayOneChar(6,1,0x2f);

DisplayListChar(10,1,week);

if(year==1) //年闪烁标志位

{

if(flag==1)

{

DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年

DisplayOneChar(2,1,R1302(0x8d)%16+0x30);

}

else

{

DisplayOneChar(1,1,0x20); //显示年

DisplayOneChar(2,1,0x20);

}

}

else

{

DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年

DisplayOneChar(2,1,R1302(0x8d)%16+0x30);

}

if(mon==1) //月闪烁标志位

{

if(flag==1)

{

DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月

DisplayOneChar(5,1,R1302(0x89)%16+0x30);

}

else

{

DisplayOneChar(4,1,0x20); //显示月

DisplayOneChar(5,1,0x20);

}

}

else

{

DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月

DisplayOneChar(5,1,R1302(0x89)%16+0x30);

}

if(day==1) //日闪烁标志位

{

if(flag==1)

{

DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日

DisplayOneChar(8,1,R1302(0x87)%16+0x30);

}

else

{

DisplayOneChar(7,1,0x20); //显示日

DisplayOneChar(8,1,0x20);

}

}

else

{

DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日

DisplayOneChar(8,1,R1302(0x87)%16+0x30);

}

if(weekk==1) //星期闪烁标志位

{

if(flag==1)

{

DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期

}

else

{

DisplayOneChar(15,1,0x20); //显示星期

}

}

else

{

DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期

}

}

// LCM1602驱动程序

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时

LCM_E = 0; //延时

LCM_E = 1;

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

{

if (BuysC) ReadStatusLCM(); //根据需要检测忙

LCM_Data = WCLCM;

LCM_RS = 0;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

}

//读状态

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号

return(LCM_Data);

}

//LCM初始化

void LCMInit(void)

{

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1); //关闭显示

WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置

WriteCommandLCM(0x0C,1); // 显示开及光标设置

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//按指定位置显示一串字符 原来的遇到空格0x20就不显示

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code DData)

{

unsigned char ListLength,j;

ListLength = strlen(DData);

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (X <= 0xF) //X坐标应小于0xF

{

for(j=0;j<ListLength;j++)

{

DisplayOneChar(X, Y, DData[j]); //显示单个字符

X++;

}

}

}

//5ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

以上就是关于用单片机做个万年历为什么led不亮,用proteus做的。c语言的编程全部的内容,包括:用单片机做个万年历为什么led不亮,用proteus做的。c语言的编程、4.c(131): warning C206: 'ReadSetDS1302': missing function-prototype Keil c51单片机万年历、单片机C语言编程p1, undefined identifier什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9447042.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存