程序中的这个FU_PIN_JIE_GUO_GetADCResult()是ADC准换电位器的值 直接写入到PCA里面来调节频率的 当发生中断以后 主程序的类容就不在显示了 数码管全部都是瞎子了 麻烦大神给我看看 在中断这方面我都不是很熟悉 不敢使用
单片机源程序如下:
- #include <STC15F2K60S2.H>
- #include "intrins.h"
- //AD延时
- void Delay1ms() //@24.000MHz
- {
- unsigned char i, j;
- i = 24;
- j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
- //数码管延时
- void Delay100us() //@24.000MHz
- {
- unsigned char i, j;
- i = 3;
- j = 82;
- do
- {
- while (--j);
- } while (--i);
- }
- #define ADC_POWER 0x80 //ADC电源控制位
- #define ADC_FLAG 0x10 //ADC完成标志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x40 //180个时钟
- unsigned char ch2 = 0X02; //通道选择变量 0x02;选择P1.2
- unsigned char ch3 = 0X03; //选择P1.3
- unsigned char ch1 = 0X04; //选择P1.4
- unsigned int TL,TH;
- //unsigned int jie_guo;
- unsigned fupingjishu = 0;
- void ADC_INIT ();
- void PCA_REG_PWM();
- void PCA_PIN_LV_ADJ(unsigned char );
- void Timer0Init(void);
- void INT0_TEST();
- void Timer1_Init(void);
- ZHU_PIN_JIE_GUO_GetADCResult();
- FU_PIN_JIE_GUO_GetADCResult();
- ZHAN_KONG_BI_JIE_GUO_GetADCResult();
- //连接138译码器
- sbit LSA = P5^1;
- sbit LSB = P5^2;
- sbit LSC = P5^3;
- sbit LED1 = P0^3;
- //0-9 数码段位显示数字
- unsigned code sumaguan_duan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //位选信号
- unsigned char displaydata[7] ; //用来保存分离出来的数据
- void shu_ma_guan();
- void shumaguan_shuju_chuli(unsigned int zhupin,unsigned char fupin,unsigned char fupin_zhankongbi);
- main()
- {
-
- ADC_INIT ();
- PCA_REG_PWM();
- Timer0Init();
- Timer1_Init();
- P5M0 = 0x00; //0000,0000 端口5模式寄存器0
- P5M1 = 0x00; //0000,0000 端口5模式寄存器1
- P4M0 = 0x00; //0000,0000 端口4模式寄存器0 数码管用
- P4M1 = 0x00;
- P1M0 = 0x00; //
- P1M1 |= 0x04; // 设置P1.2为高阻输入模式
- P0M0 = 0x00; //0000,0000 端口4模式寄存器0 数码管用
- P0M1 = 0x00;
- while (1)
- {
- //数码管驱动函数
- shu_ma_guan();
- //数码管数据接收函数
- shumaguan_shuju_chuli(ZHU_PIN_JIE_GUO_GetADCResult(),FU_PIN_JIE_GUO_GetADCResult(),ZHAN_KONG_BI_JIE_GUO_GetADCResult());
- //设置占空比
- CCAP0H = CCAP0L = ZHAN_KONG_BI_JIE_GUO_GetADCResult();
- //设置频率
- PCA_PIN_LV_ADJ(FU_PIN_JIE_GUO_GetADCResult() );
-
- }
- }
- // ADC初始化
- void ADC_INIT ()
-
- {
- P1ASF |= 0X1C; // 将P1.2 P1.3 P1.4 口作为ADC输入信号
- ADC_RES=0; //清零转换结果寄存器高8位
- ADC_RESL=0; //清零转换结果寄存器低2位
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START ;
- Delay1ms();
- Delay1ms();
- Delay1ms();
- Delay1ms();
-
- }
- //高频结果转换 P1.2
- ZHU_PIN_JIE_GUO_GetADCResult()
- {
-
- unsigned int zhupinjieguo;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch1 | ADC_START; //打开电源 速度180个时钟 选择通道2 启动转换
- _nop_(); //等待4个NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成 全部为1 表示转换完成
- ADC_CONTR &= ~0X80; //关闭ADC电源 节约功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚标识位
- zhupinjieguo = (ADC_RES<<2) + ADC_RESL; //将高2两位 和低8位的结果相加得到10位的结果
- zhupinjieguo = zhupinjieguo/3.41; //ad输出的结果最大是1024按照,但是只要0-300
- //缩小倍率就是1023除以300就是3.41 故用1023除以3.41即可转换为300
- return zhupinjieguo; //返回ADC结果
- }
- //PCA_PWM_频率控制结果 P1.3
- FU_PIN_JIE_GUO_GetADCResult()
- {
-
- unsigned int fupingjieguo;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch2 | ADC_START; //打开电源 速度180个时钟 选择通道2 启动转换
- _nop_(); //等待4个NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成 全部为1 表示转换完成
- ADC_CONTR &= ~0X80; //关闭ADC电源 节约功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚标识位
- fupingjieguo = (ADC_RES<<2) + ADC_RESL; //将高2两位 和低8位的结果相加得到10位的结果
- fupingjieguo = fupingjieguo/40.92; //ad输出的结果最大是1024按照,但是只要0-25
- //缩小倍率就是1023除以25就是40.92 故用1023除以40.92即可转换为25
- return fupingjieguo; //返回ADC结果
- }
- //PCA_PWM占空比结果 P1.4
- ZHAN_KONG_BI_JIE_GUO_GetADCResult()
- {
-
- unsigned int zhankongbijieguo;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch3 | ADC_START; //打开电源 速度180个时钟 选择通道2 启动转换
- _nop_(); //等待4个NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成 全部为1 表示转换完成
- ADC_CONTR &= ~0X80; //关闭ADC电源 节约功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚标识位
- zhankongbijieguo = (ADC_RES<<2) + ADC_RESL; //将高2两位 和低8位的结果相加得到10位的结果
- zhankongbijieguo = zhankongbijieguo/4; //ad输出的结果最大是1024按照,但是占空比只要0-98可调
- //缩小倍率就是1023除以100就是10.43 故用1023除以10.43即可转换为98
- return zhankongbijieguo; //返回ADC结果
- }
- //数码管显示屏函数 初始化函数
- void shu_ma_guan()
- {
- unsigned char i;
- for(i=0;i<7;i++) //0 1 2 3 4 5 6
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- }
-
- P4=displaydata[ i];
- Delay100us();
- P4 = 0X00; //消影信号
- }
-
- }
- //数码管 数据接收与处理函数
- void shumaguan_shuju_chuli(unsigned int zhupin,unsigned char fupin,unsigned char fupin_zhankongbi)
- {
- // //低频频率
- displaydata[0] = sumaguan_duan[fupin/10%10];
- displaydata[1] = sumaguan_duan[fupin%10];
-
-
- // //低频占空比
- displaydata[2] = sumaguan_duan[fupin_zhankongbi/10%10];
- displaydata[3] = sumaguan_duan[fupin_zhankongbi%10];
-
- //主频频率
- displaydata[4] = sumaguan_duan[zhupin/100%10];
- displaydata[5] = sumaguan_duan[zhupin/10%10];
- displaydata[6] = sumaguan_duan[zhupin%10];
-
- }
- //PCA_PWM寄存器配置
- void PCA_REG_PWM()
- {
-
- //ACC = P_SW1;
- //ACC &= ~(CCP_S0 | CCP_S1); //外设端口切换寄存器1
- //P_SW1 = ACC; //本次不需要切换端口
-
- CMOD |=0X04; //1、CPS2、CPS1、CPS0系统时钟,定时器0的溢出 脉冲
- //2、当CIDL=0时, 空闲模式下PCA计数器继续工作;
- //允许ECF溢出中断
-
- CCON &=0X00; //不需要中断标志位和中断溢出所以并且初始化的时
- //候需要关闭PWM所以全部设置位0
-
- CCAPM0 |=0X42; //允许比较器功能控制位 允许脉宽调节模式 P1.1
- //ECOM0:允许比较器功能控制位。 允许比较器
- //CAPP0: 正捕获控制位。 不允许
- //CAPN0:负捕获控制位。 不允许
- //MAT0: 匹配 控制位 。 不允许
- //TOG0: 翻转控制位。 不允许
- //PWM0: 脉宽调节模式 允许
- //ECCF0: 使能CCF0中断 不允许
-
- // CCAPM1 |=0X42; //同上 P1.0
-
- CL = 0; //低位初值设置为0
- CH = 0; //高位初值设置为0
-
- CCAP0H = CCAP0L = 0x80; //PWM 设置占空比为50%
-
- // CCAP1L = 0x80; //PWM 设置占空比为50%
- // CCAP1H = 0x60; //PWM 设置占空比为50%
-
- PCA_PWM0 = 0X00; //PCA模块0工作于8位PWM功能
- // PCA_PWM1 = 0X00; //PCA模块1工作于8位PWM功能
- CR = 1 ;
- }
- //定时器0溢出 设置PCA时钟用于调节频率
- void Timer0Init(void)
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xA0; //设置定时初值
- TH0 = 0xF6; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- //频率更新函数
- void PCA_PIN_LV_ADJ(unsigned char fuping)
- {
- unsigned long temp;
- //重新初始化定时初值
- temp = 0x10000-24000000/(fuping*256) ;
- TH0 =TH= temp>>8; //设置定时初值
- TL0 =TL= temp; //设置定时初值
- }
- void Timer1_Init(void) //1毫秒@18.432MHz
- {
- AUXR |= 0x40; //定时器时钟1T模式
- TMOD &= 0x0F; //设置定时器模式1
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0x00; //设置定时初值
- TH1 = 0xB8; //设置定时初值
- // TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- EA = 1; //打开总中断
- ET1 = 1; // 启动定时器1中断允许位
- }
- /*-------------------------------------
- 功能:定时器1 中断服务程序
- 介绍:中断程序无需声明
- --------------------------------------*/
- void timer1_isr(void) interrupt 3
- {
-
- if(TF1 == 1 );
-
- TF1 = 0;
- TR1 = 0;
- TL1 = 0x00; //设置定时初值
- TH1 = 0xB8; //设置定时初值
- TR1 = 1;
- fupingjishu++;
-
- if(1000/FU_PIN_JIE_GUO_GetADCResult()/2 == fupingjishu) //(Sd_Key_Value2*10)
- {
- fupingjishu = 0;
- LED1 = ~LED1; //测试用 接示波器 查看副频波形
-
-
- }
-
-
- }
复制代码
|