這是我整理過后的程序 這個程序就是 只要旋轉電位器 這個中斷就不好用了 LED要么一直亮 要么熄滅 也就是輸出沒有任何波形了
正常情況下 我這里輸出的波形是 0-25HZ可調的
ZHU_PIN_JIE_GUO_GetADCResult()這個就是電位器的值
- #include <STC15F2K60S2.H>
- #include "intrins.h"
- //數碼管延時
- 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 count; //中斷計數的
- void ADC_INIT ();
- void PCA_REG_PWM();
- void PCA_PIN_LV_ADJ(unsigned char );
- void Timer0Init(void);
- void Timer1_Init(void);
- void Timer1_PING_LV_ADJ();
- unsigned int ZHU_PIN_JIE_GUO_GetADCResult();
- //unsigned char FU_PIN_JIE_GUO_GetADCResult();
- //unsigned char 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);
- main()
- {
- 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;
- ADC_INIT ();
- PCA_REG_PWM();
- Timer0Init();
- Timer1_Init();
- while (1)
- {
- Timer1_PING_LV_ADJ();
- //數碼管驅動函數
- shu_ma_guan();
- //s數碼管數據接收
- shumaguan_shuju_chuli(ZHU_PIN_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 ;
- }
- //高頻結果轉換 P1.2
- unsigned int ZHU_PIN_JIE_GUO_GetADCResult()
- {
-
- unsigned int xdata zhupinjieguo;
- ADC_RES=0; //清零轉換結果寄存器高8位
- ADC_RESL=0;
- 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 /= 4; //ad輸出的結果最大是1024按照,但是只要0-300
- //縮小倍率就是1023除以300就是3.41 故用1023除以3.41即可轉換為300
- return zhupinjieguo; //返回ADC結果
- }
- //數碼管顯示屏函數 初始化函數
- void shu_ma_guan()
- {
- unsigned char xdata i,count;
- count++;
- if(count == 10)
- count = 0;
- 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)
- {
-
- //主頻頻率
- 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()
- {
-
-
- CMOD |=0X04; //1、CPS2、CPS1、CPS0系統時鐘,定時器0的溢出 脈沖
- //2、當CIDL=0時, 空閑模式下PCA計數器繼續工作;
- //允許ECF溢出中斷
- CCON &=0X00; //不需要中斷標志位和中斷溢出所以并且初始化的時
- //候需要關閉PWM所以全部設置位0
- CCAPM0 |=0X42; //允許比較器功能控制位 允許脈寬調節模式 P1.1
-
- // CCAPM1 |=0X42; //同上 P1.0
-
- CL = 0; //低位初值設置為0
- CH = 0; //高位初值設置為0
-
- CCAP0H = CCAP0L = 0x80; //PWM 設置占空比為50%
-
- PCA_PWM0 = 0X00; //PCA模塊0工作于8位PWM功能
- // PCA_PWM1 = 0X00; //PCA模塊1工作于8位PWM功能
- CR = 1 ;
- }
- 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 = temp>>8; //設置定時初值
- TL0 = temp; //設置定時初值
- }
- //測試中斷服務程序
- void Timer1_Init(void) //1毫秒@18.432MHz
- {
-
-
- AUXR |= 0x40; //定時器時鐘1T模式
- TMOD &= 0x0F; //設置定時器模式
- TL1 = 0x40; //設置定時初值
- TH1 = 0xA2; //設置定時初值
- TF1 = 0; //清除TF1標志 硬件清零
- TR1 = 1; //定時器1開始計時
- ET1 = 1; // 啟動定時器1中斷允許位
- EA = 1;//打開總中斷
-
- }
- /*-------------------------------------
- 功能:定時器1 中斷服務程序
- 介紹:中斷程序無需聲明
- --------------------------------------*/
- void timer1_isr(void) interrupt 3
- {
-
- count++;
- }
- void Timer1_PING_LV_ADJ()
-
- {
-
- unsigned char b; //臨時變量
-
- b =1000/ZHU_PIN_JIE_GUO_GetADCResult()*2 ;
- if(b == count) //(Sd_Key_Value2*10)
- {
-
- count = 0;
- LED1 = ~LED1; //測試用 接示波器 查看副頻波形
- }
-
-
- }
復制代碼
|