1 include reg 52 h define uchar unsigned

  • Slides: 12
Download presentation

简易时钟制作 三、程序分析-1 /* 显示程序 */ #include "reg 52. h" //调用头文件 #define uchar unsigned char

简易时钟制作 三、程序分析-1 /* 显示程序 */ #include "reg 52. h" //调用头文件 #define uchar unsigned char 本程序是 8位数码 #define uint unsigned int 管的显示程序 #define seg_dat P 0 //定义数据口接至P 0口 sbit cs 1=P 2^0; //段选接至P 2. 0 sbit cs 2=P 2^1; //位选接至P 2. 1 sbit wr=P 2^2; //使能端接至P 2. 2 void elect(bit b) //打开段选或打开位选 { wr=1; if(b)cs 2=0; else cs 1=0; wr=0; if(b)cs 2=1; else cs 1=1; } 5

简易时钟制作 三、程序分析-2 //数码管显示代码 0 1 2 3 4 5 6 7 8 9 uchar

简易时钟制作 三、程序分析-2 //数码管显示代码 0 1 2 3 4 5 6 7 8 9 uchar code disp_code[]={0 xc 0, 0 xf 9, 0 xa 4, 0 xb 0, 0 x 99, 0 x 92, 0 x 82, 0 xf 8, 0 x 80, 0 x 90, 0 xbf}; //数码管扫描代码 uchar code scan_code[]={0 x 7 f, 0 xbf, 0 xdf, 0 xef, 0 xf 7, 0 xfb, 0 xfd, 0 xfe}; uchar disp_buffer[]={1, 2, 10, 0, 0}; //显示缓冲 uchar scan=0; //扫描 void delayms(uchar ms) //延时子程序 { uchar us; while(ms--)for(us=0; us<120; us++); } void seg_disp(uchar site, uchar hour, uchar min, uchar sec) //显示子程序 { disp_buffer[0]=hour/10; disp_buffer[1]=hour%10; disp_buffer[3]=min/10; disp_buffer[4]=min%10; disp_buffer[6]=sec/10; disp_buffer[7]=sec%10; seg_dat=0 xff; elect(0); elect(1); //清屏 6

简易时钟制作 三、程序分析-3 //输出段码 if((site<<scan&0 x 80)==0 x 80)seg_dat=disp_code[disp_ buffer[scan]]; else seg_dat=0 xff; elect(0); //输出位码

简易时钟制作 三、程序分析-3 //输出段码 if((site<<scan&0 x 80)==0 x 80)seg_dat=disp_code[disp_ buffer[scan]]; else seg_dat=0 xff; elect(0); //输出位码 if((site<<scan&0 x 80)==0 x 80)seg_dat=scan_code[scan] ; else seg_dat=0 xff; elect(1); scan=scan<7? scan+1: 0; //扫描哪一位数码管 delayms(2); //延时 } 7

简易时钟制作 三、程序分析-5 void main() //主程序 { IE=0 X 82; //打开总中断,开定时器Timer 0中断 TMOD=0 X 01;

简易时钟制作 三、程序分析-5 void main() //主程序 { IE=0 X 82; //打开总中断,开定时器Timer 0中断 TMOD=0 X 01; //设Timer 0为内部 16位定时器 //设定 2 ms定时初值 TH 0=(65536 -50000)/256; TL 0=(65536 -50000)%256; TR 0=1; //启动Timer 0 while(1) { if(sb 1==0) { if(k==1&&hour<23)hour++; else if(k==2&&min<59)min++; else if(k==3&&sec<59)sec++; 程序 while(sb 1==0)seg_disp(tab[k], hour, min, sec); //调用显示 } 9

简易时钟制作 三、程序分析-6 示程序 } else if(sb 2==0) { if(k==1&&hour>0)hour--; else if(k==2&&min>0)min--; else if(k==3&&sec>0)sec--; while(sb

简易时钟制作 三、程序分析-6 示程序 } else if(sb 2==0) { if(k==1&&hour>0)hour--; else if(k==2&&min>0)min--; else if(k==3&&sec>0)sec--; while(sb 2==0)seg_disp(tab[k], hour, min, sec); //调用显 } else if(sb 3==0) { k 1=k 1<3? k 1+1: 0; while(sb 3==0)seg_disp(tab[k], hour, min, sec); //调用显 } } seg_disp(tab[k], hour, min, sec); //调用显示程序 10

简易时钟制作 三、程序分析-7 void Timer 0(void)interrupt 1 //Timer 0 定时器程序 { TH 0=(65536 -50000)/256; TL

简易时钟制作 三、程序分析-7 void Timer 0(void)interrupt 1 //Timer 0 定时器程序 { TH 0=(65536 -50000)/256; TL 0=(65536 -50000)%256; t++; //计数递增 if(t%5==0) //闪烁 { flag=~flag; if(flag==0)k=0; else k=k 1; } if(t==20) //秒/分/时递增 { t=0; if(++sec==60) { sec=0; if(++min==60) { min=0; if(++hour==24)hour=0; } } 11