『壹』 怎麼實現一個變數的每100毫秒的變化曲線
從你的敘述中我理解為:100mS采樣、比較都不是問題,PLC很容易實現。問題出在和上位機的通訊中。因為通訊周期不可能設定為100mS。我試過自由口通訊,為了保證通訊的可靠性,通訊周期通常需要500mS以上。這樣的話,必須保存每個通訊周期之間的數據。建議你建立一個表格,將數據依次插入,完成通訊任務後重新插入數據。由於通訊中斷的優先順序是最高的,程序中的時序關系一定要理順。
『貳』 單片機定時器T0100ms定時中斷,怎麼用C語言實現
void Init_Timer0(void)
{
TMOD &= 0xF0; /* clear Timer 0 */
TMOD |= 0x1;
TL0 = 0x0; /* value set by user */
TH0 = 0x0; /* value set by user */
ET0 = 1; /* IE.1*/
TR0 = 1; /* TCON.4 start timer */
// PT0 = 1;
}
『叄』 單片機,C語言寫的一小段程序,高手幫看看
這是一個簡單的流水燈實驗,前面的void delay(uint)是一個函數申明,你這一段裡面沒有給delay函數,給的程序不夠清晰。
如果是延遲100ms的話,delay函數應該是這樣的:
void delay(unsigned int x)
{
unsigned int i,j;
for( i =0;i < x;i++ )
{
for( j =0;j<3;j++ );
}
}
給定delay(100)即延遲100ms。
『肆』 51單片機C語言程序,利用定時器1控制LED燈每隔100ms亮一個,並且數碼管上的數每隔200ms加1,加到100清零
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar;
uchardistab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0到f
ucharnumber,dat,time;
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
number++;
if(number>1)number=0;
switch(number)
{
case0:P2=0x02;P0=distab[dat/10];
break;
case1:P2=0x01;P0=distab[dat%10];
break;
default:break;
}
}
voidt1isr()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time%2)P1=_crol_(P1,1);
if(time%4)dat++;
dat%=100;
}
main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time=0;
dat=0;
TR1=1;
ET1=1;
TR0=1;
ET0=1;
EA=1;
P1=0xfe;
while(1);
}
『伍』 在一個由80C51單片機與一片ADC0809組成的數據採集系統中,ADC0809的地址為7FF8H~7FFFFH,
樓主給的條件不足。
簡單編寫如下:
MOV DPTR, #7FF7H
MOV R0, #30H
MOV R2, #8
LP1:
MOVX @DPTR, A
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R2, LP1
MOV DPTR, #3000H
MOV R0, #30H
MOV R2, #8
LP2:
MOV A, @R0
MOVX @DPTR, A
INC DPTR
INC R0
DJNZ R2, LP2
SJMP $
END
『陸』 C語言,從0開始每隔一秒計數到100,用函數延遲執行,編碼怎麼寫
#include<stdio.h>
#include<windows.h>
int main(void)
{
int a;
for(a = 0; a <= 100; a++)
{
printf("%d\n",a);
sleep(1);
}
return 0;
}
有可能要把sleep裡面的1改成1000,跟你的環境有關,如果1是一閃而過你就換成1000
『柒』 C語言求編程教學
先貼代碼,有興趣的話可以看看下面的原理。
#include<reg52.h>
#defineCO_12_MHZ
/*
*Timing50milliseconds
*/
#defineTH_VALUE(0x3c)
#defineTL_VALUE(0xb0)
#if(definedCO_12_MHZ)
#defineTIME_3_SECOND(60)
#elif(definedCO_6_MHZ)
#defineTIME_3_SECOND(30)
#endif
sbitled=P0^0;
intflag=0;
voidtime_3_second(void)interrupt1{
TH0=TH_VALUE;/**/
TL0=TL_VALUE;/**/
if(++flag==TIME_3_SECOND){
led=~led;
flag=0;
}
}
intmain(void){
led=1;
TMOD=0x01;/*Selectionmode1*/
TH0=TH_VALUE;/*Settimeconstantforhigh8bit*/
TL0=TL_VALUE;/*Settimeconstantforlow8bit*/
TR0=1;/*StartupT0*/
ET0=1;/*EnableT0interrupt*/
EA=1;/*EnableCPUinterrupt*/
while(1);
return0;
}
根據公式 t = Tc * (2^L - TC), t為需要定時的時間,L是計數長度,根據選擇定時的模式而定,Tc為機器周期,所以Tc=12/Fosc, Fosc為晶振頻率,TC是需要求的值;那麼就有:
TC = 2^L - (Fosc * t)/12;
我的板子晶振為12Mhz,所以選擇模式1定時方式,最長定時時間為65.536ms,那麼一次定時顯然不夠,所以每次定時到了之後flag加1,直到flag等於60(s = 60 * 50ms)。如果晶振是6Mhz,也是一樣的方法計算,但是6Mhz的晶振在模式1下的最長定時時間為131.072ms。這里為了方便,如果晶振為6Mhz,那麼選擇定時100ms,這樣剛好TC都為0x3cb0。如果你的板子為6Mhz,那麼只需要把 #define CO_12_MHZ 改成 #define CO_6_MHZ 即可。有用請點一下採納,為了回答這個問題我又重新去翻以前的書來看。
『捌』 求單片機C語言程序,8個發光管來迴流動,第1個管亮100ms
走馬燈的程序到處是吧。給你貼一個杜洋的流水燈,自己參考著改。
/*********************************************************************************************
程序名: 8路流水燈
編寫人: 杜洋
編寫時間:2009年5月13日
硬體支持:STC12C2052內部RC或外部12MHZ晶振
介面說明:8個LED彩燈接P1口
修改日誌:
NO.1-2009年5月14日 在程序前面加入參數定義項
/*********************************************************************************************
說明:
根據參數設置產生流水LED效果。
/*********************************************************************************************/
#include <REG51.h> //51頭文件
/*********************************************************************************************/
#define DY_PORT P1 //設置LED連接的I/O組
#define DY_SPEED 100 //設置每一個明亮級的停留時間(值域:0~65535)
/*********************************************************************************************
bit [自定義名] ; //定義一個位(位的值只能是0或1)例:bit LED
#define [代替名] [原名] //用代替名代替原名(可以方便修改常改或調試的值)例:#define LED P1
sbit [自定義名] = [系統位名] ; //自定義系統位名。例:sbit Add_Key = P3 ^ 1;
unsigned char [自定義名] ; //定義一個0~255的整數變數.例:unsigned char a;
unsigned int [自定義名] ; //定義一個0~65535的整數變數
/*********************************************************************************************/
void delay (unsigned int a){ // 1ms延時程序
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);//STC單片機在外部晶振為12MHz時i值上限為600
} //AT89C51單片機在外部晶振為12MHz時i值上限為125
}
/*********************************************************************************************/
void main(void){
unsigned int i;
unsigned int temp;
while(1){
temp=0x01;
for(i=0;i<8;i++){ //8個流水燈逐個閃動
DY_PORT=~temp;
delay(DY_SPEED); //調用延時函數
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++){ //8個流水燈反向逐個閃動
DY_PORT=~temp;
delay(DY_SPEED); //調用延時函數
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++){ //8個流水燈依次全部點亮
DY_PORT=temp;
delay(DY_SPEED); //調用延時函數
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++){ //8個流水燈依次反向全部點亮
DY_PORT=temp;
delay(DY_SPEED); //調用延時函數
temp>>=1;
}
}
}
/*********************************************************************************************/
『玖』 簡單的51單片機問題
C語言程序如下
#include <reg51.h>
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼碼
uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位碼
uchar t0n;//T0定時中斷次數計數
void display(uchar x)//x顯示位
{
P2=disb[x];//輸出位碼
P0=tab[x+1];//輸出段碼
}
void main()
{
uchar x;
TMOD=0x01;
TH0 =0x3C;//晶振12M,定時100ms
TL0 =0xB0;
IE =0x82;
TR0 =1;
display(x);
while(1)
{
if(t0n>=2)//100ms到
{
t0n=0;
x++;
if(x>3)x=0;
display(x);
}
}
}
void T0_int() interrupt 1
{
TH0 =0x3C;
TL0 =0xB0;
t0n++;
}
模擬圖