作业
**
实际编程前画个流程图好还是写伪代码好
**
画图是真实业务抽象设计bai成程序模型的能力,这个du能力培养起zhi来,可以走架构的路dao。类图,可以把复杂的业务关系梳理成业务对象之间的关系,再抽象到程序设计上。时序图,可以把用户交互到服务端处理的完整调用链规划清楚,对于复杂的业务非常适用,还可以用这个时序图直接生成代码(EA)数据流,可以把业务对象之间的数据扭转关系梳理清楚,方便开发和沉淀产物。这些图,主要面向负责的业务逻辑或者技术难点。如果是简单的增删改,没啥复杂功能,是没有必要去画的,顶多就是画一个数据结构。再说说伪代码相较于画图的难度,伪代码可能更容易被入门程序员接受,因为比较具象了。每个方法级别输入输出,方法体内需要的逻辑设想好,写好就行。伪代码也是代码规划的一种,比较适合入门。但是缺点就是没办法从宏观交付看整体结构、成员之间的关系,设计产出的内容变动会比较频繁。
单片机c常用关键字,标识符详解
第一次作业
**第一次基础测试
题目:设计一个单片机程序,控制LED灯,每5s闪烁一次,每次点亮时间1s
完成要求:
(1)熟悉单片机(51或stm32)的基本配置,(2)会控制单片机端口的高低电平(3)同时会实用单片机内部的计时器中断进行计时(4)并且计时要求严格准确
提交时间:2020年7月14日21点前
```java
#include <reg52.h> //引入单片机头文件,频率是11.0592Mhz
#define unit unsigned int//无符号整形
#define uchar unsigned char//无符号字符型
sbit LED1=P2^0;//这里P一定要大写,发光二极管 led1 接 P1口 0 位端,用以控制 led1 的亮灭。sbit是定义特殊功能寄存器的位变量。
uchar num;
void main()
{
TMOD=0x01;//设置定时器0工作模式1,16位
TH0=(65536-45872)/256;//50ms
TL0=(66536-45872)%256;
LED1=0;
EA=1;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if(num==20)//20次,说明到了1秒
{LED1=1;//1秒后,灭
}
if(num==100)//100次,5秒
{
LED1=0;
num=0;
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(66536-45872)%256;
num++;
}
TH0=(65536-1000)/256;将先求括号内的差,然后取这个差的高八位(通过除以2的八次方得到,除以一次2相当于右移一位)
TL0=(65536-1000)%256;将先求括号内的差,然后取这个差的低八位,即低字节放入TL0
计数器初值的决定
第二次作业
题目:设计一个单片机程序,在单片机内部产生6个频点的正弦波
基础完成要求:
(1) 利用单片机产生6个频点的正弦波,频点要求分别是(1:do的频率为bai261.6HZ,2:re的频率为zhi293.6HZ,3:mi的频率为329.6HZ,4:fa的频率为349.2HZ,5:so的频率为392HZ,6:la的频率为440HZ,7:si的频率为493.8HZ),六个频点的幅度都可以自由控制和调节
(2) 选取合适的时钟频率,让产生的时钟偏差不超过5Hz
(3) 可以通过按键在以上几个频率的正弦波之间进行切换,按键每按下次,频率切换一次
(4) 可以通过按键改变频率输出的幅度
(5) 控制DA输出到各个频率的正弦波,并且验证相关频点的正弦波是否正确
提交时间:2020年7月25日21点前
高级完成要求:
利用产生的频率,去控制DA输出下面的这首曲子
准备:
目标:产生六个频点的正弦波
1正弦采样点,一共有256个点。通过DA转换bai输出信du号的。
用示波器看,就是正弦信号,其实是一种曲zhi线阶梯型的信号而已
2、
**
pwm
占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。占空比(Duty Ratio)在电信领域中有如下含义:例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。
Q: 如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序
如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序
如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序
https://zhidao.baidu.com/question/453041357.html?qbl=relate_question_0&word=%C8%E7%BA%CE%BF%D8%D6%C6DA%CA%E4%B3%F6%B5%BD%B8%F7%B8%F6%C6%B5%C2%CA%B5%C4%D5%FD%CF%D2%B2%A8%20%B3%CC%D0%F2
#include<reg52.h> //时钟周期是12Mhz
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P0//通用baiIO口,就是普通的输入输du出引zhi脚。,数码管连接P0口
#define GPIO_KEY P1//矩阵键盘用P1口。矩形按键控制数码管
uint i;
uint K;
uchar KeyValue; //用来存放读取到的键值
uint xiaoshu;
unsigned char code sin_tab[] = //正弦bai波输du出表zhi
{
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
};
sbit WRI=P3^4;
sbit CS=P3^5;
uint code TIME_US[] =
{15,13,12,11,10,9,8};//255个间隔。每个间隔对应的微秒数
void delay_1us(K) //1us延时函数
{uint i;
for(i=0;i<=K;i++)
_nop_(); //这一个语句表示1us延时
}
//DA转换
void DAConvert(uchar Data)//注意 这里的data 还没有给与
{
EA =0;
CS=1;
WRI=1;
delay_1us(2);
CS=0;
WRI=0;
P0=Data;
CS=1;
WRI=1;
EA = 1;
}
// 共阳极数码管编码
char code DSY_Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//0,1,2,3,4,5,6,7,8
//9,A,B,C,D,E,F,-
// 各音符对应的延时
uint code Tone_Delay_Table[] =
{ 63625,63883,64019,64104,64260,64400,64523,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178 }; //
sbit BEEP = P1^5; // 蜂鸣器
uchar KeyValue; // 按键序号
//共阳
uchar code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
while(i--);
}
void DelayMS(uchar x)
{
uchar i;
while ( x-- )
for(i = 0;i < 120; i++);
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
uint KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
}
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay(100);
a++;
}
return KeyValue;
}
uint fudu()
{
if(KeyValue<=6)//控制幅度
{xiaoshu=1;}
else if(KeyValue==7)
{
xiaoshu=0.75;
}
else if(KeyValue==8)
{
xiaoshu=0.5;
}
else if(KeyValue==9)
{xiaoshu=0.25;
}
return xiaoshu;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
//------------------------------------------------
// 定时器 0 中断程序,不同频率的声音由该中断产生
//------------------------------------------------
void Play_Tone() interrupt 1
{
TH0 = Tone_Delay_Table[ KeyValue ] / 256;
TL0 = Tone_Delay_Table[KeyValue ] % 256;
BEEP = ~BEEP;
}
//--------------------------------------------
// 主程序
//--------------------------------------------
void main()
{WRI=0;
CS=0;
P0 = 0x00; // 初始显示“ - ”
TMOD = 0x01;
IE = 0x82;
while(1)
{
P1 = 0xF0; // 发送扫描码
if (P1 != 0xF0) // 如果有键按下
{
KeyDown(); // 扫描键盘矩阵
if(KeyValue<=6)
{
GPIO_DIG=~smgduan[KeyValue];
}
P0 = DSY_Table[ KeyValue ]; // 显示按键
TR0 = 1; // 启动定时器,根据 KeyNo 发音
}
else
{
TR0 = 0; // 停止播放
}
DelayMS(2);
fudu();
if(xiaoshu!=1)
{KeyDown();
}
if(KeyValue<=6)//使只输出7个频率,其他键只用来
{
K=TIME_US[KeyValue];//注意顺序,回来检查 只包含0-6
}
for(i=0;i<256;i++)
{
DAConvert(sin_tab[i]*xiaoshu);
if(i==256)
{
i=0;
}
delay_1us(K); //控制正弦波每个点的输出时间以产生一定的频率
}
}
}
```bash
在这里插入代码片
来今天把第三次作业放到这里 ,开心的不得了,完成第三次的时候,我有了TEAM来帮忙,虽然一点都不专,不过他们能触类旁通。也算是帮到了我的忙。昨天看《三十而已》,看到王漫妮跳槽想找新的工作,可惜呀不如愿,无法再得到高薪,那个猎头说了一句话是真的一语中的,就是他们的工作都不具备不可替代性,哎,趁春光明媚,用全力去追,青春多宝贵,没机会,去浪费。好好体会。
第三次左右
@所有人
第三次题目:
题目:设计一个单片机程序,通过串口ASCII码表
基础完成要求:
(1) 熟练使用串口通信的接口
(2) 选择合适的波特兰进行串口通信
(3) 将ASCII码表进行编码
(4) 传输英语新概念2的第一课课文到另外一个单片机上
主要考察大家的串口通信和ASCII码表的编码
截止的时间是2020年8月1日下午六点
Q:通信串口.c(49): error C249: ‘DATA’: SEGMENT TOO LARGE
答:如果你bai定义的数组不用更改就用 uchar code XX[10]=
很长的一组 就加code
Q: error C247: non-address/-constant initializer
不能通过引用数组元素的方式给变量赋初值。
WORD J=TIME[I] 这个赋值语句可以加在程序里,而不是在变量声明时引用数组元素。
答:你这几个变量声明是外部变量,那么他们应该在别的程序头文件中定义过的。你看看是不是定义了。
Q:keil里面怎么加长长的字符串。
答:char str[ ] = “china”;
char str[ ] = {‘c’,‘h’,‘i’,‘n’,‘a’};
上面的两种形式都可以,结尾没有加上’\0’结束符,编译时编译器会默认帮我们加。
Q:怎么把句子等转成ASCLL码
答:
Q:有时候不适合把定义放在函数内,或循环里 为啥
Q:为啥卡住了呢,还有如果现实占用串口,拔掉再插上