找回密码
 立即注册
楼主: Polaris

通过学习AI8051入门单片机

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:343
  • 最近打卡:2025-05-02 13:52:41
已绑定手机

6

主题

202

回帖

814

积分

高级会员

积分
814
发表于 2025-2-4 20:05:35 | 显示全部楼层
感谢分享!!
回复

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-6 20:16:05 | 显示全部楼层
第九节 数码管
①了解数码管的硬件原理 共阴 共阳
②了解HC595芯片的功能,用三个引脚控制多个引脚节省IO口
③用扫描刷新的思想控制数码管
④时间函数的写法
void TIMECOUNT_Task(void)
{
        miao ++;
        if( miao>59 )
        {
                miao = 0;
                fen++;
                if( fen>59 )
                {
                        fen = 0;
                        shi ++;
                        if( shi>23 )
                                shi = 0;
                }
        }
}

void Seg_Task(void)
{
        u8 num = 0;
        if( Seg_no ==0 )                                                                //小时十位
        {
                num = shi/10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[0]);                //数码管刷段码和位码
        }
        else if( Seg_no ==1 )                                                        //小时的个位
        {
                num = shi%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[1]);                //数码管刷段码和位码
        }       
        else if( Seg_no ==2 )                                                        //第一个横杠
        {
                Display_Seg( SEG_NUM[16] , ~T_NUM[2]);                //数码管刷段码和位码
        }       
        else if( Seg_no ==3 )                                                        //分钟的十位
        {
                num = fen/10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[3]);                //数码管刷段码和位码
        }
        else if( Seg_no ==4 )
        {
                num = fen%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[4]);                //数码管刷段码和位码
        }       
        else if( Seg_no ==5 )
        {
                Display_Seg( SEG_NUM[16] , ~T_NUM[5]);                //数码管刷段码和位码
        }       
        else if( Seg_no ==6 )
        {
                num = miao/10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[6]);                //数码管刷段码和位码
        }
        else if( Seg_no ==7 )
        {
                num = miao%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[7]);                //数码管刷段码和位码
        }       
        else
        {
               
        }
        Seg_no ++;
        if( Seg_no>7 )
                Seg_no=0;
}
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-6 20:22:10 | 显示全部楼层
第十节
DIP40协议
1~4字节 命令头
5字节 有效长度
6字节 屏蔽为 需要转化为2进制 如0000 0001 只开启了 P00端口
7字节 端口的状态
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-6 20:30:19 | 显示全部楼层
十一节 按键
了解矩阵按键原理 (优点 有限的端口控制更多的按键 缺点检测比单引脚口按键满)
控制算法(先判断x 在判断y)组合一下(定一下键值 根据键值知道是哪一个按钮)
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-7 19:45:03 | 显示全部楼层
第十二节 复位系统
上电复位 低压复位 复位脚复位(低电平复位)看门狗复位
看门狗复位,在系统运行以后,就启动了看门狗计数器,看门狗开始自动计数,如果到了一定的时间还不去清理看门狗(喂狗)看门狗计数器就会溢出,从而引起看门狗中断,造成系统复位。所以,在使用有看门狗的芯片的时候要注意清理看门狗
***********看门狗函数********
void Delay10ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 59998UL;
        while (i) i--;
}

void USB_Reset_U(void)
{
        P3M0 = 0x00;
        P3M1 = 0x00;

        P3M0 &= ~0x03;
        P3M1 |= 0x03;

        USBCON = 0X00;
        USBCLK = 0X00;
        IRC48MCR = 0X00;
        Delay10ms();
}
********调用初始化*********
USB_Reset_U();
*********开启看门狗*********
WDT_CONTR = 0X24;
*************喂狗******
WDT_CONTR = 0X34;、
************开启下载程序******
void KEY_Task(void)
{
        if( P33 == 0 )
        {
                Key_Vol++;
                if( Key_Vol==5 )
                {
                        //按键按下的任务
//                        printf( "按键单击\r\n" );
                       
                        USB_Reset_U();
                       
                        IAP_CONTR = 0X60;
                }
        }
        else
        {
                Key_Vol = 0;
        }
       
}
***************按一下复位**********
void KEY_Task(void)
{
        if( P33 == 0 )
        {
                Key_Vol++;
                if( Key_Vol==5 )
                {
                        //按键按下的任务
//                        printf( "按键单击\r\n" );
                       
                        USB_Reset_U();
                       
                        IAP_CONTR = 0X20;
                }
        }
        else
        {
                Key_Vol = 0;
        }
       
}
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-7 19:45:59 | 显示全部楼层
第十三十四节 中断和IO口中断
中断介绍(CPU总是先执行中断,并且级别高的中断可以打断级别低的中断)
引脚带INTx可以作为外部中断(上升沿下降沿 或者都支持 )
********初始化*********
void INT1_Init(void) //INT1_Init 引脚口已经定了
{
        IT1 = 1;  //下降沿中断
        EX1 = 1 ;  //允许打开中断
        EA = 1 ;   //打开总中断
}
********中断函数*********
ISR(void) interrupt 2
{
        P01 = !P01;
}//为什么中断不是一一对应的?(后面 interrupt 2就代表了那一些列中断引脚)


void P3_IO_Init(void)
{
        P3IM0 = 0X00;                //IO中断模式设置为了下降沿
        P3IM1 = 0Xff;
       
        P3INTE= 0X08;                //打开中断        打开P3的某一个引脚
}

void P3_IO_ISR(void)        interrupt 40 //整个P3中断都进这个,在往下判断具体哪一个
{
        u8 intf;
       
        intf = P3INTF;
       
        if( intf )                        //判断也没有IO触发了中断
        {
                P3INTF = 0;
               
                if( intf & 0x08 )//判断是否是P33按钮按下  判断具体是这一个
                {
                        passward[0] = 1;
                        //P01 = !P01;
                }
        }
}
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2025-2-7 19:47:15 | 显示全部楼层
第十五节 定时器做计数器
通过配置,把定时器改为计数器 没是个脉冲进一次中断函数,中断函数++实现计数
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 01:22 , Processed in 0.112833 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表