51单片机结构简单,架构体系完备,学习资料丰富,应用领域广泛。通过对51单片机的学习,可帮助小白实现快速入门电子设计,理解电路系统工作原理,为高级嵌入式芯片的学习及开发打下坚实基础。
本篇描述
1、51+Proteus8.10;
2、学习1302时钟芯片、1602液晶驱动;
仿真设计
采用Proteus作为仿真设计工具。Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,真正实现了从概念到产品的完整设计。
软件设计
采用Keil作为软件设计工具。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
#include#include #include #define uint unsigned int #define uchar unsigned char sbit DS1302_IO = P1^7; sbit DS1302_SCLK = P1^6; sbit DS1302_RST = P1^5; sbit LCD1602_RS = P2^0; sbit LCD1602_RW = P2^1; sbit LCD1602_EN = P2^2; uchar LCD_1[]={"DATE: 00-00-00 "}; uchar LCD_2[]={"TIME: 0000 "}; uchar DateTime[7]; void DelayMS(uint ms) { uchar i; while(ms--) { for(i=0;i<120;i++); } } uchar Get_A_Byte_FROM_DS1302() { uchar i,b=0x00; for(i=0;i<8;i++) { b |= _crol_((uchar)DS1302_IO,i); DS1302_SCLK=1; DS1302_SCLK=0; } return b/16*10+b%16; } void Write_A_Byte_TO_DS1302(uchar x) { uchar i; for(i=0;i<8;i++) { DS1302_IO=x&0x01; DS1302_SCLK=1; DS1302_SCLK=0; x>>=1; } } uchar Read_Data(uchar addr) { uchar dat; DS1302_RST = 0; DS1302_SCLK=0; DS1302_RST=1; Write_A_Byte_TO_DS1302(addr); dat = Get_A_Byte_FROM_DS1302(); DS1302_SCLK=1; DS1302_RST=0; return dat; } uchar Read_LCD_State() { uchar state; LCD1602_RS=0; LCD1602_RW=1; LCD1602_EN=1; DelayMS(1); state=P0; LCD1602_EN = 0; DelayMS(1); return state; } void LCD_Busy_Wait() { while((Read_LCD_State()&0x80)==0x80); DelayMS(5); } void Write_LCD_Data(uchar dat) { LCD_Busy_Wait(); LCD1602_RS=1; LCD1602_RW=0; LCD1602_EN=0; P0=dat; LCD1602_EN=1; DelayMS(1); LCD1602_EN=0; } void Write_LCD_Command(uchar cmd) { LCD_Busy_Wait(); LCD1602_RS=0; LCD1602_RW=0; LCD1602_EN=0; P0=cmd; LCD1602_EN=1; DelayMS(1); LCD1602_EN=0; } void Set_LCD_POS(uchar p) { Write_LCD_Command(p|0x80); } void Display_LCD_String(uchar p,uchar *s) { uchar i; Set_LCD_POS(p); for(i=0;i<16;i++) { Write_LCD_Data(s[i]); DelayMS(1); } } void Format_DateTime(uchar d,uchar *a) { a[0]=d/10+'0'; a[1]=d%10+'0'; } void Init_LCD() { Write_LCD_Command(0x38); DelayMS(1); Write_LCD_Command(0x01); DelayMS(1); Write_LCD_Command(0x06); DelayMS(1); Write_LCD_Command(0x0c); DelayMS(1); } void GetTime() { uchar i,addr = 0x81; for(i=0;i<7;i++) { DateTime[i]=Read_Data(addr);addr+=2; } } void main() { Init_LCD(); while(1) { GetTime(); Format_DateTime(DateTime[6],LCD_1+6); Format_DateTime(DateTime[4],LCD_1+9); Format_DateTime(DateTime[3],LCD_1+12); Format_DateTime(DateTime[2],LCD_2+6); Format_DateTime(DateTime[1],LCD_2+9); Format_DateTime(DateTime[0],LCD_2+12); Display_LCD_String(0x00,LCD_1); Display_LCD_String(0x40,LCD_2); } }
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !