迪文科技论坛

 找回密码
 立即注册
搜索
查看: 796|回复: 0

【分享】T5L常见的四个外设资源AD、IO、pwm、串口开发

[复制链接]

15

主题

115

回帖

1836

积分

金牌会员

Rank: 6Rank: 6

积分
1836
发表于 2023-9-19 14:38:37 | 显示全部楼层 |阅读模式
源码
1、 PWM的使用方法

/**************************
名称:void pwm0_set(u16 Pec)
功能:pwm0 设置参数Pec为占空比
**/
void pwm0_set(u16 Pec)
{
         u16 Val=0;
         Write_Dgus(0x87,0x2042);  //配置频率  100kHz=825.7536MHz/0x2042(8258)
   Write_Dgus(0x86,0x5A01);    //配置分频系数 pwm0配置100khz/1=100khz
         Val=(u32)Pec*0x2042/100;
   Write_Dgus(0x92,Val);             //配置占空比
}
2、 ADC的使用方法
/******************************************
名称:void ad_deal()
功能:AD处理函数根据ad值调节pwm占空比
****/
void ad_deal()
{
    u16 Val=0,Va2=0;
          Val=Read_Dgus(0x38);//AD6
    Va2=Read_Dgus(0x39);//AD7        
    if(Val>1240) //  AD6的电压大于62mv=1240*3300/65535时配置pwm1的占空比为100%
                {
                   pwm1_set(100);
                }else{ // AD6的电压小于于62mv时配置pwm1的占空比0%
                   pwm1_set(0);  
                }
                if(Va2>1240)//AD7的电压大于62mv=1240*3300/65535时配置pwm0的占空比为100%

                {
                   pwm0_set(100);
                }else{// AD7的电压小于于62mv时配置pwm0的占空比0%
                   pwm0_set(0);
                }
}

3、 IO的使用方法

/************************************************
名称:void io_init()
功能:io口每秒翻转一次
*****/
void io_init()
{
            P1MDOUT    =0xFF;
                        P2MDOUT    =0xF0;        //P2^0 P2^1  P2^2 P2^ 3 input   P2^4 P2^5  P2^6 P2^ 7 output
            P3MDOUT    =0x0F;                                           //开启P3_2P3_3的输出 P3_2=RTC_SCL P3_3=RTC_SDA
                        PORTDRV    = 0x01;                                           //IO驱动能力设定 4mA=0,8mA=1,16mA=2,32mA=3

}
sbit IOP_20 = P2^0;
/************************************************
名称:void io_deal()
功能:io口每秒翻转一次
*****/
void io_deal()
{

    if(SysTick_IO==0)
                {
                    SysTick_IO=1000; //在定时器中断中每ms减一
                    P1=~P1;  //IO口翻转
                          P2=~P2;
                          P3=~P3;
                }
                if(IOP_20)   //读取ioP2^0状态
                {
                   Write_Dgus(0x2100,1); // 往变量地址0x21001
                }else
                {
                   Write_Dgus(0x2100,0); // 往变量地址0x21000

                }
}

4UART的使用方法

void Uart2_Init(u32 baud_rate){
             u16 i=0;
      i=1024-FOSC/64/baud_rate;
            SREL2H = (u8)(i>>8);                //波特率 = FCLK/64*(1024-SREL)
            SREL2L = (u8)i;    //
            MUX_SEL|=0x40;                         //UART2引出,UART3不引出,WDT关闭        
                        ADCON = 0x80;            //选择SREL0H:L作为波特率发生器
                        SCON2 = 0x50;            //接受使能和模式设置
                        PCON &= 0x7F;            //SMOD=0
                        IEN0 |= 0X10;                    //ES0=1         串口2 接受+发送中断
                        EA  = 1;        
}



附:
/************************************************
名称:void test_all()
功能:测试程序统一处理在main中调用
*****/
void test_all()
{
   io_deal();//io口处理函数
   ad_deal();//ad处理函数,根据ad值调节pwm占空比
}

/************************************************
名称:void  Main()
功能:程序入口 Main函数
*****/

void    Main()
{                  
       Sys_Cpu_Init(); //系统初始化
       uart_init();// 串口初始化
             io_init();// io口初始化
       while(1)
                        {                        
                                    Clock(); //rtc驱动
                                   if(Count_num1==0)
                                         {
                                                 Sw_Data_Send ();//数据自动上传
                                                 Count_num1=10;//在定时中断中自减
                                         }
           uart_frame_deal();//串口数据处理
                                         test_all();  //测试程序
                        }        
}


/*********************************************************************
名称:void Sys_Timer2_isr()        interrupt 5
功能:定时器中断
*******/
void Sys_Timer2_isr()        interrupt 5          //1MS进入中断函数
{
                TF2=0;//清除定时器2的中断标志位
                if(TimVal<255)TimVal++;
                            SysTick_RTC++;
                if(T_O5>0)T_O5--;
                if(T_O4>0)T_O4--;
                if(T_O3>0)T_O3--;
                if(T_O2>0)T_O2--;
                if(SysTick_IO>0)SysTick_IO--;
                if(Count_num1>0) Count_num1--;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 03:12 , Processed in 0.096619 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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