1直接按键盘的F4键,单击“变换”菜单栏,然后单击第一个“变换”项,单击工具栏上的“程序变更”按钮,根据自己的习惯选择合适的变换方法。
2程序更改后,有必要检查程序是否有语法错误。这种检查只能自我诊断语法,与设计内容无关。程序检查需要单击工具菜单栏中的“程序检查”。
3建议有双线圈输出,因为一些“手动/自动”双线圈输出也正常。
4检查正确后,您可以将程序写入PLC:单击菜单栏中的在线写入。
5直接单击工具栏中的“写入”按钮。
6单击并写入后,系统将提示您编写内容。您可以选择仅编写程序而不编写注释,也可以选择全部。建议在PLC存储器允许时写入所有程序,参数和注释,这将有助于您稍后进行调试。
7单击“执行”后,将出现多个提示窗口。选择提示内容后,选择“是”直到编写程序。
/数显秒表——火柴天堂作品-20121210/
/源程序默认硬件环境:52单片机,110592MHz晶振,四位共阳数码管,P0段选,P20-P23高电平位选,P20最高位,P23最低位,P14-17四独立按键(开始,停止,继续,清零)/
/功能要求:数码管高2位显示“分”,低2位显示“秒”,中间使用小数点(常亮)分隔/
#include"reg52h"//包含52头文件
#define TRUE 1//定义布尔量'1':真
#define FALSE 0//定义布尔量'0':假
#define uchar unsigned char//定义 无符号字符型数据 简称
#define uint unsigned int//定义 无符号整型数据 简称
#define th0 0x4c
#define tl0 0x00//50ms at 110592MHz(定时器工作模式1 状态)
#define th1 0xfc
#define tl1 0x66//1ms at 110592MHz(定时器工作模式1 状态)
#define T1sAt50msCount 20//定义 1s 在 50ms 计时基准状态下 的计数值 为20
#define SEG_Num 4
#define SEG_Data P0//数码管段驱动接口
#define SEG_En P2//数码管位驱动接口
#define SEG_AllOff (SEG_En&=0xf0)//关闭所有数码管(位驱动)
#define DisTimeAt1msCount 4//单'位'数码管显示时间,数码管刷新频率f=1/(Nt),其中 N为数码管位数,t 为单'位'数码管显示时间
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管代码表"0-9"
sbit KeyStart=P1^4;//开始键
sbit KeyStop=P1^5;//停止键
sbit KeyGoOn=P1^6;//继续键
sbit KeyClear=P1^7;//清零键
#define NotKeyValue 0//无按键键值
#define KeyStartValue 1//开始键键值
#define KeyStopValue 2//停止键键值
#define KeyGoOnValue 3//继续键键值
#define KeyClearValue 4//清零键键值
uchar Sec=0,Min=0;//秒、分 寄存器
uchar bdata Flag=2;//标志位 寄存器
sbit T1sTimesUpFlag=Flag^0;//1s时间到标志位
sbit DisplayFlag=Flag^1;//显示(刷新)标志位
sbit ClockStartFlag=Flag^2;//时钟开始标志位
sbit ClearFlag=Flag^3;//清零(请求)标志位
void Timer0() interrupt 1//定时器0中断函数
{
static uchar t50ms;
TL0=tl0;
TH0=th0;
if(!ClearFlag)//无 清零请求
{
t50ms=++t50ms%T1sAt50msCount;//先对50ms计时变量加1,后对变量范围进行限制(0~19)(即对20取模)
if(!t50ms) T1sTimesUpFlag=TRUE;//若计时变量归0,表示计时变量曾经到达20(1s),则对1s计时标志位 置位
}
else//有 清零请求
{
t50ms=0;//清 50ms寄存器
ClearFlag=FALSE;//清 清零标志位
}
}
void Timer1() interrupt 3
{
static uchar t1ms;
TL1=tl1;
TH1=th1;
t1ms=++t1ms%DisTimeAt1msCount;//先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE;//若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
}
void TimerInit()
{
TMOD=0x11;//开启定时器0、定时器1,并都工作在模式1
TH0=th0;
TL0=tl0;
TR0=0;//未启动T0定时器 计时(上电时,秒表停止状态)
ET0=1;//允许定时器0中断
TH1=th1;
TL1=tl1;
TR1=1;//启动T1定时器 计时
ET1=1;//允许定时器1中断
EA=1;//开启系统中断功能
}
void TimesUpdata()//时间更新函数
{
if(T1sTimesUpFlag)//若 1s计时标志位 为 真,即 1s定时时间到
{
Sec=++Sec%60;//秒Sec在0-59范围内加1
if(!Sec) Min=++Min%60;//若秒Sec 重归0,则分Min在0-59范围内加1
//if(!Sec) Min=++Min%100;//分Min 计数范围0-99(与上一条语句2选1)
T1sTimesUpFlag=FALSE;//清 1s计时标志位
}
}
uchar KeyScan()
{
if(KeyStart && KeyStop && KeyGoOn && KeyClear) return NotKeyValue;//无按键按下,返回 无按键键值
if(!KeyStart) return KeyStartValue;//开始键按下,返回 开始键键值
if(!KeyStop) return KeyStopValue;//停止键按下,返回 停止键键值
if(!KeyGoOn) return KeyGoOnValue;//继续键按下,返回 继续键键值
if(!KeyClear) return KeyClearValue;//清零键按下,返回 清零键键值
return NotKeyValue;//误 *** 作,返回 无按键键值
}
void KeyResp()//按键响应函数
{
static uchar KeyValue;//定义静态变量 存储按键值,设置位
static bit KeyDownFlag,KeyReadyFlag;//定义静态变量 按键按下标志位,按键准备(响应)标志位
uchar key_value=KeyScan();//调用 按键扫描函数,并将扫描结果放在 key_value中
if(key_value!=NotKeyValue)//若扫描结果 有按键
{
KeyValue=key_value;//存储按键值
KeyDownFlag=TRUE;//按键按下标志位 置位
KeyReadyFlag=TRUE;//按键准备(响应)标志位 置位
}
else KeyDownFlag=FALSE;//若扫描结果 无按键,则 清 按键按下标志位
if(KeyReadyFlag && !KeyDownFlag)//若按键准备就绪,且无按键按下,则表示已松手情况
{
switch(KeyValue)//选择对应按键处理
{
case KeyStartValue://开始键 处理
TR0=1;//开启 时钟定时器
ClockStartFlag=TRUE;//置 时钟开始标志位
break;//开始键处理结束
case KeyStopValue://停止键 处理
TR0=0;//关闭时钟定时器
ClockStartFlag=FALSE;//清 时钟开始标志位
break;//停止键处理结束
case KeyGoOnValue://继续键 处理
TR0=1;//开启时钟定时器
ClockStartFlag=TRUE;//置 时钟开始标志位
break;//继续键处理结束
case KeyClearValue://清零键 处理
Sec=0;//清 秒
Min=0;//清 分
ClearFlag=TRUE;//置 清零标志位
break;//清零键处理结束
default:break;//其他键处理,无 *** 作
}
KeyValue=0;//清 按键值
KeyReadyFlag=FALSE;//清 按键准备(就绪)标志位
}
}
float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数
{
float sum;
if(x==0 && y==0) return;//0 的 0 次方无意义
else if(x==0) sum=0;//可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1;//除上述情况外,任何数的 0 次方均为 1
else if(y==1) sum=x;//任何数的 1 次方 均为 本身
else if(y>1) sum=Pow_Self(x,--y)x;//递归调用,降幂
return sum;//返回计算结果
}
void Display(uint dis_num)//显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca;//定义静态变量 显示位置
dis_loca=++dis_loca%SEG_Num;//先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff;//关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10];//将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
if(dis_loca==2) SEG_Data &=0x7f;//显示 小数点,用于区分 Min 跟 Sec
SEG_En|=1<<(SEG_Num-1-dis_loca);//开启本次需要显示的位驱动(高驱动)
}
void ClockDisplay()//时钟显示函数
{
if(DisplayFlag)//若 显示标志位 为 真
{
Display(Min100+Sec);//调用 显示函数,显示内容为:高2位显示 分Min,低2位显示 秒Sec
DisplayFlag=FALSE;//清 显示标志
}
}
void main()//主函数
{
TimerInit();//调用 定时器初始化函数
while(1)//循环系统
{
KeyResp();//调用 按键响应函数
TimesUpdata();//调用 时间更新函数
ClockDisplay();//调用 时钟显示函数
}
}
你的电路有点问题,稍微修改了一下,不过仿真无所谓了。
电路
代码参考如下:
#include<reg51h>#define SEG P0
#define BIT P2
#define KEYS P1
unsigned char disBuf[2];
unsigned char segCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
void Delay(unsigned int t)
{
while(t--);
}
void WriteLED()
{
static unsigned char currentBit;
SEG=0xFF;
BIT=1<<currentBit;
SEG=segCode[disBuf[currentBit]];
currentBit=++currentBit%2;
}
unsigned char ScanKeysboard()
{
unsigned char tk,k;
KEYS=0x0F;
tk=KEYS;
if(tk==0x0F) return 0;
switch(tk)
{
case 0x0E: k=1;break;
case 0x0D: k=2;break;
case 0x0B: k=3;break;
case 0x07: k=4;break;
}
KEYS=0xF0;
tk=KEYS;
switch(tk)
{
case 0xE0: k+=0;break;
case 0xD0: k+=4;break;
case 0xB0: k+=8;break;
case 0x70: k+=12;break;
default: k=0;break;
}
return k;
}
void main()
{
unsigned char newKeys,oldKeys;
disBuf[0]=disBuf[1]=16;
while(1)
{
newKeys=ScanKeysboard();
if(newKeys)
{
newKeys--;
if(newKeys^oldKeys)oldKeys=newKeys;
else
{
disBuf[0]=oldKeys/10;
disBuf[1]=oldKeys%10;
}
}
WriteLED();
Delay(500);
}
}
希望能满足你的需要!!!!
以上就是关于怎样给电路板上的芯片写入程序全部的内容,包括:怎样给电路板上的芯片写入程序、求SCT89C52秒表的c语言程序 电路如图,4位数码管中间点一直亮 左边分 右边秒11.0592晶振527205883@qq.com、c51单片机 程序编写 电路图已给出 请指导一下这道题该怎么编 急急急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)