Wu雨雨雨
获得 1 次赞
帮助过0人
下面是程序,其他的都很简单,红色标出了蜂鸣器部分#include <reg52.h> //52系列单片机头文件 #define uchar unsigned char//申明变量和位口 sbit K1=P3^4; //对应按钮K1sbit K2=P3^5; //对应按钮K2 sbit dula=P2^6; //段选申明 sbit wela=P2^7; //位选申明 sbit beep=P2^3; //蜂鸣器申明 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~9,A~F的16进制void delayms(unsigned int xms); //延时函数申明unsigned char numt0=0,miao=0,fen=0,lunci=0; // 计数变量unsigned char CK1=0,CK2=0; //串口接收变量(全局)//延时函数void delayms(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=112;j>0;j--);}//计时器初始化函数void init() { //********计时器********** TMOD=0x21; //模式设置,00100001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=0; //不打开定时器 TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; //开定时器0中断 EA=1; //开总中断 //***************串口通信********************** TMOD=0X21; ////模式设置,00100001,可见采用的是定时器1,工作与模式1(M1=0,M0=1) SCON=0X50; //设置为工作方式1 PCON=0X00; //0x00不加倍 0x80加倍 TH1=0XFD; //计数器初始值设置,注意波特率是4800的 TL1=0XF3D; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器 }//数码管显示函数 void display(uchar fen1,uchar miao1){ //*******分钟操作********* unsigned char fenshi,fenge; unsigned char miaoshi,miaoge; fenshi=fen1/10; fenge=fen1%10; dula=1; //秒钟十位赋值 P0=table[fenshi]; dula=0; P0=0xff; wela=1; P0=0xF7; wela=0; delayms(5); dula=1; //分钟十位赋值 P0=table[fenge]; dula=0; P0=0xff; wela=1; P0=0xEF; wela=0; delayms(5); //********中间的一个横线***** dula=1; P0=0x40; dula=0; //打开段选位 .....秒钟个位赋值......关闭闭段选位 P0=0xff; //送段选数据前关闭所有所有显示,防止打开位选锁存器 wela=1; P0=0xFB; wela=0; //打开段选位 、赋值、关闭闭段选位 delayms(5); //*******秒钟操作********* miaoshi = miao1/10; miaoge = miao1%10; //参数处理 dula=1; P0=table[miaoshi]; dula=0; //打开段选位 .....秒钟个位赋值......关闭闭段选位 P0=0xff; //送段选数据前关闭所有所有显示,防止打开位选锁存器 wela=1; P0=0xFE; wela=0; //打开段选位 、赋值、关闭闭段选位 delayms(5); dula=1; //秒钟十位赋值 P0=table[miaoge]; dula=0; P0=0xff; wela=1; P0=0xFD; wela=0; delayms(5); }//判断按键函数unsigned char keyscan(){ unsigned char keyValue = 0; //保存键值 if (K1==0) //检测按键K1是否按下 { delayms(10); //消除抖动 if (K1==0) //再次检测按键是否按下 { TR0=~TR0; //启动或开始计时器******一开始时,这个按键按下去后才会启动 while(!K1); //等待按键释放 } } if (K2==0) //检测按键K1是否按下 { delayms(10); //消除抖动 if (K2==0) //再次检测按键是否按下 { miao=0; fen=0; //清零 lunci=0; //清零同时,判别变量清零 while(!K2); //等待按键释放 } } return keyValue; //将读取到键值的值返回}//开始次一轮函数void NextTurn ( unsigned char fenstop){ &
下面是程序,其他的都很简单,红色标出了蜂鸣器部分#include <reg52.h> //52系列单片机头文件 #define uchar unsigned char//申明变量和位口 sbit K1=P3^4; //对应按钮K1sbit K2=P3^5; //对应按钮K2 sbit dula=P2^6; //段选申明 sbit wela=P2^7; //位选申明 sbit beep=P2^3; //蜂鸣器申明 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~9,A~F的16进制void delayms(unsigned int xms); //延时函数申明unsigned char numt0=0,miao=0,fen=0,lunci=0; // 计数变量unsigned char CK1=0,CK2=0; //串口接收变量(全局)//延时函数void delayms(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=112;j>0;j--);}//计时器初始化函数void init() { //********计时器********** TMOD=0x21; //模式设置,00100001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=0; //不打开定时器 TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; //开定时器0中断 EA=1; //开总中断 //***************串口通信********************** TMOD=0X21; ////模式设置,00100001,可见采用的是定时器1,工作与模式1(M1=0,M0=1) SCON=0X50; //设置为工作方式1 PCON=0X00; //0x00不加倍 0x80加倍 TH1=0XFD; //计数器初始值设置,注意波特率是4800的 TL1=0XF3D; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器 }//数码管显示函数 void display(uchar fen1,uchar miao1){ //*******分钟操作********* unsigned char fenshi,fenge; unsigned char miaoshi,miaoge; fenshi=fen1/10; fenge=fen1%10; dula=1; //秒钟十位赋值 P0=table[fenshi]; dula=0; P0=0xff; wela=1; P0=0xF7; wela=0; delayms(5); dula=1; //分钟十位赋值 P0=table[fenge]; dula=0; P0=0xff; wela=1; P0=0xEF; wela=0; delayms(5); //********中间的一个横线***** dula=1; P0=0x40; dula=0; //打开段选位 .....秒钟个位赋值......关闭闭段选位 P0=0xff; //送段选数据前关闭所有所有显示,防止打开位选锁存器 wela=1; P0=0xFB; wela=0; //打开段选位 、赋值、关闭闭段选位 delayms(5); //*******秒钟操作********* miaoshi = miao1/10; miaoge = miao1%10; //参数处理 dula=1; P0=table[miaoshi]; dula=0; //打开段选位 .....秒钟个位赋值......关闭闭段选位 P0=0xff; //送段选数据前关闭所有所有显示,防止打开位选锁存器 wela=1; P0=0xFE; wela=0; //打开段选位 、赋值、关闭闭段选位 delayms(5); dula=1; //秒钟十位赋值 P0=table[miaoge]; dula=0; P0=0xff; wela=1; P0=0xFD; wela=0; delayms(5); }//判断按键函数unsigned char keyscan(){ unsigned char keyValue = 0; //保存键值 if (K1==0) //检测按键K1是否按下 { delayms(10); //消除抖动 if (K1==0) //再次检测按键是否按下 { TR0=~TR0; //启动或开始计时器******一开始时,这个按键按下去后才会启动 while(!K1); //等待按键释放 } } if (K2==0) //检测按键K1是否按下 { delayms(10); //消除抖动 if (K2==0) //再次检测按键是否按下 { miao=0; fen=0; //清零 lunci=0; //清零同时,判别变量清零 while(!K2); //等待按键释放 } } return keyValue; //将读取到键值的值返回}//开始次一轮函数void NextTurn ( unsigned char fenstop){ &
自己学习单片机,买了本郭天祥的教材,但没有买对应的开发板,买了STC90C51版的。书里面的程序某些地方和买开发板附送的程序有些出入,虽说大同小异,但小异把自己给难住了,很久,调试了几天也没弄好。 要实现的功能很简单,但就是行不通,应该是数码管处理那里出了问题 程序这样写不出来,C版的也传不上来,就弄了个word。