c代码和仿真文件 毫秒级的秒表.zip
(131.34 KB, 售价: 1 E币)
单片机部分代码:(完整代码和仿真文件见本帖附件)
- #include <AT89X52.H>
- #define uint unsigned int //宏定义无符号整型数据
- #define uchar unsigned char //宏定义无符号字符型数据
- sbit key1=P3^6; //按键
- sbit led=P1^0; //灯
- sbit ledc=P1^1; //灯
- uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中断计时变量
- bit stop=0; //停止标志
- void display(); //显示程序声明
- void keyscan(); //按键扫描程序声明
- /**************************************
- 1602液晶
- **************************************/
- sbit RS = P2^5;
- sbit RW = P2^6;
- sbit E = P2^7;
- /**********************************************************
- 函数说明: 延时程序
- **********************************************************/
- void delay(uchar t)
- {
- uint j;
- uchar i;
- for(i=0;i<t;i++)
- for(j=0;j<1000;j++);
- }
- /**************************************
- 短延时
- **************************************/
- void delay5ms()
- {
- uchar i,v,k;
- for(i=1;i>0;i--)
- for(v=168;v>0;v--)
- for(k=22;k>0;k--);
- }
- /**************************************
- 写指令
- **************************************/
- void lcd_Write_com(uchar com)
- {
- RS=0; //定义指令寄存器
- RW=0; //写允许
- P0=com; //写指令
- delay5ms(); E=1; //片选端上拉
- delay5ms(); E=0; //下降沿锁存
- }
- /**************************************
- 写数据
- **************************************/
- void lcd_write_date(uchar date)
- {
- RS=1; //定义数据寄存器
- RW=0; //写允许
- P0=date; //写数据
- delay5ms(); E=1; //片选端上拉
- delay5ms(); E=0; //下降沿锁存
- }
- /**************************************
- 显示程序
- **************************************/
- void dis_lcd1602(uchar x,uchar y,uchar dat)
- {
- uchar add;
- if(y==1) add=(0x80+x);
- if(y==2) add=(0xc0+x);
- lcd_Write_com(add); //写指令
- lcd_write_date(dat); //写数据
- }
- /**************************************
- 液晶初始化
- **************************************/
- void lcd1602_init()
- {
- lcd_Write_com(0x38); //设置8位格式,2行,5*7
- lcd_Write_com(0x01); //清屏
- lcd_Write_com(0x0c); //整体显示,关光标,不闪烁
- lcd_Write_com(0x06); //设定输入方式,增量不移位
- lcd_Write_com(0x80); //初始坐标
- }
- /**************************************
- 液晶显示汉字程序
- **************************************/
- void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
- {
- uchar i=0,temp;
- if(x)temp = 0x40; else temp = 0;
- for(i=y;*p!='\0';i++,p++)
- {
- lcd_Write_com(i|0x80+temp);
- lcd_write_date(*p);
- delay5ms();
- }
- }
- /**************************************
- 液晶显示数字程序
- **************************************/
- void num_lcdDis(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang); //从个位开始显示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- void num_lcdDis1_1(uint num)//input 电压 整数部分
- {
- uint i,temp,x;
- x=5;
- for(i=0;i<2;i++)
- { x--;
- lcd_Write_com(0x80+x); //写指令
- temp = num%10+0x30;
- lcd_write_date(temp);// 写数据
- num/=10;
- }
- }
- /**************************************
- 液晶显示数字程序
- **************************************/
- void num_lcdDisx(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;
- else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang);//从个位开始显示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- /***********按键扫描程序****************/
- void keyscan()
- {
- static uint count2=0,count1=0; //计数变量
- static bit key_sign=0; //按键自锁标志
- if(key1==0) //检测按键为0
- { delay(50);
- if(key1==0){
- count1++;
- stop=!stop;
-
- }
- //计数延时消抖
-
- }
- else
- {
- count1=0; //计数变量清0
- }
- }
- /***********定时器初始化程序****************/
- void Timer0Init(void) //2.5毫秒@11.0592MHz
- {
- TMOD = 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xF7; //设置定时初值
- TR0 = 1; //定时器0开始计时
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- }
- /***************主程序****************/
- void main()
- {
- int cm=0;
- Timer0Init(); //定时器初始化
- lcd1602_init();//液晶初始化
- hz_lcdDis(0,0,"Timer system"); //启动电源
- hz_lcdDis(1,7,": :"); //欢迎你
- led=1;
- while(1)
- {
- // Cnt1min Cnt1s Cnt10ms
- num_lcdDis(1,5,Cnt1min,2);
- num_lcdDis(1,8,Cnt1s,2);
- num_lcdDis(1,11,Cnt10ms,2);
- if(Cnt1min>9){
- led=0;
- }
-
- keyscan(); //按键扫描
- }
- }
- /**************中断服务程序*****************/
- void timer0() interrupt 1 //2.5毫秒@11.0592MHz
- {
- TL0 = 0x00; //设置定时初值
- TH0 = 0xF7; //设置定时初值
- Cntus++; //中断变量Cntus自+1
- if(Cntus>=4) //10ms
- {
- Cntus=0; //清0
- if(stop==1) //启动
- Cnt10ms++; //10毫秒计数
- if(Cnt10ms>=100)
- {
- Cnt10ms=0;
- ledc=!ledc;
- Cnt1s++;
- //秒计数
- if(Cnt1s>=60)
- {
- Cnt1s=0;
- Cnt1min++; //分计数
- if(Cnt1min>=100)
- Cnt1min=0;
- }
- }
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|