|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.03 KB, 下載次數(shù): 75)
下載附件
2020-3-15 12:08 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #include "LCD1602.H"
- #define uchar unsigned char
- #define uint unsigned int
- unsigned int fr=50; //頻率 50hz
- unsigned char dc=50;//50%占空比
- uchar fr_g=0;
- uchar fr_s=0;
- uchar dc_g=0;
- uchar dc_s=0;
- /* 配置并啟動 PWM,fr-頻率,dc-占空比 */
- unsigned int high,low;
- unsigned long tmp;
- unsigned char HighRH = 0; //高電平重載值的高字節(jié)
- unsigned char HighRL = 0; //高電平重載值的低字節(jié)
- unsigned char LowRH = 0; //低電平重載值的高字節(jié)
- unsigned char LowRL = 0; //低電平重載值的低字節(jié)
- void ConfigPWM();
- void ClosePWM();
- sbit key1=P3^1; //定義按鍵位置 加占空比
- sbit key2=P3^0; //定義按鍵位置 減占空比
- sbit PWMOUT = P2^1;
- /********************************************************************
- //* 名稱 : Delay_1ms()
- //* 功能 : 延時子程序,延時時間為 1ms * x
- //* 輸入 : x (延時一毫秒的個數(shù))
- //* 輸出 : 無
- //***********************************************************************/
- void Delay_1ms(uint i)//1ms延時
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- void key()
- {
- if(!key1) //按下相應(yīng)的按鍵,數(shù)碼管顯示相應(yīng)的碼值
- { Delay_1ms(10);
- if(!key1)
- {
- if(dc++>=100)dc=100;
-
- }
- while(!key1);
- }
-
- if(!key2)
- {
- Delay_1ms(10);
- if(!key2)
- {
- if(dc--<=0)dc=100;
-
- }
- while(!key2);
- }
- }
- void ConfigPWM()
- {
- tmp = (11059200/12) / fr; //計算一個周期所需的計數(shù)值
- high = (tmp*dc) / 100; //計算高電平所需的計數(shù)值
- low = tmp - high; //計算低電平所需的計數(shù)值
- high = 65536 - high + 12; //計算高電平的重載值并補(bǔ)償中斷延時
- low = 65536 - low + 12;//計算低電平的重載值并補(bǔ)償中斷延時
- HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
- HighRL = (unsigned char)high;
- LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節(jié)
- LowRL = (unsigned char)low;
- TMOD &= 0xF0; //清零 T0 的控制位
- TMOD |= 0x01; //配置 T0 為模式 1
- TH0 = HighRH; //加載 T0 重載值
- TL0 = HighRL;
- ET0 = 1; //使能 T0 中斷
- TR0 = 1; //啟動 T0
- PWMOUT = 1; //輸出高電平
- }
- /* 關(guān)閉 PWM */
- void ClosePWM()
- {
- TR0 = 0; //停止定時器
- ET0 = 0; //禁止中斷
- PWMOUT = 1; //輸出高電平
- }
- void main()
- {uint i;
- LCD1602_Init(1,0,0);//lcd1602初始化
- Delay_1ms(100);
-
- LCD1602_DisplayChar(1,2,':');//顯示e
- LCD1602_DisplayChar(2,1,'d');//顯示p
- LCD1602_DisplayChar(2,2,':');//顯示:
- LCD1602_DisplayChar(1,6,'H');//顯示t
- LCD1602_DisplayChar(1,7,'Z');//顯示e
- LCD1602_DisplayChar(2,6,'%');//顯示t
- LCD1602_DisplayChar(1,1,'f');//顯示t
- TMOD = 0x00;
- TL1 = 0xD8;
- TH1 = 0xf0;
- TR1 = 1; //啟動定時器
- ET1 = 1; //使能定時器中斷
- EA = 1; //開總中斷
- while(1)
- {
- key();
- ConfigPWM();
- for (i=0; i<40000; i++);
- fr_g = fr%10;
- fr_s = fr /10;
- dc_g = dc%10;
- dc_s = dc/10;
- LCD1602_DisplayChar(1,4,fr_s+48);//顯示t
- LCD1602_DisplayChar(1,5,fr_g+48);//顯示e
- LCD1602_DisplayChar(2,4,dc_s+48);//顯示p
- LCD1602_DisplayChar(2,5,dc_g+48);//顯示:
-
- }
-
- }
- /* T0 中斷服務(wù)函數(shù),產(chǎn)生 PWM 輸出 */
- void InterruptTimer0() interrupt 1
- {
- if (PWMOUT == 1)
- { //當(dāng)前輸出為高電平時,裝載低電平值并輸出低電平
- TH0 = LowRH;
- TL0 = LowRL;
- PWMOUT = 0;
- }
- else
- { //當(dāng)前輸出為低電平時,裝載高電平值并輸出高電平
- TH0 = HighRH;
- TL0 = HighRL;
- PWMOUT = 1;
- }
- }
- void TM1_Isr() interrupt 3 using 1
- {
- key();
- }
復(fù)制代碼
全部資料51hei下載地址:
lcd1602顯示PWM頻率和占空比1.rar
(66.36 KB, 下載次數(shù): 100)
2020-3-15 11:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|