本帖最后由 704292306 于 2012-12-12 12:56 编辑
/* 编写人:曾文豪杰 编写时间:2012年10月13日 硬件环境:STC89C52单片机,12M晶振,2块74HC573锁存器,4位一体共阴数码管。两个触点键盘。 接口说明:74HC573锁存器数据输入口依次接单片机P2口,段选接P1.6,位选接P1.7 */ #include /******************************************************************/ 作用:变量宏定义 备注: /******************************************************************/ #define uchar unsignd char #define uint unsigned int /******************************************************************/ 作用:IO口定义 备注:PWM方波输出口接P1.0,74HC573段选接P1.6,位选接P1.7PWM方波输出口接P1.0。两个独立键盘接P3.4和P3.5.分别控制PWM方波的高电平增量和减量 ******************************************************************/ ***it shuchu=P1^0; ***it dula=P2^6; ***it wela=P2^7; ***it jia_key=P3^4; ***it jian_key=P3^5; uchar a,b; ******************************************************************/ 作用:八位共阴数码管编码,码表为不带小数 备注:如果想调用小数,可以这样写: table【?】|0x80; ******************************************************************/ uchar code table[]={0x3f,0x06,0x5b,0x4f, //0-3 0x66,0x6d,0x7d,0x07, //4-7 0x7f,0x6f}; //8-9 ******************************************************************/ 函数名:微秒级延时子程序 调用:delayus(?) 参数:0~65535 ******************************************************************/ void delayus(uint xms) { uint i; for(i=xms;i>0;i--); } ******************************************************************/ 函数名:键盘子程序 调用:key() 作用:按下jia时实现增大调节PWM方波的占空比,按下jian时实现减小调节PWM方波的占空比。调节级数为100级。 ******************************************************************/ void key() { if(jia_key==0) { delayus(1200); if(jia_key==0) { if(a!=100) a=a+1; else a=100; while(!jia_key); } } if(jian_key==0) { delayus(1200); if(jian_key==0) { if(a!=0) a=a-1; else a=0; while(!jian_key); } } b=100-a; } ******************************************************************/ 函数名:显示子程序 作用:只是提供感性的PWM方波的占空比情况,并不是精确的。 调用:display(?) 参数:0~255 ******************************************************************/ void display(uchar temp) { uchar bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%10; dula=1; P0=table[bai]; dula=0; P0=0xfe; wela=1; wela=0; delayus(120); dula=1; P0=table[shi]; dula=0; P0=0xfd; wela=1; wela=0; delayus(120); dula=1; P0=table[ge]; dula=0; P0=0xfb; wela=1; wela=0; delayus(120); } ******************************************************************/ 函数名:主函数 ******************************************************************/ void main() { uchar i; a=100; b=0; while(1) { for(i=a;i>0;i--) //输出低电平 { shuchu =0; display(a); //把显示和键盘扫描放在这里 key(); //可起到延时作用,一举两得 } for(i=b;i>0;i--) //输出高电平 { shuchu =1; display(a); //把显示和键盘扫描放在这里 key(); //可起到延时作用,一举两得 } } }
|