仿真图:
芯片/模块的特点:
AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。
AT89C52的主要特点如下:
内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。
RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。
外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。
通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。
定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0
串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。
低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。
宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。
主程序:
#include <REGX52.H>
#define u8 unsigned char //全局变量u8的值在<0-255>
#define u16 unsigned int //全局变量u16的值在<0-65535>
//定义IO口
sbit pwm=P3^6; //声明一个输出口,用于控制线圈的打开和关断
sbit P_dec=P1^5; //功率-
sbit P_inc=P1^6; //功率+
sbit STOP=P1^7;//暂停
//数码管段选
u8 code ab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x08,0x80,0x90};
//数码管位选
u8 code ac[]={0x08,0x04,0x02,0x01,0x0f};
u8 statu=0;//工作状态 statu=0:正常工作;statu=1,暂停状态
u8 a,n,x;//a:用于定时,n:档位,x:占空比
//毫秒延时函数
void delay_ms(u16 nms)
{
u8 i=0;
while(nms--)
for(;i<112;i++);
}
//数码管显示4位数字
void Display(u16 num)
{
u8 i=0,d=0;
for(i=0;i<4;i++)
{
d=num%10;
num-=d;
num/=10;
P2=ac[i];//位选
P0=ab[d];//短选
}
}
//主函数
void main()
{
TMOD=0x01;//选择定时器模式。
TH0=(65536-100)/256;//给定时器高8位给个初值。
TL0=(65536-100)%256;//给低8位个初值。
EA=1;//开总中断。
ET0=1;//开定时器0中断。
TR0=1;//启动定时器0。
n=1;//初始化档位。
Display(8888);//初始显示。
delay_ms(1000);
while(1)
{
//是否暂停
if(STOP==0)//有按键按下
{
delay_ms(10);//消抖延时
if(STOP==0)
while(!STOP);//等待松开按键
statu=!statu;//状态切换
}
//档位选择
if(statu==0)//正常运行状态
{
if(P_dec==0||P_inc==0)//有按键按下
{
delay_ms(10);//消抖延时
if(P_dec==0)
{
while(!P_dec);//等待松开按键
if(n>1)
n--;//档位减
}
else if(P_inc==0)
{
while(!P_inc);
if(n<5)
n++;//档位加
}
}
//输出控制及显示
switch(n)
{
case 0:{x=0;Display(8888);}break;
case 1:{x=20;Display(300);}break;
case 2:{x=40;Display(600);}break;
case 3:{x=60;Display(1200);}break;
case 4:{x=80;Display(1500);}break;
case 5:{x=100;Display(1800);}break;
default:break;
}
}
else//暂停状态
Display(8888);
}
}
void timer0() interrupt 1 //定时器中断服务
{
TH0=(65536-100)/256; //重新初值
TL0=(65536-100)%256;
a++;
if(a>=100)
a=0;
}
设计文件: