程序内容:利用动态扫描和定时器1在数码管上
显示出从765432开始以1/10秒的速度往下递
减直至765398并保持显示此数,与此同时利用
定时器0以500MS速度进行流水灯从上至下移动,
当数码管上数减到停止时,实验板上流水灯也
停止然后全部开始闪烁,3秒后(用T0定时)流
水灯全部关闭、数码管上显示出“HELLO”。到此
保持住。
编写人:***
硬件支持:12MHz 、74hc595驱动数码管、对应YL-48开发板
时间: 2012.8.22
备注:参考郭天祥《十天学会单片机》
***************************************/
#include #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xc7,0xc7,0x86,0x}; // 共阳数码管位码值 unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char disbuf[]={7,6,5,0,0,0,10,11,12,13,14}; //数码管初值 sbit si=P2^2; sbit sclk=P2^4; sbit slck=P2^3; //void senda(); void send(); void out(); void init(); void delay (unsigned char h); uint temp,t0,t1,shu,flat,flat1; //flat为流水灯运行标志位、 flat1为数码管标志位 uchar m,n,num; main() { shu=432; // disbuf[3]=shu%10/10; // disbuf[4]=shu/10%10; // disbuf[5]=shu%10; init(); while(1) { if(flat1==0) //flat1为1,数码管递减中 { for(n=0,m=0;n<6,m<6;n++,m++) { send(); out(); } } // while(1); else //当数码管递减完后、显示hello { for(n=6,m=0;n<11,m<5;n++,m++) { send(); out(); } } } } void init() { temp=0xfe; P1=temp; TMOD=0x11; //定时器0、1 工作方式都为1 TH0=(65536-50000)/256; //定50ms的初值 TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; } void time0() interrupt 1 //定时器0 子函数 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(flat==0) { if(t0==10) { t0=0; temp=_crol_(temp,1); P1=temp; } } else { P1=0xff; TH0=(65536-50000)/256; // 重新定义初值 TL0=(65536-50000)%256; t0++; if(t0%10==0) P1=~P1; if(t0==60) { TR0=0; P1=0xff; flat1=1; } } } void time1() interrupt 3 //定时器1 子函数 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; t1++; if(t1==2) { t1=0; disbuf[3]=shu/100; disbuf[4]=shu/10%10; disbuf[5]=shu%10; shu--; if(shu==397) { TR1=0; flat=1; } // TR0=0; } } /*void senda(void) { uint a ; for(a=0;a<8;a++) { sclk=0; si=num&0x80; num=num<<1; sclk=1; } } */ void send(void) // 数据传输 { uchar a,b; // for(m=0;m<6;m++) // { if(b==0) { b++; num=wei[m]; for(a=0;a<8;a++) { sclk=0; si=num&0x80; num=num<<1; sclk=1; } // senda(); } if(b==1) { b--; num=duan[disbuf[n]]; for(a=0;a<8;a++) { sclk=0; si=num&0x80; num=num<<1; sclk=1; } // senda(); } // m++; // if(m==6) // m=0; } //} void out() // 数据输出 { slck=0; delay(50); slck=1; } void delay (uchar h) //延时0.1ms个单位 { while(h--); }