51单片机程序,大家在学习单片机的时候不能过于着急,要从基础学起,才能起高楼。
作者使用的STC89C52RC,晶振用的是11.0592MHz。
实验内容如下:
1.电路图,电路解释,开发板实操。
2.Keil代码图编译图,程序源码,附加程序代码详解。
3.实物图,LED模拟交通灯。
链接:单只数码管循环显示0~9工程源码,内置文档每句带有详细解释写的电路与程序详解文档
一、电路图解释
先看共阳极数码管,数码管其实也就是有8个LED灯,看左图,共阳极就是公共端是链接VCC,LED灯的负极链接着单片机的IO口,看右图P0的八个IO口,比如我想亮0,那么就应该是abcdef亮,因为是共阳极,所以P0=0b11000000=0xC0。
单片机STC89C52RC引脚使用的是P0作为段选,8个脚位,分别连接8个数码管的段选负极。JPSMG链接5V,P2.7作为位选,连接PNP的基极,P2.7=0,开发板中最低位8H=1,数码管通电;P2.7=1,开发板中最低位8H=0,数码管断电。
二、程序代码解释
/*
作者:pjspsy
日期:20240414
名称:单只数码管循环显示0~9
说明:主程序中的循环语句反复将09的段码送至P0口,使数字09循环显示
*/
#include<reg51.h>//头文件,每个程序都必须有。
#include<intrins.h>//crol()在intrins.h中定义的
#define uchar unsigned char//定义8位无符号数据的宏定义,可以缩短程序,可读性好。
#define uint unsigned int//定义16位无符号数据的宏定义,可以缩短程序,可读性好。
sbit SMG1=P2^7;//宏定义最低位数码管
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳极数码管的段选
//延时
void DelayMS(uint x)//X=1,就是延时1ms。
{
uchar t;//定义一个局部参数i。
while(x–)//循环X–,直到0为止跳出while循环。
{
for(t=0;t<120;t++);//for循环,循环120次,当i>120时跳出for循环。
} //在第一章中已解析for(i=0;i<120;i++)为什么的是1us,请移步第一章查看详解
}
//主程序
void main()
{
uchar i=0;//定义一个局部变量
SMG1=0;//8H数码管写0,PNP打开,共阳数码管接5V
P0=0x00;//数码管段选全黑
while(1)//while循环。
{ /* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */
//P0=~DSY_CODE[i];//如果是共阴,段选数组取反
P0=DSY_CODE[i];//共阳数码管显示i=0就是DSY_CODE[0],显示0
i=(i+1)%10;//0+1=1%10=1,为下一位做好准备
DelayMS(500);//等待500ms,延时要长一点,否则会导致数码管跳动太快,肉眼无法分辨,
}
}
三、实物图,led灯闪烁
一边亮红灯一边亮绿灯,下面是烧写,用的串口烧写。