该篇文章主要是我从b站教程总结的一些东西和我在上手操作中遇到的一些问题以及解决方法
在开始之前我们先了解一下一些知识
所有IO口通电后默认是高电平,单片机的IO口输出是弱上拉类型的,输出低电平能接收很大的电流,输出高电平电流比较小。(“弱1”“强0”输出由于上拉电阻的存在,输出高电平达不到“VCC”所以输出1时候就“弱”,而输出低电平等于GND,是“强0”)
😄首先,我开局就遇到了问题,当我在使用延时函数代码时我发现我不能使用_nop_()
函数的头文件#include<INTRINS.H>
,
历经一番波折我发现原来是芯片型号与我的设备不符合,重新选择型号就好啦,
我们直接通过代码来记笔记
1.独立按键控制LED显示二进制
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDnum=0;
while(1)
{
if(P3_1==0)
{
Delay(20); //消抖
while(P3_1==0);
Delay(20);
LEDnum++;//若LEDnum开始位为0000 0000,则+后变成0000 0001
P2=~LEDnum;//取反则变成1111 1110
}
}
}
a.数据类型
b.运算符号
c.消抖原因
2.独立按键控制LED移位
include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char LEDnum=0;
void main(){
P2=~0x01;
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
if(LEDnum>7)
LEDnum=0;
P2=~(0x01<<LEDnum);
}
if(P3_0==0){
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDnum==0)
LEDnum=7;
else
LEDnum--;
P2=~(0x01<<LEDnum);
}
}
}
3.数码管
数码管驱动方式:
注意:数据高位就是端口高位
a.静态数码管显示
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//对应0~9
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
}
void main()
{
Nixie(2,3);
while(1)
{
}
}
b.动态数码管显示
位选:控制那个数码管亮 段选:控制数码管显示的内容
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00;//清0,可避免位选、段选篡位造成的数码管显示不清
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
}
}
😄在其中一个操作的过程中,我的单片机那个蜂鸣器一直在傻叫,我发现是我接线松动的原因,一下是蜂鸣器响的原因总结
程序代码中可能存在语法或逻辑错误
蜂鸣器与单片机的接触可能出现问题,例如接线松动或电源不稳定
蜂鸣器的驱动电路可能存在问题,特别是当使用有源蜂鸣器时需要特定的电路来实现驱动。
CPU管脚程序可能未被正确初始化,这可能导致蜂鸣器持续发声3。
AL任务二
在这里插入代 #include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x40};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
P0=0x00;//清0,可避免位选、段选篡位造成的数码管显示不清
}
void main()
{
while(1)
{unsigned int i;
while(P3_1==0){
while(1){
Nixie(1,10);
Nixie(2,1);
Nixie(7,0);
Nixie(8,1);
if(P3_0==0||P3_2==0||P3_3==0)
break;
}
}
if(P3_0==0){
Delay(20);
while(P3_0==1){
//unsigned int i;
if(P3_1==0||P3_2==0||P3_3==0)
break;
for(i=0;i<=11000;i++){
if(i<10000){
Nixie(1,10);
Nixie(2,2);
Nixie(7,0);
Nixie(8,i/1000);
Delay(1);
}
else if(10000<=i<11000){//这里不用Delay(1000)的原因是它会使数码管显示不连续
Nixie(1,10);
Nixie(2,2);
Nixie(7,1);
Nixie(8,0);
Delay(1);
}
else{
i=0;
}
if(P3_1==0||P3_2==0||P3_3==0)
break;
}
}
}
if(P3_2==0){
Delay(20);
//unsigned int j;
while(P3_2==1){
for( i=0;i<=1000;i++){
if(i<500){
Nixie(1,10);
Nixie(2,3);
Nixie(7,0);
Nixie(8,3);
Nixie(5,11);
Nixie(6,11);}
else if(500<=i<1000){
Nixie(1,10);
Nixie(2,3);
Nixie(7,0);
Nixie(8,3);}
else
i=0;
if(P3_1==0||P3_0==0||P3_3==0)
break;
}
if(P3_1==0||P3_0==0||P3_3==0)
break;
}
}
if(P3_3==0){
Delay(20);
while(P3_3==0)
{
Delay(20);
}
for(i=0;i<10;){
Nixie(1,10);
Nixie(2,4);
Nixie(7,i);
Nixie(8,i);
Delay(20);
if(P3_3==0){
Delay(20);
while(P3_3==0)
{
Delay(20);
}
i++;
if(i==10)
i=0; }
if(P3_1==0||P3_0==0||P3_2==0)
break;
}
if(P3_1==0||P3_0==0||P3_2==0)
break;
}
}
}
目前发现了一些小 bug,按s4键的时候,数码管偏暗,然后S1、S2、S3、S4键轮流按完后,再返回按S1等键会发现数码管的显示和原先的有出入
任务二