分享简洁51单片机常用子程序2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//uchar seg[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//七段
uchar seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//七段小数点不亮
/************* 音乐数据表 *****************/
unsigned char n=0; //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
uchar h[4];
uint i;
uchar ADCRS;
uchar Rchar;
uchar X=0;
float hres;
void delayms(int t)//51单片机常用延时子程序毫秒级延时
{
int i; //声明变量i--内循环变量
int j; //声明变量j--外循环变量
for(j=0;j<t;j++)
{
for (i=0;i<150;i++);//循环加法计算,消耗CPU时间,达到延时的目的
}
}
uchar ADC(void) //adc 子程序,本程序针对常用并行8位AD芯片ADC0804 {
uchar ADCRes; //声明一个uchar(无符号单字节变量,用于保存AD转换结果) P0=0xFF;//拉高P0数据总线,为读做准备(51单片机中,读取IO端口时,必须先拉高对应端口)
WR=0;//把ADC0804的WR脚拉低
DAC_WR=1;
delayms(1);
}
}
void int0() interrupt 1 //采用中断0 控制节拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制频率延时
{
unsigned i=3*m;
while(--i);
}
void jkc_Flash_LED(void) //接于P0口的8个LED闪烁例程
{
P2=0XFF; //P2口高电平,关掉数码管
while(1)
{
P0=0X00;//P0端口拉低,灯亮
delayms(200);
P0=0XFF;//P0端口拉高,灯灭
delayms(200);
}
void jkc_Horse_LED(void) //跑马灯例程
{
unsigned char temp;
P2=0XFF; //P2口高电平,关掉数码管
temp=0x01;
P0=~temp; //temp 按位取反后赋给P0,直接输出temp(0x01),最低位是1高电平,灯不亮,低电平才亮,所以要反转位delayms(100);
while(1)
{
P0=~temp;
temp<<=1;//temp向左移动一位,即里面的1向左移动一位。
为1的位对应的端口经过位反转后,灯会亮,其余的亮不会亮
delayms(100);
if(temp==0X00)
{
temp=0X01;
}
}
}
void jkc_Test_4LED(void)//四位数码管测试程序
{
delayms(200);
//P0=seg[8];
P0=0X00;//点亮数码管所有笔画
P2=0XF0;//拉低P20~P23,P20~P23接的是四个数码管的共阳端
delayms(200);
P2=0XFF;
delayms(200);
P2=0XF0;
delayms(200);
P2=0XFF;
delayms(200);
P2=0XF0;
delayms(200);
P2=0XFF;
while(1)//以下程序循环显示0123456789
{
for(i=0;i<10;i++)
{
P0=seg[i];
P2=0XF0;
delayms(200);
P2=0XFF;
delayms(200);
}
}
}
void jkc_Display4(uint number) //四位数码管显示数值子程序
{
uchar h[4];
uint temp;
h[3]=number/1000;//数值的千位
temp=number%1000;//“%”取模运算符,即取余数
h[2]=temp/100;//数值的百位
temp=temp%100;
h[1]=temp/10;//数值的十位
temp=temp%10;
h[0]=temp;//数值的个位
//while(1)
//{
P2=0XFF;
P0=seg[h[0]];
Led4_1=0;
delayms(3);
Led4_1=1;
delayms(1);
P0=seg[h[1]];
Led4_2=0;
delayms(3);
Led4_2=1;
delayms(1);
P0=seg[h[2]];
Led4_3=0;
delayms(3);
Led4_3=1;
delayms(1);
P0=seg[h[3]];
Led4_4=0;
delayms(3);
Led4_4=1;
delayms(1);
// }
}
void jkc_Display1(uint number) //1位独立数码管显示数字子程序{
uint temp;
temp=number;
P2=0XFF;
P0=seg[temp];
P24=0;
//delayms(100);
}
void jkc_CheckButton(void) //检测3个独立按钮例程
{
while(1)
{
if (S1==0)
P00=0;
if(S2==0)
P01=0;
if (S3==0)
P0=0XFF;
}
}
void jkc_Check_KeyBoad(void) //4*4矩阵键盘检测子程序
{
col1=0; //这里只检测左边第一列,按下S4,S8,S13,S17 相应的LED会亮
while(1)
{
KeyBoadCon=0;
P0=0XFF;
if(P00==0)
P00=0;
if(P01==0)
P01=0;
if(P02==0)
P02=0;
if(P03==0)
P03=0;
KeyBoadCon=1;
delayms(30);
}
}
void jkc_PlayMusic(void)//音乐子程序
{
unsigned char p,m; //m为频率常数变量
unsigned char i=0;
TMOD&=0x0f;
TMOD =0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a:p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符。