仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar COUNT100,PWMCOUNT;
- /*LCD 端口定义*/
- sbit RS=P3^7;
- sbit RW=P3^6;
- sbit E=P3^5;
- sbit PWM=P1^0;
- sbit K1=P3^0;//加1
- sbit K2=P3^1;//减1
- sfr LCDData=0x80;//0x80--P0,0X90--P1,0xa0--P2,0xb0--P3
- /************液晶驱动程序********************/
- /*延时函数 delay*/
- void delay(uint i)
- {
- while(i--);
- }
- /*******液晶驱动函数*******/
- void write_instruction(uchar x) //字节写入
- {
- delay(1000);
- E=0;
- RW=0;
- RS=0;
- LCDData=x;
- E=1;
- delay(20);
- E=0;
- }
- void write_data(uchar x) //数据写入
- {
- delay(1000);
- E=0;
- RW=0;
- RS=1;
- E=1;
- LCDData=x;
- E=0;
- }
- void cla(void) //清屏
- {
- write_instruction(0x01);
- }
- void initlcd(void) //初始化
- {
- write_instruction(0x38); //显示模式
- delay(200);
- write_instruction(0x0c); //设置开显示,不显示光标
- delay(200);
- write_instruction(0x06); //写一个字符后地址指针加一
- delay(200);
- cla();
- // delay(200);
- }
- void write_string(uchar x,uchar *p) //字符串写入
- {
- write_instruction(x);
- while(*p!=0x00)
- {
- write_data(*p);
- p++;
- if(x++==0x8f)
- {
- write_instruction(0xc0);
- }
- }
- }
- /************液晶驱动程序结束***********************/
- void DISPPWM(uchar add,uchar p)
- {
- write_instruction(add);
- write_data(p/100+0x30);
- write_data(p%100/10+0x30);
- write_data(p%100%10+0x30);
- write_data('%');
- }
- /*******键盘驱动程序******************/
- void pwmScanKey()
- {
- if(K1==0)
- {
- while(K1==0);//等待按键释放
- if(PWMCOUNT<100)
- PWMCOUNT=PWMCOUNT+10;
- }
-
- if(K2==0)
- {
- while(K2==0);//等待按键释放
- if(PWMCOUNT>0)
- PWMCOUNT=PWMCOUNT-10;
- }
-
- DISPPWM(0x84, PWMCOUNT);
-
- }
- void main(void)
- {
- initlcd();//初始化液晶
- delay(0xffff);
- COUNT100=0;
- PWMCOUNT=50;
-
- write_string(0x80,"PWM=");
- DISPPWM(0x84, PWMCOUNT);
-
- TMOD=0x01;//设置定时器0 方式 1,16 位定时方式
- EA=1;//打开中断允许总控制位
- ET0=1;//打开定时器0 溢出中断允许位
- TL0=0x66;//定时器0 的计数器赋初值, t=(2^16-a)*12/fosc,fosc=11.059sMHz
- TH0=0xfc;
- TR0=1;//启动定时器0
- while(1)
- {
- pwmScanKey();
- }
- //等待中断
-
- }
- void TIME0ISR(void) interrupt 1
- {
- //PWM=0;
- TL0=0x66;
- TH0=0xfc;
- COUNT100++;
- if(COUNT100==100)
- {
- COUNT100=0;
- }
- if(COUNT100<PWMCOUNT)
- {
- PWM=1;
- }
- else
- {
- PWM=0;
- }
- }
复制代码
全部资料51hei下载地址:
占占空比按键.zip
(75.82 KB, 下载次数: 31)
|