这是我在学习了中断和LCD12864液晶后,将两者结合写出来的程序,实现了999倒计时功能,和计数器的功能。程序注释完整可用,适合学51单片机的新手,希望大家多多参考学习哦~
单片机源程序如下:
- /*看书的时候要十分重点去看寄存器,看到前面我刚开始也是看完之后似懂非懂,我就一直看一直看反复记忆,等觉得自己差不多了就开始看中断程序,看了程序之后,我的天哪其实定时器初始化要写的东西并不多,程序比那些复杂的文字要简单多了,再加上程序后面的分析,我差不多就理解了,之后就用四位数码管编写了一个分秒程序,程序没有错误没有警告但是运行不了,找师兄看过之后他叫我不要深究在这里让我去做定时器液晶,现在想想可能程序还是有点问题等有空再深究一下,不然怎么别人的可以用数码管而我的不行呢。
- 我把程序写出来之后不行,我是这么写显示的放在主函数中
- Write1_XY_string(2,0,"shi");
- 我知道可能是这里有了问题可我不会改,不知道如何下手,杨铭师兄就帮我改成了
- Set1_XY(2,0);
- write_date(0x30+shi/10);
- 就可以运行了,因为这些要转化成十进制的数要加上0x30所以要用这样写来转换。
- 后来师兄想让我做两个定时器,一个是时钟一个是定时的,他把思路告诉我了,后来我写出来程序是OK的,其实理解了中断之后多一个少一个都是一样的。
- 我在写的时候用上了那些C语言的符号
- else if(miao1==0&&fen1!=0)
- 我感觉这些很好用的,之前我是不会用的,慢慢的突然就想到就会用了哈哈,定时器我是写程序的时候真的是走的挺快的因为没有出现什么错误,所以我也不知道总结点什么,看书的时候多看看重点“寄存器”吧一定要看懂才行的。
- 我会继续加油的!*/
- /***** 液晶12864头文件 *****/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit LCD_RS=P2^4; //片选信号
- sbit LCD_RW=P2^5; //数据信号
- sbit LCD_EN=P2^6; //时钟信号
- sbit LCD_PSB=P2^7; //串、并行选择信号
- uchar shi=00,fen=00,miao=00,num,shi1=99,fen1=99,miao1=99,num1;
- /*延时函数 延时xms*/
- void delay(uchar xms)
- {
- uchar x,y;
- for(x=xms;x>0;x--)
- for(y=12;y>0;y--);
- }
- /*以串行协议把数据按位发送,相当于使用并行时接通八个DI口*/
- void send_bit(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD_RW=((byte<<i)&0x80);
- LCD_EN=0; //不加延时,串口中每输送一个数据都有要有个跳变沿,因此速度很快不需延时
- LCD_EN=1;
- }
- delay(5);
- }
- /*写串口命令函数 */
- void write_com(uchar com)
- {
- LCD_RS=1; //串口中只要进行数据操作RS就将拉高
- send_bit(0xf8); //第一字节输入写指令
- send_bit(com&0xf0); //第二字节发送高四位
- send_bit((com<<4)&0xf0); //第三字节发送低四位
- delay(5);
- LCD_RS=0;
- }
- /*写数据命令函数*/
- void write_date(uchar date)
- {
- LCD_RS=1;
- send_bit(0xfa); //发送数据识别码
- send_bit(date&0xf0); //发送高四位
- send_bit((date<<4)&0xf0); //发送低四位
- delay(5);
- LCD_RS=0;
- }
- /*********液晶初始化*********/
- void lcd_init()
- {
- LCD_PSB=0; //串口
- LCD_EN=0;
- write_com(0x30); //基本指令操作 //可加延时也可不加,一般来说液晶都是稳定的
- write_com(0x0c); //开显示,关光标,反白关
- write_com(0x06); //设置显示格式,光标位置
- write_com(0x01); //清除显示,将DDRAM的地址计数器归零
- }
- ///*********设定显示位置************/
- void Set1_XY(uchar X, uchar Y)
- {
- switch(X)
- {
- case 1:write_com(0x80+Y); break; //当X为1时执行此程序,在第一行输入
- case 2:write_com(0x90+Y); break; //第二行
- case 3:write_com(0x88+Y); break; //等三行
- case 4:write_com(0x98+Y); break; //第四行
- }
-
-
- }
- //
- ///************写字符串***************/
- //
- void Write1_XY_string(uchar X, uchar Y, uchar *str)
- {
- uchar temp;
- Set1_XY(X,Y);
- temp=*str;
- while(temp!=0)
- {
- write_date(temp); //输出字符
- temp=*(++str);
- }
- }
- //
- ////**************************************************//
- //
- ///************液晶显示*************/
- //
- void display1()
- {
- Write1_XY_string(1,0,"北京时间,");
- Write1_XY_string(2,0," ");
- Write1_XY_string(3,0,"天气阴");
- Write1_XY_string(4,0," ");
- }
- void main()
- {
-
- TMOD=0X10; //设置定时器工作方式
- TH0=(65536-45872)/256; //装初值
- TL0=(65536-45872)%256;
- TH1=(65536-45872)/256; //装初值
- TL1=(65536-45872)%256;
- EA=1; //全局中断,打开全局中断
- ET0=1; //定时器中断允许位 ,打开T1中断
- ET1=1;
- TR0=1; //启动定时器0.INT1电平由高到低
- TR1=1;
- lcd_init(); //调用
- display1();
- while(1)
- {
- // Write1_XY_string(2,0,"shi");
- // Write1_XY_string(2,2,":");
- // Write1_XY_string(2,3,"fen");
- // Write1_XY_string(2,5,":");
- // Write1_XY_string(2,6,"miao/10");
- Set1_XY(2,0);
- write_date(0x30+shi/10);
- write_date(0x30+shi%10);
- Set1_XY(2,2);
- write_date(':');
- Set1_XY(2,3);
- write_date(0x30+fen/10);
- write_date(0x30+fen%10);
- Set1_XY(2,5);
- write_date(':');
- Set1_XY(2,6);
- write_date(0x30+miao/10);
- write_date(0x30+miao%10);
- //********************************************//
- Set1_XY(4,0);
- write_date(0x30+shi1/100);
- write_date(0x30+shi1%100/10);
- write_date(0x30+shi1%10);
- Set1_XY(4,2);
- write_date(':');
- Set1_XY(4,3);
- write_date(0x30+fen1/100);
- write_date(0x30+fen1%100/10);
- write_date(0x30+fen1%10);
- Set1_XY(4,5);
- write_date(':');
- Set1_XY(4,6);
- write_date(0x30+miao1/100);
- write_date(0x30+miao1%100/10);
- write_date(0x30+miao1%10);
- }
- }
- void time()interrupt 1
- {
- TH0=(65536-45872)/256; //重装初值
- TL0=(65536-45872)%256;
- num++;
- if(num==20)
- {
- num=0;
- miao++;
- if(miao==60)
- {
- fen++;
- miao=0;
- if(fen==60)
- {
- shi++;
- fen=0;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- }
- }
- //************************************************************//
- void time1()interrupt 3
- {
- TH1=(65536-45872)/256; //重装初值
- TL1=(65536-45872)%256;
- num1++;
- if(num1==20)
- {
- num1=0;
- if(miao1!=0)
- {
- miao1--;
- }
- else if(miao1==0&&fen1!=0)
- {
- fen1--;
- }
- else if(fen1==0&&shi1!=0)
- {
- shi1--;
- }
- if(shi1==0)
- {
- shi1=99;
- fen1=99;
- miao1=99;
- }
- }
- }
复制代码
以上程序51hei提供下载:
中断液晶两个定时器.zip
(34.85 KB, 下载次数: 22)
|